本文档介绍了如何在 Google Distributed Cloud (GDC) 隔网 Kubernetes 集群中创建和管理有状态工作负载。有状态工作负载可让您通过永久性存储扩缩应用部署。无论工作负载调度到何处,永久性存储都能为应用提供一致的身份和稳定的主机名。
本文档适用于应用运维人员组中的开发者,他们负责为其组织创建应用工作负载。如需了解详情,请参阅 GDC 气隙环境文档的受众群体。
准备工作
如需完成本文档中的任务,您必须请求必要的权限并准备好环境。
申请 IAM 角色
您必须拥有特定角色,才能获得创建有状态工作负载所需的权限。您需要的角色取决于您是在组织范围的共享集群中工作,还是在项目范围的标准集群中工作。如需了解详情,请参阅 Kubernetes 集群配置。
共享集群角色
如需在共享集群中创建、删除、修改或查看有状态工作负载,请让您的 Project IAM Admin 为您授予 Namespace Admin (namespace-admin) 角色。此角色绑定到您的项目命名空间。
标准集群角色
如需在标准集群中创建、删除、修改或查看有状态工作负载,请让您的项目 IAM 管理员为您授予集群开发者 (cluster-developer) 角色。此角色绑定到您的项目命名空间。
准备环境
如需使用 API 对 Kubernetes 集群运行命令,请确保您拥有以下资源:
找到 Kubernetes 集群名称,或向平台管理员群组的成员询问集群名称。
登录并生成 Kubernetes 集群的 kubeconfig 文件。
使用 Kubernetes 集群的 kubeconfig 路径替换这些说明中的
KUBERNETES_CLUSTER_KUBECONFIG。
创建 StatefulSet 资源
通过编写 StatefulSet 清单并运行 kubectl apply 来创建 StatefulSet 对象。如需为客户端提供稳定的方法来向 StatefulSet 资源的 pod 发送请求,您还必须创建 Service 对象。
kubectl apply 命令使用清单文件来创建、更新和删除 Kubernetes 集群中的资源。这是对象配置的声明式方法。该方法可保留对活跃对象的写入,但不会将更改合并回到对象配置文件中。
如需创建 StatefulSet 和 Service 资源,请运行以下命令:
kubectl --kubeconfig KUBERNETES_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
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
替换以下内容:
KUBERNETES_CLUSTER_KUBECONFIG:您要将容器工作负载部署到的集群的 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。如需详细了解如何设置容器注册表路径,请参阅 托管 Harbor 服务概览。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
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,其中包含 3 个复制的Pod对象,如replicas: 3字段所设置的那样。 - 由部分
.spec.template设置的Pod模板表示其Pod对象标记为app: nginx。 - 由部分
.template.spec设置的Pod规范表明,StatefulSet的 Pod 运行一个容器nginx,该容器运行版本为1.23的nginx映像。 Pod规范使用由Service对象打开的网络端口。.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 对象。
如需了解详情,请参阅配置容器存储。