创建有状态工作负载

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

本页面适用于应用运维人员组内的开发者,他们负责为其组织创建应用工作负载。

准备工作

如需完成本文档中的任务,您必须请求必要的权限并准备好环境。

请求 IAM 角色

如需在 Kubernetes 集群中创建、删除、修改或查看有状态工作负载,请让 组织 IAM 管理员向您授予 Namespace Admin (namespace-admin) 角色。此角色绑定到您的项目命名空间。

准备环境

如需针对预配置的裸金属 Kubernetes 集群运行命令,请确保您拥有以下资源:

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

  2. 如果您没有 Kubernetes 集群的 kubeconfig 文件,请登录并生成该文件。

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

创建 StatefulSet 资源

如需创建 StatefulSet 对象,请编写 StatefulSet 清单并运行 kubectl apply 以创建资源。如需为客户端提供一种稳定的方式来向 StatefulSet 资源的 pod 发送请求,您还必须创建 Service 对象。

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

如需创建 StatefulSetService 资源,请运行以下命令:

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_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。如需详细了解如何设置容器注册表路径,请参阅 托管 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
        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

在此示例中:

  • 创建了一个名为 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 对象打开的网络端口。
  • .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 对象。

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