本頁面說明在 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 連線硬體上部署工作負載,請完成下列步驟:
選用: 為本機儲存空間啟用客戶自行管理的加密金鑰 (CMEK) 支援: 如要與 Cloud Key Management Service 整合,為工作負載資料啟用 CMEK 支援,請執行這項操作。如要瞭解 Distributed Cloud connected 如何加密工作負載資料,請參閱「本機儲存空間安全性」。
建立節點集區。 在這個步驟中,您會將節點指派給節點集區,並視需要將節點集區設定為使用 Cloud KMS,包裝及解除包裝 Linux Unified Key Setup (LUKS) 密碼片語,以加密工作負載資料。
取得叢集憑證,測試叢集。
在專案中為使用者指派 Edge Container 檢視者角色 (
roles/edgecontainer.viewer) 或 Edge Container 管理員角色 (roles/edgecontainer.admin),授予使用者叢集存取權。選用: 啟用 Google Distributed Cloud 支援的 VM 執行階段,在 Distributed Cloud connected 的虛擬機器上執行工作負載。
選用:將 Distributed Cloud connected 叢集連線至 Google Cloud:
選用:設定 Private Google Access,讓 Pod 透過 Cloud VPN 存取Google Cloud API 和服務。
選用:設定 Private Service Connect,讓 Pod 透過 Cloud VPN 存取Google Cloud API 和服務。
將 NGINX 負載平衡器部署為服務
下列範例說明如何部署 NGINX 伺服器,並在 Distributed Cloud 連線叢集上將其公開為服務:
建立名為
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
使用下列指令,將 YAML 檔案套用至叢集:
kubectl apply -f nginx-deployment.yaml
建立名為
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
使用下列指令,將 YAML 檔案套用至叢集:
kubectl apply -f nginx-deployment.yaml
使用下列指令,取得 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 網路功能」。
建立網路:
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 大小相符,且所有網路都必須使用相同的值。
建立子網路:
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 連結區域的名稱。
監控子網路的狀態,直到成功建立為止:
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 網路函式運算子資源,如下所示。
使用下列指令,列出目標叢集節點集區中執行的節點:
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。針對您在上一個步驟中記錄的每個節點,建立專屬的
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。使用下列指令,將每個
NodeSystemConfigUpdate資源檔案套用至叢集:kubectl apply -f node-system-config-update-NODE_SHORT_NAME.yaml
將
NODE_SHORT_NAME替換為對應目標節點的簡短名稱。將資源套用至叢集時,每個受影響的節點都會重新啟動,這最多可能需要 30 分鐘。
- 監控受影響節點的狀態,直到所有節點都成功重新啟動為止:
kubectl get nodes | grep -v master
各節點完成重新啟動後,狀態會從
not-ready轉換為ready。
為 SR-IOV 網路功能設定 ToR 交換器
按照本節的步驟,在 Distributed Cloud 連接機架中,為每個 Distributed Cloud ToR 交換器設定網路介面,以執行 SR-IOV 網路功能。
建立名為
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
建立名為
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
建立名為
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
建立名為
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
使用下列指令,將 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
受影響的節點會被封鎖、清空並重新啟動。
使用下列指令監控節點狀態:
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 資源,步驟如下:
建立名為
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 位址。
使用下列指令將資源套用至叢集:
kubectl apply -f network-attachment-definition.yaml
部署具有 SR-IOV 網路功能的 Pod
請完成本節中的步驟,在叢集上部署具有 SR-IOV 網路功能的 Pod。Pod 設定檔中的 annotations 欄位會指定您在本指南稍早建立的 NetworkAttachmentDefinition 資源名稱,以及部署該資源的命名空間 (本例為 default)。
建立名為
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
使用下列指令,將 Pod 規格檔案套用至叢集:
kubectl apply -f sriovpod.yaml
使用下列指令確認 Pod 是否已順利啟動:
kubectl get pods
使用下列指令,為 Pod 建立指令列殼層:
kubectl exec -it sriovpod -- sh
在 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 forevernet1介面傳回的資訊表示 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_READAUDIT_WRITECHOWNDAC_OVERRIDEFOWNERFSETIDIPC_LOCKIPC_OWNERKILLMKNODNET_ADMINNET_BIND_SERVICENET_RAWSETFCAPSETGIDSETPCAPSETUIDSYS_CHROOTSYS_NICESYS_PACCTSYS_PTRACESYS_RESOURCESYS_TIME
命名空間限制
Distributed Cloud Connected 不支援下列命名空間:
hostPIDhostIPChostNetwork
資源類型限制
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 資源類型:
csinfslocal
磁碟區類型限制
Distributed Cloud Connected 僅允許下列磁碟區類型:
configMapcsidownwardAPIemptyDirhostPathnfspersistentVolumeClaimprojectedsecret
Pod 容許限制
Distributed Cloud connected 不允許使用者在控制層節點上建立 Pod。具體來說,Distributed Cloud Connected 不允許排定具有下列容許鍵的 Pod:
""node-role.kubernetes.io/masternode-role.kubernetes.io/control-plane
模擬限制
Distributed Cloud Connected 不支援模擬使用者或群組。
管理命名空間限制
Distributed Cloud connected 不允許存取下列命名空間:
ai-systemai-speech-systemai-ocr-systemai-translation-systemanthos-identity-servicecert-managerdataproc-systemdataproc-PROJECT_IDdns-systemg-istio-systemgke-connectgke-managed-metrics-servergke-operatorsg-ospf-servicecontrol-systemg-ospf-systemg-pspf-systemgke-systemgpc-backup-systemiam-systemkube-node-leasekube-publickube-system,但刪除ippools.whereabouts.cni.cncf.io除外metallb-system,但編輯configMap資源以設定負載平衡 IP 位址範圍除外nf-operatoroclcm-systempredictionrm-systemrobiniosaas-systemsriov-fec-systemsriov-network-operatorvm-system
PROJECT_ID 代表目標 Google Cloud 專案的 ID。
請避免使用名稱中含有 g- 前置字元的任何命名空間。這類命名空間通常是 Distributed Cloud 連結網路方案使用的保留命名空間。
Webhook 限制
Distributed Cloud connected 對 Webhook 的限制如下:
- 您建立的任何變動 Webhook 都會自動排除
kube-system命名空間。 - 下列資源類型已停用 Mutating Webhook:
nodespersistentvolumescertificatesigningrequeststokenreviews
Pod 優先順序限制
使用 Distributed Cloud Connected 時,您必須將工作負載 Pod 的優先順序設為低於 500000000 的值。