创建有状态工作负载

本页面介绍如何在 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 命令使用清单文件来创建、更新和删除集群中的资源。这是对象配置的声明方法。该方法可保留对活跃对象的写入,但不会将更改合并回到对象配置文件中。

如需创建 StatefulSet 和 Service 资源,请运行以下命令:

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_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
        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

在此示例中:

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

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