部署工作負載

本頁面說明在 Google Distributed Cloud 連線硬體上部署工作負載的步驟,以及設定工作負載時必須遵守的限制。

完成這些步驟前,請先符合 Distributed Cloud 連線安裝需求,並訂購 Distributed Cloud 硬體

Google Distributed Cloud 連結網路方案硬體送達指定目的地時,已預先設定硬體 Google Cloud和部分網路設定,這些設定是在您訂購 Distributed Cloud 連結網路方案時指定。

Google 安裝人員會完成實體安裝作業,而系統管理員則會將 Distributed Cloud Connected 連線至本機網路。

硬體連上區域網路後,就會與 Google Cloud 通訊,下載軟體更新並連上Google Cloud 專案。接著,您就可以在 Distributed Cloud connected 上佈建節點集區及部署工作負載。

部署作業總覽

如要在 Distributed Cloud 連線硬體上部署工作負載,請完成下列步驟:

  1. 選用: 啟用 Distributed Cloud Edge Network API

  2. 選用步驟: 初始化 Distributed Cloud connected 可用區的網路設定

  3. 選用: 設定 Distributed Cloud 網路

  4. 建立 Distributed Cloud 連結叢集

  5. 選用: 為本機儲存空間啟用客戶自行管理的加密金鑰 (CMEK) 支援: 如要與 Cloud Key Management Service 整合,為工作負載資料啟用 CMEK 支援,請執行這項操作。如要瞭解 Distributed Cloud connected 如何加密工作負載資料,請參閱「本機儲存空間安全性」。

  6. 建立節點集區。 在這個步驟中,您會將節點指派給節點集區,並視需要將節點集區設定為使用 Cloud KMS,包裝及解除包裝 Linux Unified Key Setup (LUKS) 密碼片語,以加密工作負載資料。

  7. 取得叢集憑證,測試叢集。

  8. 在專案中為使用者指派 Edge Container 檢視者角色 (roles/edgecontainer.viewer) 或 Edge Container 管理員角色 (roles/edgecontainer.admin),授予使用者叢集存取權。

  9. 使用 RoleBindingClusterRoleBinding,為使用者指派叢集資源的精細角色型存取權

  10. 選用: 啟用 Google Distributed Cloud 支援的 VM 執行階段,在 Distributed Cloud connected 的虛擬機器上執行工作負載

  11. 選用: 啟用 GPU 支援,在 Distributed Cloud connected 上執行 GPU 工作負載

  12. 選用:將 Distributed Cloud connected 叢集連線至 Google Cloud:

    1. 建立與 Google Cloud 專案的 VPN 連線

    2. 確認 VPN 連線是否正常運作

  13. 選用:設定 Private Google Access,讓 Pod 透過 Cloud VPN 存取Google Cloud API 和服務

  14. 選用:設定 Private Service Connect,讓 Pod 透過 Cloud VPN 存取Google Cloud API 和服務

將 NGINX 負載平衡器部署為服務

下列範例說明如何部署 NGINX 伺服器,並在 Distributed Cloud 連線叢集上將其公開為服務:

  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
    

部署具有 SR-IOV 函式的容器

以下範例說明如何部署 Pod,以使用 Distributed Cloud Connected 的 SR-IOV 網路功能運算子功能。

建立 Distributed Cloud 網路元件

