本頁面說明在 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 的虛擬機器上執行工作負載。
將 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
設定 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。
設定 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-systemvm-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 的值。
設定 Pod 的執行階段類別
使用 Distributed Cloud connected 時,您可以使用 runtimeClassName 欄位,在 Pod 的設定中指定執行階段類別。這會覆寫叢集層級指定的預設執行階段類別。可用的執行階段類別為 runc 和 gvisor。
例如:
apiVersion: v1
kind: Pod
metadata:
name: myPod
spec:
runtimeClassName: gvisor
containers:
- name: myPod
image: myPodImage
restartPolicy: OnFailure
如果在 Pod 設定中省略這項設定,Pod 會使用叢集層級指定的類別。除非您使用 --default-container-runtime 參數設定預設執行階段類別 (如「建立及管理叢集」所述),否則預設叢集層級執行階段類別為 runc。
如果您在 Pod 或叢集層級變更執行階段類別,必須重新啟動受影響的 Pod,變更才會生效。
gvisor 執行階段類別
指定 gvisor 執行階段類別會將 Pod 切換至以 gVisor 為基礎的 Open Container Initiative (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 專案位於 perimeter 外部,則適用這項規則。如果您使用 VPC Service Controls 限制 perimeter 內的 Distributed Cloud Edge Container API,就必須設定這項規則。
以下是這項規則的 egressFrom 設定範例 (JSON 格式):
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 在 perimeter 內限制 Distributed Cloud Edge Container API,且呼叫 Distributed Cloud Edge Container API 的身分位於 perimeter 外部,則必須設定這項規則。
以下是這項規則的 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: "*"
Config Sync 叢集 Google Cloud 專案的存取權
這項規則可讓 Config Sync 服務代理程式存取目標叢集 Google Cloud 專案中的資源。如果您已啟用 Config Sync,並使用 VPC Service Controls 限制範圍內 Connect API 的存取權,就必須設定這項規則。
以下是這項規則的 ingressFrom 設定範例:
ingressFrom:
identities:
- serviceAccount:service-PROJECT_ID@gcp-sa-acm.iam.gserviceaccount.com
將 PROJECT_ID 替換為目標叢集專案的 ID。 Google Cloud
以下是這項規則的 ingressTo 設定範例:
ingressTo:
resources:
- "*"
operations:
- serviceName: "gkeconnect.googleapis.com"
methodSelectors:
- method: "*"