Google Distributed Cloud (GDC) 實體隔離方案中的專屬節點集區可隔離容器工作負載,強化 Kubernetes 叢集安全性,並控管 Pod 放置位置。這種區隔有助於降低提權攻擊的風險。如要設定專用集區,請套用污點和標籤,並與工作負載容忍度和節點親和性規則進行比對,然後驗證排程。
本文適用對象為平台管理員群組中負責管理 Kubernetes 叢集的 IT 管理員,以及應用程式操作員群組中負責執行容器的開發人員。詳情請參閱「節點隔離總覽」和「GDC 實體隔離方案說明文件的目標對象」。
事前準備
如要完成本文件中的工作,您必須要求必要權限並準備環境。
要求 IAM 角色
您必須具備特定角色,才能取得在 Kubernetes 叢集中隔離容器工作負載所需的權限。所需角色取決於您是在機構範圍的共用叢集,還是在專案範圍的標準叢集內作業。詳情請參閱「Kubernetes 叢集設定」。
共用叢集角色
請與 IAM 機構組織管理員聯絡,要求授予下列角色,以便在共用叢集中對節點集區進行 taint 和加上標籤:
使用者叢集管理員 (
user-cluster-admin):建立、刪除、編輯或查看託管於 Management API 伺服器的共用叢集資源。這個角色可讓您存取共用叢集的節點集區。使用者叢集開發人員 (
user-cluster-developer):建立、刪除、編輯或查看共用叢集。這個角色可存取共用叢集內託管的資料層 API。
這類角色不會繫結至命名空間。
標準叢集角色
請與 IAM 專案管理員聯絡,要求取得下列角色,以便在標準叢集中對節點集區進行 taint 和加上標籤:
叢集管理員 (
cluster-admin):建立、刪除、編輯或查看標準叢集中的所有資源。這個角色可讓您存取標準叢集內託管的資料層 API,這些 API 負責管理叢集的資源。叢集開發人員 (
cluster-developer):建立、刪除、編輯或查看標準叢集。這個角色可讓使用者存取標準叢集內託管的資料層 API,這些 API 負責管理叢集。標準叢集管理員 (
standard-cluster-admin):建立、刪除、編輯或查看託管於管理 API 伺服器的標準叢集資源。這個角色可授予標準叢集節點集區的存取權。
這些角色會繫結至專案命名空間。
準備環境
如要使用 API 對 Kubernetes 叢集執行指令,請確認您具備下列資源:
登入並產生 Kubernetes 叢集的 kubeconfig 檔案。
請使用 Kubernetes 叢集的 kubeconfig 路徑,取代這些操作說明中的
KUBERNETES_CLUSTER_KUBECONFIG。登入並產生管理 API 伺服器的 kubeconfig 檔案。
請使用 Management API 伺服器的 kubeconfig 路徑,取代這些操作說明中的
MANAGEMENT_API_SERVER。為專用節點集區要使用的節點污點和節點標籤選擇特定名稱。例如
workloadType=untrusted。
對新的節點集區設定污點和標籤
將污點或標籤套用至新的節點集區時,所有節點 (包括日後新增的節點) 都會自動取得指定的污點和標籤。套用後,您無法從節點集區中移除污點或標籤。
如要為新的節點集區新增污點和標籤,請完成下列步驟:
建立節點集區時,直接編輯
Cluster自訂資源的nodePools區段:nodePools: # Several lines of code are omitted here. - machineTypeName: n2-standard-2-gdc name: nodepool-1 nodeCount: 3 taints: - key: "TAINT_KEY" value: "TAINT_VALUE" effect: "TAINT_EFFECT" labels: LABEL_KEY: LABEL_VALUE更改下列內容:
TAINT_KEY:與排程TAINT_EFFECT相關聯的鍵/值組合中,容忍度鍵的部分。例如:workloadType。TAINT_VALUE:與排程TAINT_EFFECT相關聯的鍵/值組合中,容忍值部分。例如:untrusted。TAINT_EFFECT:下列其中一個效果值:NoSchedule:無法容許這項 taint 的 Pod 不會排定於節點運作,現有的 Pod 不會從節點中剔除。PreferNoSchedule:Kubernetes 會避免將無法容許這項污點的 Pod 排定於節點運作。NoExecute:如果 Pod 已在節點上執行,系統會從節點中剔除 Pod。如果尚未在節點上執行,則不會排定在節點上執行。
LABEL_KEY: LABEL_VALUE:節點標籤的鍵/值組合,對應至您在工作負載資訊清單中指定的選取器。
套用
Cluster資源,建立新的節點集區:kubectl apply -f cluster.yaml --kubeconfig MANAGEMENT_API_SERVER將
MANAGEMENT_API_SERVER替換為託管 Kubernetes 叢集的可用區 API 伺服器 kubeconfig 路徑。
對現有節點集區設定污點和標籤
如要將污點或標籤套用至現有節點集區,您必須將變更套用至每個現有節點。您無法動態更新節點集區設定。
套用後,您無法從節點集區移除污點或標籤。
如要為現有節點集區新增污點和標籤,請完成下列步驟:
列出專屬節點集區中的節點:
kubectl get node --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG \ -l baremetal.cluster.gke.io/node-pool=NODE_POOL_NAME請替換下列變數:
KUBERNETES_CLUSTER_KUBECONFIG:Kubernetes 叢集的 kubeconfig 路徑。NODE_POOL_NAME:專用節點集區的名稱。
請記下輸出內容中,節點集區內所有節點的 ID。
針對節點集區中的每個節點,套用下列污點:
kubectl taint nodes NODE_ID \ TAINT_KEY=TAINT_VALUE:TAINT_EFFECT \ --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG請替換下列變數:
NODE_ID:專用節點集區中的 worker 節點 ID。TAINT_KEY=TAINT_VALUE:與排程TAINT_EFFECT相關聯的鍵/值組合。例如:workloadType=untrusted。TAINT_EFFECT:下列其中一個效果值:NoSchedule:無法容許這項 taint 的 Pod 不會排定於節點運作,現有的 Pod 不會從節點中剔除。PreferNoSchedule:Kubernetes 會避免將無法容許這項污點的 Pod 排定於節點運作。NoExecute:如果 Pod 已在節點上執行,系統會從節點中剔除 Pod。如果尚未在節點上執行,則不會排定在節點上執行。
KUBERNETES_CLUSTER_KUBECONFIG:Kubernetes 叢集的 kubeconfig 路徑。
針對節點集區中的每個節點,套用與您在容器工作負載中定義的選取器相對應的標籤:
kubectl label NODE_ID \ LABEL_KEY:LABEL_VALUE \ --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG請替換下列變數:
NODE_ID:專用節點集區中的 worker 節點 ID。LABEL_KEY:LABEL_VALUE:節點標籤的鍵/值組合,對應至您在工作負載資訊清單中指定的選取器。KUBERNETES_CLUSTER_KUBECONFIG:Kubernetes 叢集的 kubeconfig 路徑。
新增容忍度和節點親和性規則
對專用節點集區設定污點後,除非工作負載具備與您新增的污點相對應的容忍度,否則無法在該節點集區上排程。將容許規定新增至工作負載規格,讓這些 Pod 排定在有污點的節點集區。
如果您已為專屬節點集區加上標籤,也可以新增節點親和性規則,指示 GDC 僅在該節點集區上排定工作負載。
如要設定容器工作負載,以便在專屬節點集區中執行,請完成下列步驟:
在容器工作負載資訊清單檔案 (例如
Deployment自訂資源) 的.spec.template.spec區段中,新增下列區段:tolerations: - key: TAINT_KEY operator: Equal value: TAINT_VALUE effect: TAINT_EFFECT affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: LABEL_KEY operator: In values: - "LABEL_VALUE"更改下列內容:
TAINT_KEY:您套用至專用節點集區的 taint 鍵。TAINT_VALUE:您套用至專屬節點集區的污點值。TAINT_EFFECT:下列其中一個效果值:NoSchedule:無法容許這項 taint 的 Pod 不會排定於節點運作,現有的 Pod 不會從節點中剔除。PreferNoSchedule:Kubernetes 會避免將無法容許這項污點的 Pod 排定於節點運作。NoExecute:如果 Pod 已在節點上執行,系統會從節點中剔除 Pod。如果尚未在節點上執行,則不會排定在節點上執行。
LABEL_KEY:套用至專用節點集區的節點標籤鍵。LABEL_VALUE:您套用至專用節點集區的節點標籤值。
舉例來說,下列
Deployment資源會為workloadType=untrusted:NoExecute污點新增容忍度,並為workloadType=untrusted節點標籤新增節點親和性規則:kind: Deployment apiVersion: apps/v1 metadata: name: my-app namespace: default labels: app: my-app spec: replicas: 1 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: tolerations: - key: workloadType operator: Equal value: untrusted effect: NoExecute affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: workloadType operator: In values: - "untrusted" containers: - name: my-app image: harbor-1.org-1.zone1.google.gdc.test/harborproject/my-app ports: - containerPort: 80 imagePullSecrets: - name: SECRET更新容器工作負載:
kubectl apply -f deployment.yaml -n NAMESPACE \ --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG請替換下列變數:
NAMESPACE:容器工作負載的命名空間。如果是共用叢集,則必須是專案命名空間。如果是標準叢集,則可以是任何命名空間。KUBERNETES_CLUSTER_KUBECONFIG:Kubernetes 叢集的 kubeconfig 路徑。
GDC 會重新建立受影響的 Pod。節點相依性規則會強制將 Pod 移至您建立的專屬節點集區。容忍度只允許這些 Pod 放置在節點上。
確認區隔功能是否正常運作
確認您指定的 Pod 正在已加上標籤的節點集區中運作。
列出指定命名空間中的 Pod:
kubectl get pods -o=wide -n NAMESPACE \ --kubeconfig KUBERNETES_CLUSTER_KUBECONFIG請替換下列變數:
NAMESPACE:容器工作負載的命名空間。如果是共用叢集,則必須是專案命名空間。如果是標準叢集,則可以是任何命名空間。KUBERNETES_CLUSTER_KUBECONFIG:Kubernetes 叢集的 kubeconfig 路徑。
輸出看起來類似以下內容:
pod/kube-abc-12tyuj pod/kube-abc-39oplef pod/kube-abc-95rzkap確認工作負載正在專用節點集區中執行。