請按照下列步驟,為 Distributed Cloud connected 部署作業建立必要的網路元件。如要進一步瞭解這些元件,請參閱「Distributed Cloud connected 網路功能」。

  1. 建立網路:

    gcloud edge-cloud networking networks create NETWORK_NAME \
        --location=REGION \
        --zone=ZONE_NAME \
        --mtu=MTU_SIZE
    

    更改下列內容:

    • NETWORK_NAME:可明確識別這個網路的說明名稱。
    • REGION:目標 Distributed Cloud 區域所屬的 Google Cloud 區域。
    • ZONE_NAME:目標 Distributed Cloud 連結區域的名稱。
    • MTU_SIZE:這個網路的最大傳輸單位 (MTU) 大小。有效值為 1500 和 9000。這個值必須與 default 網路的 MTU 大小相符,且所有網路都必須使用相同的值。
  2. 建立子網路:

    gcloud edge-cloud networking subnets create SUBNETWORK_NAME \
        --network=NETWORK_NAME \
        --ipv4-range=IPV4_RANGE \
        --vlan-id=VLAN_ID \
        --location=REGION \
        --zone=ZONE_NAME
    

    更改下列內容:

    • SUBNETWORK_NAME:可清楚識別這個子網路的專屬名稱。
    • NETWORK_NAME:封裝這個子網路的網路。
    • IPV4_RANGE:這個子網路涵蓋的 IPv4 位址範圍,格式為 IP 位址/前置字元。
    • VLAN_ID:此子網路的目標 VLAN ID。
    • REGION:目標 Distributed Cloud connected 區域所屬的 Google Cloud 區域。
    • ZONE_NAME:目標 Distributed Cloud 連結區域的名稱。
  3. 監控子網路的狀態,直到成功建立為止:

    watch -n 30 'gcloud edge-cloud networking subnets list \
        --location=REGION \
        --zone=ZONE_NAME
    

    更改下列內容:

    • REGION:目標 Distributed Cloud connected 區域所屬的 Google Cloud 區域。
    • ZONE_NAME:目標 Distributed Cloud 連結區域的名稱。

    狀態會從 PENDING 變為 PROVISIONING,最後變為 RUNNING

    記錄 CIDR 區塊的 VLAN ID、子網路 CIDR 區塊和閘道 IP 位址。您會在後續步驟中使用這些值。

設定 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

為 SR-IOV 網路功能設定 ToR 交換器

