创建有状态工作负载

本文档介绍了如何在 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 对象。

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

后续步骤