本页面介绍了如何在 Google Distributed Cloud (GDC) 气隙设备 Kubernetes 集群中创建和管理有状态工作负载。借助有状态工作负载,您可以利用永久性存储来扩缩应用部署。无论工作负载调度到何处,永久性存储都能为应用提供一致的身份和稳定的主机名。
本页面适用于应用运维人员群组中的开发者,他们负责为组织创建应用工作负载。
准备工作
如需针对预配置的裸金属 Kubernetes 集群运行命令,请确保您拥有以下资源:
找到 Kubernetes 集群名称,或向平台管理员询问集群名称。
登录并生成 Kubernetes 集群的 kubeconfig 文件(如果您还没有)。
使用 Kubernetes 集群的 kubeconfig 路径替换这些说明中的
CLUSTER_KUBECONFIG。
如需获得创建有状态工作负载所需的权限,请让您的组织 IAM 管理员向您授予项目命名空间中的 Namespace Admin 角色 (namespace-admin)。
创建 StatefulSet 资源
通过编写 StatefulSet 清单并运行 kubectl apply 来创建资源,从而创建 StatefulSet 对象。如需为客户端提供稳定的方法来向 StatefulSet 资源的 pod 发送请求,您还必须创建 Service 对象。
kubectl apply 命令使用清单文件来创建、更新和删除集群中的资源。这是对象配置的声明式方法。该方法可保留对活跃对象的写入,但不会将更改合并回到对象配置文件中。
如需创建 StatefulSet 和 Service 资源,请运行:
kubectl --kubeconfig CLUSTER_KUBECONFIG -n NAMESPACE \
apply -f - <<EOF
apiVersion: v1
kind: Service
metadata:
name: SERVICE_NAME
labels:
app: APP_NAME
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: APP_NAME
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: STATEFULSET_NAME
spec:
selector:
matchLabels:
app: APP_LABEL_NAME
serviceName: "SERVICE_NAME"
replicas: NUMBER_OF_REPLICAS
template:
metadata:
labels:
app: APP_LABEL_NAME
spec:
terminationGracePeriodSeconds: 10
containers:
- name: CONTAINER_NAME
image: CONTAINER_IMAGE
resources:
requests:
nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE: 1
limits:
nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE: 1
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: CONTAINER_STORAGE_VOLUME_PATH
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
EOF
替换以下内容:
CLUSTER_KUBECONFIG:您要将容器工作负载部署到的 Kubernetes 集群的 kubeconfig 文件。NAMESPACE:用于部署容器工作负载的项目命名空间。SERVICE_NAME:Service对象的名称。 确保StatefulSet对象还在其serviceName中设置了Service对象。APP_NAME:要在部署中运行的应用的名称。APP_LABEL_NAME:用于确定哪些 pod 属于StatefulSet对象的标签选择器。STATEFULSET_NAME:StatefulSet对象的名称。NUMBER_OF_REPLICAS:部署管理的复制Pod对象的数量。CONTAINER_NAME:容器的名称。CONTAINER_IMAGE:容器映像的名称。您必须提供容器注册表路径和映像版本,例如REGISTRY_PATH/nginx:1.23。如需详细了解如何设置容器注册表路径,请参阅 Managed Harbor Service 概览。CONTAINER_STORAGE_VOLUME_PATH:容器中装载存储卷的路径。
例如,以下 StatefulSet 对象和相应的 Service 对象会创建有状态容器工作负载:
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx
serviceName: "nginx"
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: REGISTRY_PATH/nginx:1.23
resources:
requests:
nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE: 1
limits:
nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE: 1
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
在此示例中:
- 创建了一个名为
nginx的Service对象,由metadata: name字段指示。Service对象定位一个名为nginx的应用,由labels.app: nginx和selector.app: nginx指示。Service对象会公开端口 80 并将其命名为web。此Service对象控制网域并将互联网流量路由到StatefulSet对象部署的容器化应用。 - 创建了一个名为
web的StatefulSet,其中包含三个复制的Pod对象,如字段replicas: 3所设置。 - 由部分
.spec.template设置的Pod模板表示其Pod对象标记为app: nginx。 - 由
.template.spec部分设置的Pod规范指示StatefulSet的 pod 运行一个容器nginx,该容器运行版本为1.23的nginx映像。 Pod规范使用由Service对象打开的 Web 端口。.template.spec.volumeMounts部分指定一个名为www的mountPath字段。mountPath是容器中装载存储卷的路径。StatefulSet预配了三个PersistentVolumeClaim对象,分别命名为web-www-0、web-www-1和web-www-2,每个对象都具有 1 GB 的预配存储空间。
创建后,StatefulSet 会确保所选数量的 Pod 对象始终处于运行状态且可用。StatefulSet 会自动替换失败或被逐出其节点的 Pod 对象,并将新 Pod 对象与存储资源、资源请求和限制以及 StatefulSet 对象的 Pod 规范中定义的其他配置相关联。
在 StatefulSet 资源中请求永久性存储空间
永久性存储空间可动态预配,因此可按需创建底层卷。应用可以通过 PersistentVolumeClaim 对象请求永久性存储空间。
通常,除了创建 Pod 对象之外,您还必须创建 PersistentVolumeClaim 对象。不过,StatefulSet 对象包含一个 volumeClaimTemplates 数组,用于生成 PersistentVolumeClaim 对象。每个 StatefulSet 副本都有自己的 PersistentVolumeClaim 对象。
如需了解详情,请参阅配置容器存储。