部署工作负载

本页介绍了在 Google Distributed Cloud Connected 硬件上部署工作负载的步骤,以及在配置工作负载时必须遵守的限制。

在完成这些步骤之前,您必须满足 Distributed Cloud Connected 安装 要求订购 Distributed Cloud 硬件

当 Google Distributed Cloud Connected 硬件到达您选择的 目的地时,它已预先配置了硬件 Google Cloud以及您在订购 Distributed Cloud Connected 时指定的 一些 网络设置。

Google 安装人员会完成物理安装,而您的系统管理员会将 Distributed Cloud Connected 连接到您的本地网络。

硬件连接到本地网络后,它会与 通信 Google Cloud ,以下载软件更新并与您的 Google Cloud 项目建立连接。然后,您就可以在 Distributed Cloud Connected 上预配节点池并部署工作负载了。

部署概览

如需在 Distributed Cloud Connected 硬件上部署工作负载,请完成以下步骤:

  1. 可选: 启用 Distributed Cloud Edge Network API

  2. 可选: 初始化 Distributed Cloud Connected 可用区的网络配置

  3. 可选: 配置 Distributed Cloud 网络

  4. 创建 Distributed Cloud Connected 集群

  5. 可选: 如果您想与 Cloud Key Management Service 集成,以便为本地存储启用客户管理的加密密钥 (CMEK) 支持,请为 您的工作负载数据启用 CMEK 支持。如需了解 Distributed Cloud Connected 如何加密工作负载数据,请参阅 本地存储安全性

  6. 创建节点池。 在此步骤中,您可以将节点分配给节点池,并可以选择将节点池配置为使用 Cloud KMS 来封装和解封 Linux 统一密钥设置 (LUKS) 密码,以加密工作负载数据。

  7. 获取集群的凭据 以测试集群。

  8. 通过在项目上为用户分配 Edge Container Viewer 角色 (roles/edgecontainer.viewer) 或 Edge Container Admin 角色 (roles/edgecontainer.admin),授予用户对集群的访问权限。

  9. 使用 RoleBindingClusterRoleBinding 为用户分配对集群资源的精细角色型访问权限。

  10. 可选: 启用 VM Runtime on Google Distributed Cloud 支持,以便在 Distributed Cloud Connected 上的虚拟机上运行工作负载

  11. 可选: 启用 GPU 支持,以便在 Distributed Cloud Connected上运行基于 GPU 的工作负载。

将 NGINX 负载均衡器部署为服务

以下示例说明了如何在 Distributed Cloud Connected 集群上部署 NGINX 服务器并将其公开为服务:

  1. 创建一个名为 nginx-deployment.yaml 的 YAML 文件,其中包含以下内容:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx
    labels:
      app: nginx
    spec:
    replicas: 1
    selector:
      matchLabels:
         app: nginx
    template:
      metadata:
         labels:
         app: nginx
      spec:
         containers:
         - name: nginx
         image: nginx:latest
         ports:
         - containerPort: 80
  2. 使用以下命令将 YAML 文件应用于集群:

    kubectl apply -f nginx-deployment.yaml
    
  3. 创建一个名为 nginx-service.yaml 的 YAML 文件,其中包含以下内容:

    apiVersion: v1
    kind: Service
    metadata:
    name: nginx-service
    spec:
    type: LoadBalancer
    selector:
      app: nginx
      ports:
         - protocol: TCP
           port: 8080
           targetPort: 80
  4. 使用以下命令将 YAML 文件应用于集群:

    kubectl apply -f nginx-deployment.yaml
    
  5. 使用以下命令获取 MetalLB 负载平衡器分配给服务的外部 IP 地址:

    kubectl get services
    

    该命令会返回类似于以下内容的输出:

    NAME            TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)          AGE
    nginx-service   LoadBalancer   10.51.195.25   10.100.68.104   8080:31966/TCP   11d
    

配置 NodeSystemConfigUpdate 资源

