创建有状态工作负载

本页面介绍了如何在 Google Distributed Cloud (GDC) 气隙 Kubernetes 集群中创建和管理有状态工作负载。借助有状态工作负载,您可以利用永久性存储来扩缩应用部署。无论工作负载调度到何处,永久性存储都能为应用提供一致的身份和稳定的主机名。

本页面适用于应用运维人员群组中的开发者,他们负责为组织创建应用工作负载。如需了解详情,请参阅 GDC 气隙环境文档的受众群体

准备工作

如需针对 Kubernetes 集群运行命令,请确保您拥有以下资源:

  1. 找到 Kubernetes 集群名称,或向平台管理员询问集群名称。

  2. 登录并生成 Kubernetes 集群的 kubeconfig 文件(如果您还没有)。

  3. 使用 Kubernetes 集群的 kubeconfig 路径替换这些说明中的 KUBERNETES_CLUSTER_KUBECONFIG

如需获得创建有状态工作负载所需的权限,请让您的组织 IAM 管理员向您授予项目命名空间中的 Namespace Admin 角色 (namespace-admin)。

创建 StatefulSet 资源

通过编写 StatefulSet 清单并运行 kubectl apply 来创建资源,从而创建 StatefulSet 对象。为了让客户端能够以稳定的方式向 StatefulSet 资源的 pod 发送请求,您还必须创建 Service 对象。

kubectl apply 命令使用清单文件来创建、更新和删除 Kubernetes 集群中的资源。这是对象配置的声明式方法。该方法可保留对活跃对象的写入,但不会将更改合并回到对象配置文件中。

如需创建 StatefulSetService 资源,请运行:

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_NAMEService 对象的名称。 确保 StatefulSet 对象还在其 serviceName 中设置了 Service 对象。

  • APP_NAME:要在部署中运行的应用的名称。

  • APP_LABEL_NAME:用于确定哪些 pod 属于 StatefulSet 对象的标签选择器。

  • STATEFULSET_NAMEStatefulSet 对象的名称。

  • 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

在此示例中:

  • 创建了一个名为 nginxService 对象,由 metadata: name 字段指示。Service 对象定位一个名为 nginx 的应用,由 labels.app: nginxselector.app: nginx 指示。Service 对象会公开端口 80 并将其命名为 web。此 Service 对象控制网域并将互联网流量路由到 StatefulSet 对象部署的容器化应用。
  • 创建了一个名为 webStatefulSet,其中包含三个复制的 Pod 对象,如字段 replicas: 3 所设置。
  • 由部分 .spec.template 设置的 Pod 模板表示其 Pod 对象标记为 app: nginx
  • .template.spec 部分设置的 Pod 规范指示 StatefulSet 的 pod 运行一个容器 nginx,该容器运行版本为 1.23nginx 映像。
  • Pod 规范使用由 Service 对象打开的 Web 端口。
  • .template.spec.volumeMounts 部分指定一个名为 wwwmountPath 字段。mountPath 是容器中装载存储卷的路径。
  • StatefulSet 预配了三个 PersistentVolumeClaim 对象,分别命名为 web-www-0web-www-1web-www-2,每个对象都具有 1 GB 的预配存储空间。

创建后,StatefulSet 会确保所需数量的 Pod 对象正在运行并且始终可用。StatefulSet 会自动替换失败或被逐出其节点的 Pod 对象,并将新 Pod 对象与存储资源、资源请求和限制以及 StatefulSet 对象的 Pod 规范中定义的其他配置相关联。

StatefulSet 资源中请求永久性存储空间

永久性存储空间可动态预配,因此可按需创建底层卷。应用可以通过 PersistentVolumeClaim 对象请求永久性存储空间。

通常,除了创建 Pod 对象之外,您还必须创建 PersistentVolumeClaim 对象。不过,StatefulSet 对象包含一个 volumeClaimTemplates 数组,用于生成 PersistentVolumeClaim 对象。每个 StatefulSet 副本都有自己的 PersistentVolumeClaim 对象。

如需了解详情,请参阅配置容器存储