按照本節的步驟,在 Distributed Cloud 連接機架中,為每個 Distributed Cloud ToR 交換器設定網路介面,以執行 SR-IOV 網路功能。

  1. 建立名為 mlnc6-pcie1-tor1-sriov.yaml 的檔案,並在其中加入下列內容。這個檔案會設定第一個 ToR 交換器上的第一個網路介面。

      apiVersion: sriovnetwork.k8s.cni.cncf.io/v1
      kind: SriovNetworkNodePolicy
      metadata:
      name: mlnx6-pcie1-tor1-sriov
      namespace: sriov-network-operator
      spec:
      deviceType: netdevice
      isRdma: false
      linkType: eth
      mtu: 9000
      nicSelector:
         pfNames:
         - enp59s0f0np0
      nodeSelector:
         edgecontainer.googleapis.com/network-sriov.capable: "true"
      numVfs: 31
      priority: 99
      resourceName: mlnx6_pcie1_tor1_sriov
  2. 建立名為 mlnc6-pcie1-tor2-sriov.yaml 的檔案,並在其中加入下列內容。這個檔案會設定第一個 ToR 交換器上的第二個網路介面。

      apiVersion: sriovnetwork.k8s.cni.cncf.io/v1
      kind: SriovNetworkNodePolicy
      metadata:
      name: mlnx6-pcie1-tor2-sriov
      namespace: sriov-network-operator
      spec:
      deviceType: netdevice
      isRdma: false
      linkType: eth
      mtu: 9000
      nicSelector:
         pfNames:
         - enp59s0f1np1
      nodeSelector:
         edgecontainer.googleapis.com/network-sriov.capable: "true"
      numVfs: 31
      priority: 99
      resourceName: mlnx6_pcie1_tor2_sriov
  3. 建立名為 mlnc6-pcie2-tor1-sriov.yaml 的檔案,並在其中加入下列內容。這個檔案會設定第二個 ToR 交換器上的第一個網路介面。

      apiVersion: sriovnetwork.k8s.cni.cncf.io/v1
      kind: SriovNetworkNodePolicy
      metadata:
      name: mlnx6-pcie2-tor1-sriov
      namespace: sriov-network-operator
      spec:
      deviceType: netdevice
      isRdma: false
      linkType: eth
      mtu: 9000
      nicSelector:
         pfNames:
         - enp216s0f0np0
      nodeSelector:
         edgecontainer.googleapis.com/network-sriov.capable: "true"
      numVfs: 31
      priority: 99
      resourceName: mlnx6_pcie2_tor1_sriov
  4. 建立名為 mlnc6-pcie2-tor2-sriov.yaml 的檔案,並在其中加入下列內容。這個檔案會設定第二個 ToR 交換器上的第二個網路介面。

      apiVersion: sriovnetwork.k8s.cni.cncf.io/v1
      kind: SriovNetworkNodePolicy
      metadata:
      name: mlnx6-pcie2-tor2-sriov
      namespace: sriov-network-operator
      spec:
      deviceType: netdevice
      isRdma: false
      linkType: eth
      mtu: 9000
      nicSelector:
         pfNames:
         - enp216s0f1np1
      nodeSelector:
         edgecontainer.googleapis.com/network-sriov.capable: "true"
      numVfs: 31
      priority: 99
      resourceName: mlnx6_pcie2_tor2_sriov
  5. 使用下列指令,將 ToR 設定檔套用至叢集:

    kubectl apply -f mlnc6-pcie1-tor1-sriov.yaml
    kubectl apply -f mlnc6-pcie1-tor2-sriov.yaml
    kubectl apply -f mlnc6-pcie2-tor1-sriov.yaml
    kubectl apply -f mlnc6-pcie2-tor2-sriov.yaml
    

    受影響的節點會被封鎖、清空並重新啟動。

  6. 使用下列指令監控節點狀態:

    watch -n 5 'kubectl get sriovnetworknodestates -o yaml -A | \ 
    grep "syncStatus\|pool-"|sed "N;s/\n/ /"'
    

    當所有受影響的節點都顯示 syncStatus: Succeeded 時,請按下 Ctrl+C 鍵,結束監控指令迴圈。

    指令會傳回類似以下的輸出內容,表示 ToR 交換器已啟用 SR-IOV 網路功能:

    Allocated resources:
    (Total limits may be over 100 percent, i.e., overcommitted.)
    Resource                       Requests     Limits
    --------                       --------     ------
    cpu                            2520m (3%)   7310m (9%)
    memory                         3044Mi (1%)  9774Mi (3%)
    ephemeral-storage              0 (0%)       0 (0%)
    hugepages-1Gi                  0 (0%)       0 (0%)
    hugepages-2Mi                  0 (0%)       0 (0%)
    devices.kubevirt.io/kvm        0            0
    devices.kubevirt.io/tun        0            0
    devices.kubevirt.io/vhost-net  0            0
    gke.io/mlnx6_pcie1_tor1_sriov  3            3
    gke.io/mlnx6_pcie1_tor2_sriov  0            0
    gke.io/mlnx6_pcie2_tor1_sriov  0            0
    gke.io/mlnx6_pcie2_tor2_sriov  0            0
    

設定 NetworkAttachmentDefinition 資源

為叢集設定 NetworkAttachmentDefinition 資源,步驟如下:

  1. 建立名為 network-attachment-definition.yaml 的檔案,並在當中加入下列內容:

    apiVersion: "k8s.cni.cncf.io/v1"
    kind: NetworkAttachmentDefinition
    metadata:
    name: sriov-net1
    annotations:
      k8s.v1.cni.cncf.io/resourceName: gke.io/mlnx6_pcie1_tor1_sriov
    spec:
    config: '{
    "type": "sriov",
    "cniVersion": "0.3.1",
    "vlan": VLAN_ID,
    "name": "sriov-network",
    "ipam": {
      "type": "host-local",
      "subnet": "SUBNETWORK_CIDR",
      "routes": [{
         "dst": "0.0.0.0/0"
      }],
      "gateway": "GATEWAY_ADDRESS"
    }
    }'