为集群中的每个节点配置 NodeSystemConfigUpdate 网络功能运算符资源,如下所示。

  1. 使用以下命令列出在目标集群的节点池中运行的节点:

    kubectl get nodes | grep -v master
    

    该命令会返回类似于以下内容的输出:

    NAME                                 STATUS   ROLES       AGE     VERSION
    pool-example-node-1-01-b2d82cc7      Ready    <none>      2d      v1.22.8-gke.200
    pool-example-node-1-02-52ddvfc9      Ready    <none>      2d      v1.22.8-gke.200
    

    记录返回的节点名称并推导出其简称。例如,对于 pool-example-node-1-01-b2d82cc7 节点,其简称为 node101

  2. 对于您在上一步中记录的每个节点,创建一个专用的 NodeSystemConfigUpdate 资源文件,其中包含以下内容:

    apiVersion: networking.gke.io/v1
    kind: NodeSystemConfigUpdate
    metadata:
    name: nodesystemconfigupdate-NODE_SHORT_NAME
    namespace: nf-operator
    spec:
    kubeletConfig:
      cpuManagerPolicy: Static
      topologyManagerPolicy: SingleNumaNode
    nodeName: NODE_NAME
    osConfig:
      hugePagesConfig:
         ONE_GB: 2
         TWO_MB: 0
      isolatedCpusPerSocket:
         "0": 40
         "1": 40
    sysctls:
      nodeLevel:
         net.core.rmem_max: "8388608"
         net.core.wmem_max: "8388608"

    替换以下内容:

    • NODE_NAME:目标节点的完整名称。例如,pool-example-node-1-01-b2d82cc7
    • NODE_SHORT_NAME:从目标节点的完整名称推导出的简称。例如,node101

    将每个文件命名为 node-system-config-update-NODE_SHORT_NAME.yaml

  3. 使用以下命令将每个 NodeSystemConfigUpdate 资源文件应用于集群:

    kubectl apply -f node-system-config-update-NODE_SHORT_NAME.yaml
    

    NODE_SHORT_NAME 替换为相应目标节点的简称。

    将资源应用于集群时,每个受影响的节点都会重启,这可能需要长达 30 分钟的时间。

    1. 监控受影响节点的状态,直到所有节点都成功重启:
    kubectl get nodes | grep -v master
    

    每个节点的状态都会在重启完成后从 not-ready 转换为 ready

为 Pod 配置映像缓存

您可以将在 Distributed Cloud Connected 集群上运行的 Pod 配置为缓存其映像。Pod 在首次从代码库中拉取映像后,便会开始使用缓存的映像。如果托管 Pod 的节点存储空间不足,则系统不会缓存新映像,并且会清除现有映像缓存,以确保工作负载继续不间断地运行。

您的 Pod 配置必须满足以下前提条件:

  • 您必须在 Pod 上设置 gdce.baremetal.cluster.gke.io/cache-image: true 标签。
  • 如果您使用的是私有映像代码库,则 ImagePullSecret 资源必须为 kubernetes.io/dockerconfigjson 类型。
  • 您必须将 Pod 的拉取政策设置为 IfNotPresent,以确保始终使用目标映像的缓存副本。如果本地没有缓存副本,则系统会从代码库中拉取映像。

以下示例说明了启用缓存的 Pod 配置:

apiVersion: v1
kind: Pod
metadata:
  name: cached-image-pod
  labels:
    gdce.baremetal.cluster.gke.io/cache-image: "true"
spec:
  containers:
    - name: my-container
      image: your-private-image-repo/your-image:tag
      imagePullPolicy: IfNotPresent
  imagePullSecrets:
    - name: my-image-secret  # If using a private registry

下一个示例说明了启用缓存的 Deployment 配置:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cached-image-deployment
spec:
  template:
    metadata:
      labels:
        gdce.baremetal.cluster.gke.io/cache-image: "true"
    spec:
      containers:
        - name: my-container
          image: your-private-image-repo/your-image:tag
          imagePullPolicy: IfNotPresent
      imagePullSecrets:
        - name: my-image-secret  # If using a private registry

Distributed Cloud 工作负载的限制

