本页面介绍了如何在 Google Distributed Cloud (GDC) 气隙 Kubernetes 集群中创建和管理有状态工作负载。借助有状态工作负载,您可以利用永久性存储来扩缩应用部署。无论工作负载调度到何处,永久性存储都能为应用提供一致的身份和稳定的主机名。
本页面适用于应用运维人员群组中的开发者,他们负责为组织创建应用工作负载。如需了解详情,请参阅 GDC 气隙环境文档的受众群体。
准备工作
如需针对 Kubernetes 集群运行命令,请确保您拥有以下资源:
找到 Kubernetes 集群名称,或向平台管理员询问集群名称。
登录并生成 Kubernetes 集群的 kubeconfig 文件(如果您还没有)。
使用 Kubernetes 集群的 kubeconfig 路径替换这些说明中的
KUBERNETES_CLUSTER_KUBECONFIG
。
如需获得创建有状态工作负载所需的权限,请让您的组织 IAM 管理员向您授予项目命名空间中的 Namespace Admin 角色 (namespace-admin
)。
创建 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
。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
,其中包含三个复制的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
对象。
如需了解详情,请参阅配置容器存储。