更改下列內容:

  • VLAN_ID:您在本指南稍早建立的子網路 VLAN ID。
  • SUBNETWORK_CIDR:子網路的 CIDR 區塊。
  • GATEWAY_ADDRESS:子網路的閘道 IP 位址。
  1. 使用下列指令將資源套用至叢集:

    kubectl apply -f network-attachment-definition.yaml
    

部署具有 SR-IOV 網路功能的 Pod

請完成本節中的步驟,在叢集上部署具有 SR-IOV 網路功能的 Pod。Pod 設定檔中的 annotations 欄位會指定您在本指南稍早建立的 NetworkAttachmentDefinition 資源名稱,以及部署該資源的命名空間 (本例為 default)。

  1. 建立名為 sriovpod.yaml 的 Pod 規格檔案,並在當中加入下列內容:

         apiVersion: v1
         kind: Pod
         metadata:
         name: sriovpod
         annotations:
            k8s.v1.cni.cncf.io/networks: default/sriov-net1
         spec:
         containers:
         - name: sleeppodsriov
            command: ["sh", "-c", "trap : TERM INT; sleep infinity & wait"]
            image: busybox
            securityContext:
               capabilities:
               add:
                  - NET_ADMIN
  2. 使用下列指令,將 Pod 規格檔案套用至叢集:

    kubectl apply -f sriovpod.yaml
    
  3. 使用下列指令確認 Pod 是否已順利啟動:

    kubectl get pods
    
  4. 使用下列指令,為 Pod 建立指令列殼層:

    kubectl exec -it sriovpod -- sh
    
  5. 在 Pod 殼層中執行下列指令,確認 Pod 是否使用 SR-IOV 網路功能運算子功能與 ToR 交換器通訊:

    ip addr
    

    指令會傳回類似以下內容的輸出結果:

    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
       link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
       inet 127.0.0.1/8 scope host lo
          valid_lft forever preferred_lft forever
       inet6 ::1/128 scope host 
          valid_lft forever preferred_lft forever
    51: net1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 9000 qdisc mq qlen 1000
       link/ether 2a:af:96:a5:42:ab brd ff:ff:ff:ff:ff:ff
       inet 192.168.100.11/25 brd 192.168.100.127 scope global net1
          valid_lft forever preferred_lft forever
    228: eth0@if229: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue qlen 1000
       link/ether 46:c9:1d:4c:bf:32 brd ff:ff:ff:ff:ff:ff
       inet 10.10.3.159/32 scope global eth0
          valid_lft forever preferred_lft forever
       inet6 fe80::44c9:1dff:fe4c:bf32/64 scope link 
          valid_lft forever preferred_lft forever
    

    net1 介面傳回的資訊表示 ToR 交換器與 Pod 之間已建立網路連線。

設定 Pod 以進行映像檔快取

您可以設定在 Distributed Cloud 連線叢集上執行的 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 連線工作負載時,請務必遵守本節所述的限制。您在 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 不支援將 Pod 繫結至 HostNetwork 命名空間中的主機連接埠。此外,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
  • sriov-fec-system
  • sriov-network-operator
  • vm-system

PROJECT_ID 代表目標 Google Cloud 專案的 ID。

請避免使用名稱中含有 g- 前置字元的任何命名空間。這類命名空間通常是 Distributed Cloud 連結網路方案使用的保留命名空間。

Webhook 限制

Distributed Cloud connected 對 Webhook 的限制如下:

  • 您建立的任何變動 Webhook 都會自動排除 kube-system 命名空間。
  • 下列資源類型已停用 Mutating Webhook:
    • nodes
    • persistentvolumes
    • certificatesigningrequests
    • tokenreviews

Pod 優先順序限制

使用 Distributed Cloud Connected 時,您必須將工作負載 Pod 的優先順序設為低於 500000000 的值。

後續步驟