配置 Distributed Cloud Connected 工作负载时,您必须遵守本部分中所述的限制。Distributed Cloud Connected 会对您在 Distributed Cloud Connected 硬件上部署的所有工作负载强制执行这些限制。

Linux 工作负载限制

Distributed Cloud Connected 仅支持以下 工作负载的 Linux 功能

  • AUDIT_READ
  • AUDIT_WRITE
  • CHOWN
  • DAC_OVERRIDE
  • FOWNER
  • FSETID
  • IPC_LOCK
  • IPC_OWNER
  • KILL
  • MKNOD
  • NET_ADMIN
  • NET_BIND_SERVICE
  • NET_RAW
  • SETFCAP
  • SETGID
  • SETPCAP
  • SETUID
  • SYS_CHROOT
  • SYS_NICE
  • SYS_PACCT
  • SYS_PTRACE
  • SYS_RESOURCE
  • SYS_TIME

命名空间限制

Distributed Cloud Connected 不支持以下命名空间:

  • hostPID
  • hostIPC
  • hostNetwork

资源类型限制

Distributed Cloud Connected 不支持 CertificateSigningRequest 资源类型,该类型允许客户端根据签名请求请求颁发 X.509 证书。

安全上下文限制

Distributed Cloud Connected 不支持特权模式安全上下文。

Pod 绑定限制

Distributed Cloud Connected 不支持在 HostNetwork 命名空间中将 Pod 绑定到主机端口。此外,HostNetwork 命名空间不可用。

hostPath 卷限制

Distributed Cloud Connected 仅允许以下具有读写权限的 hostPath 卷:

  • /dev/hugepages
  • /dev/infiniband
  • /dev/vfio
  • /dev/char
  • /sys/devices

PersistentVolumeClaim 资源类型限制

Distributed Cloud Connected 仅允许以下 PersistentVolumeClaim 资源类型:

  • csi
  • nfs
  • local

卷类型限制

Distributed Cloud Connected 仅允许以下卷类型:

  • configMap
  • csi
  • downwardAPI
  • emptyDir
  • hostPath
  • nfs
  • persistentVolumeClaim
  • projected
  • secret

Pod 容忍限制

Distributed Cloud Connected 不允许在控制平面节点上创建用户创建的 Pod。具体而言,Distributed Cloud Connected 不允许调度具有以下容忍键的 Pod:

  • ""
  • node-role.kubernetes.io/master
  • node-role.kubernetes.io/control-plane

模拟限制

Distributed Cloud Connected 不支持用户或群组模拟。

管理命名空间限制

Distributed Cloud Connected 不允许访问以下命名空间:

  • ai-system
  • ai-speech-system
  • ai-ocr-system
  • ai-translation-system
  • anthos-identity-service
  • cert-manager
  • dataproc-system
  • dataproc-PROJECT_ID
  • dns-system
  • g-istio-system
  • gke-connect
  • gke-managed-metrics-server
  • gke-operators
  • g-ospf-servicecontrol-system
  • g-ospf-system
  • g-pspf-system
  • gke-system
  • gpc-backup-system
  • iam-system
  • kube-node-lease
  • kube-public
  • kube-system,但删除 ippools.whereabouts.cni.cncf.io 除外
  • metallb-system ,但修改 configMap 资源以设置负载均衡 IP 地址范围除外
  • nf-operator
  • oclcm-system
  • prediction
  • rm-system
  • robinio
  • saas-system
  • vm-system

PROJECT_ID 表示目标 Google Cloud 项目的 ID。

避免使用名称中带有 g- 前缀的任何命名空间。此类命名空间通常是 Distributed Cloud Connected 使用的预留命名空间。

Webhook 限制

Distributed Cloud Connected 对 Webhook 的限制如下:

  • 您创建的任何变更 Webhook 都会自动排除 kube-system 命名空间。
  • 以下资源类型停用了变更 Webhook:
    • nodes
    • persistentvolumes
    • certificatesigningrequests
    • tokenreviews

Pod 优先级限制

Distributed Cloud Connected 要求您将工作负载 Pod 的优先级设置为低于 500000000 的值。

为 Pod 配置运行时类

借助 Distributed Cloud Connected,您可以使用 runtimeClassName 字段在 Pod 的配置中指定其运行时类。这会替换在集群级别指定的默认运行时类。可用的运行时类为 runcgvisor。 例如:

apiVersion: v1
kind: Pod
metadata:
  name: myPod
spec:
  runtimeClassName: gvisor
  containers:
  - name: myPod
    image: myPodImage
  restartPolicy: OnFailure

如果您在 Pod 配置中省略此项,则 Pod 会使用在集群级别指定的类。 默认的集群级运行时类为 runc,除非您配置默认运行时类 使用 --default-container-runtime 参数,如 创建和管理集群中所述。

如果您在 Pod 级别或集群级别更改运行时类,则必须重启受影响的 Pod,更改才会生效。

gvisor 运行时类

指定 gvisor 运行时类会将 Pod 切换到基于 gVisor 的开放容器倡议 (OCI) 安全运行时 。gVisor 是一种沙盒解决方案,可在工作负载及其主机之间引入 强大的隔离。

配置 VPC Service Controls 集成

完成本部分中的步骤,以配置 Distributed Cloud Edge Container API 与 VPC Service Controls 的集成。如需了解详情,请参阅以下内容:

必需的出站规则

您必须配置本部分中所述的出站规则,才能将 Distributed Cloud Edge Container API 与 VPC Service Controls 集成。如需了解出站规则语法,请参阅 出站规则参考

访问机器可用区和 Google Cloud 项目

此规则允许调用方身份在使用 Distributed Cloud Edge Container API 进行调用时访问机器可用区和 Google Cloud 项目。当机器和集群不在同一 Google Cloud 项目中,并且机器 Google Cloud 项目位于边界之外时,此规则适用。如果您使用 VPC Service Controls 在边界内限制了 Distributed Cloud Edge Container API,则需要此规则。

以下是 JSON 格式的此规则的 egressFrom 配置示例:

egressFrom:
  identityType: ANY_SERVICE_ACCOUNT
  sources:
    - accessLevel: "*"

以下是此规则的 egressTo 配置示例:

egressTo:
 resources:
 - "projects/280968151686"
 operations:
   - serviceName: "edgecontainer.googleapis.com"
     methodSelectors:
       - method: "*"

必需的入站规则

您必须配置本部分中所述的入站规则,才能将 Distributed Cloud Edge Container API 与 VPC Service Controls 集成。如需了解入站规则语法,请参阅 入站规则参考

访问 Distributed Cloud Edge Container API

此规则允许特定身份访问 Distributed Cloud Edge Container API 并与之互动。 如果您使用 VPC Service Controls 在边界内限制了 Distributed Cloud Edge Container API,并且调用 Distributed Cloud Edge Container API 的身份位于边界之外,则必须配置此规则。

以下是此规则的 ingressFrom 配置示例:

ingressFrom:
   sources:
     - accessLevel: '*'
   identities:
     - serviceAccount:testuser@kubernetesedge-e2e-testing.iam.gserviceaccount.com

以下是此规则的 ingressTo 配置示例:

ingressTo:
 resources:
 - "*"
 operations:
   - serviceName: "edgecontainer.googleapis.com"
     methodSelectors:
       - method: "*"

访问 Connect API 和 Security Token Service API

此规则允许工作负载访问 Connect API 和 Security Token Service API。 如果您使用 VPC Service Controls 在边界内限制了对 Connect API 和 Security Token Service API 的访问权限,则必须配置此规则。如需了解如何在 IP 地址级别设置访问政策,请参阅 IP 地址

以下是此规则的 ingressFrom 配置示例:

- ingressFrom:
   identityType: ANY_IDENTITY
   sources:
     - accessLevel: "accessPolicies/100637171436/accessLevels/fwi"

以下是此规则的 ingressTo 配置示例:

ingressTo:
   resources:
   - "*"
   operations:
     - serviceName: "gkeconnect.googleapis.com"
       methodSelectors:
         - method: "*"
     - serviceName: "sts.googleapis.com"
       methodSelectors:
         - method: "*"

后续步骤