本頁說明如何設定在 Google Kubernetes Engine (GKE) 標準模式中建立的叢集,透過 ip-masq-agent 執行 IP 位址偽裝。如要進一步瞭解 GKE Autopilot 模式中的 IP 偽裝,請參閱「使用 Egress NAT Policy 在 Autopilot 叢集中設定 IP 偽裝」。
事前準備
開始之前,請確認您已完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。
- 確認您有現有的標準叢集。如需 Standard 叢集,請建立一個。
檢查 ip-masq-agent 狀態
本節將說明如何:
- 判斷叢集是否有
ip-masq-agentDaemonSet。 - 檢查
ip-masq-agentConfigMap 資源。
檢查 ip-masq-agent DaemonSet
如要檢查叢集是否正在執行 ip-masq-agent DaemonSet,請使用 Google Cloud CLI 或 Google Cloud 控制台。
gcloud
取得叢集的憑證:
gcloud container clusters get-credentials CLUSTER_NAME將
CLUSTER_NAME替換為叢集名稱。在
kube-system命名空間中搜尋ip-masq-agent:kubectl get daemonsets/ip-masq-agent -n kube-system如果
ip-masq-agentDaemonSet 存在,輸出內容會類似以下內容:NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE ip-masq-agent 3 3 3 3 3 <none> 13d如果
ip-masq-agentDaemonSet 不存在,輸出內容會類似下列內容:Error from server (NotFound): daemonsets.apps "ip-masq-agent" not found確認
ip-masq-agentDaemonSet 是否執行最新版本:kubectl get daemonsets/ip-masq-agent -n kube-system -o jsonpath='{.spec.template.spec.containers[].image}'這個指令必須傳回與「部署 ip-masq-agent DaemonSet」中指定的容器映像檔相同的容器映像檔。
控制台
前往 Google Cloud 控制台的「Workloads」(工作負載) 頁面。
如要 篩選,請執行下列操作:
- 按一下 ,清除「Is system object: False」篩選器。
- 篩選下列屬性:
- 名稱:
ip-masq-agent。 - 叢集:叢集名稱。
- 名稱:
如果
ip-masq-agentDaemonSet 存在,您可以在表格中看到 DaemonSet 記錄。 如果ip-masq-agentDaemonSet 不存在,就不會顯示任何資料列。
如要建立 ip-masq-agent ConfigMap 並部署 ip-masq-agent DaemonSet,請參閱「設定及部署 ip-masq-agent」。
檢查 ip-masq-agent ConfigMap
如要檢查叢集是否正在執行 ip-masq-agent ConfigMap,請使用 Google Cloud CLI 或 Google Cloud 控制台。
gcloud
取得叢集的憑證:
gcloud container clusters get-credentials CLUSTER_NAME將
CLUSTER_NAME替換為叢集名稱。說明
kube-system命名空間中的ip-masq-agentConfigMap:kubectl describe configmaps/ip-masq-agent -n kube-system如果
ip-masq-agentConfigMap 存在,輸出內容會類似於下列內容:Name: ip-masq-agent Namespace: kube-system Labels: <none> Annotations: <none> Data ==== config: ---- nonMasqueradeCIDRs: - 198.15.5.92/24 - 10.0.0.0/8 masqLinkLocal: false resyncInterval: 60s BinaryData ==== Events: <none>如果
ip-masq-agentConfigMap 不存在,輸出內容會類似於下列內容:Error from server (NotFound): configmaps "ip-masq-agent" not found
控制台
前往 Google Cloud 控制台的「Configuration」(設定) 頁面。
如要 篩選,請執行下列操作:
- 按一下 ,清除「Is system object: False」篩選器。
- 篩選下列屬性:
- 名稱:
ip-masq-agent。 - 叢集:叢集名稱。
- 名稱:
如果
ip-masq-agentConfigMap 存在,您可以在表格中看到 ConfigMap 記錄。如果ip-masq-agentConfigMap 不存在,就不會顯示任何資料列。
如果叢集已有 ip-masq-agent ConfigMap,您可以設定並部署該 ConfigMap。
設定及部署 ip-masq-agent
本節說明如何建立或編輯 ip-masq-agent ConfigMap,以及如何部署或刪除 ip-masq-agent DaemonSet。如要判斷需要執行的工作,請先判斷叢集是否已有 ip-masq-agent ConfigMap 和 ip-masq-agent DaemonSet。
建立 ip-masq-agent ConfigMap
下列步驟說明如何建立 ip-masq-agent ConfigMap。如果叢集已有 ip-masq-agent ConfigMap,請改為編輯現有的 ip-masq-agent ConfigMap。
使用下列範本建立設定檔,並儲存至本機。 您可以為這個設定檔的本機副本使用任何名稱。
nonMasqueradeCIDRs: - CIDR_1 - CIDR_2 masqLinkLocal: false resyncInterval: SYNC_INTERVALUNIT_OF_TIME更改下列內容:
CIDR_1和CIDR_2:CIDR 格式的 IP 位址範圍。封包傳送至這些目的地時,叢集不會偽裝 IP 位址來源,並會保留來源 Pod IP 位址。如需超過兩個 CIDR,請按照相同格式在nonMasqueradeCIDRs清單中新增更多項目。至少nonMasqueradeCIDRs屬性應包含叢集的節點和 Pod IP 位址範圍。SYNC_INTERVAL:每個ip-masq-agentPod 檢查ip-masq-agentConfigMap 內容,並將所有變更寫入本機/etc/config/ip-masq-agent檔案的時間間隔。預設值為60。UNIT_OF_TIME:resyncInterval 的時間單位。 有效值包括s(秒) 或ms(毫秒)。預設為s。
除非需要為傳送至連結本機 IPv4 位址的封包啟用偽裝,否則請將
masqLinkLocal設為 false (預設值)。詳情請參閱「偽裝成連結本機目的地」。建立 ConfigMap 資源:
kubectl create configmap ip-masq-agent \ --namespace=kube-system \ --from-file=config=LOCAL_CONFIG_FILE_PATH將
LOCAL_CONFIG_FILE_PATH替換為上一個步驟中建立的設定檔路徑。說明
kube-system命名空間中的ip-masq-agentConfigMap:kubectl describe configmaps/ip-masq-agent -n kube-system輸出結果會與下列內容相似:
Name: ip-masq-agent Namespace: kube-system Labels: <none> Annotations: <none> Data ==== config: ---- nonMasqueradeCIDRs: - 198.15.5.92/24 - 10.0.0.0/8 masqLinkLocal: false resyncInterval: 60s BinaryData ==== Events: <none>這項輸出內容包含
config參數,以及您的設定變更。 您現在可以部署ip-masq-agentDeamonSet。
編輯現有的 ip-masq-agent ConfigMap
如要修改現有 ip-masq-agent ConfigMap 的內容,請完成下列步驟:
在文字編輯器中開啟 ConfigMap:
kubectl edit configmap ip-masq-agent --namespace=kube-system編輯 ConfigMap 檔案的內容:
apiVersion: v1 data: config: | nonMasqueradeCIDRs: - CIDR_1 - CIDR_2 masqLinkLocal: false resyncInterval: SYNC_INTERVALUNIT_OF_TIME kind: ConfigMap metadata: name: ip-masq-agent namespace: kube-system更改下列內容:
CIDR_1和CIDR_2:CIDR 格式的 IP 位址範圍。當封包傳送至這些目的地時,叢集不會偽裝 IP 位址來源,並會保留來源 Pod IP 位址。如果需要兩個以上的 CIDR,請按照相同格式在清單中新增更多項目。nonMasqueradeCIDRs至少應包含叢集的節點和 Pod IP 位址範圍。nonMasqueradeCIDRsSYNC_INTERVAL:每個ip-masq-agentPod 檢查ip-masq-agentConfigMap 內容,並將所有變更寫入本機/etc/config/ip-masq-agent檔案的時間間隔。預設值為60。UNIT_OF_TIME:resyncInterval 的時間單位。 有效值包括s(秒) 或ms(毫秒)。預設為s。
除非需要為傳送至連結本機 IPv4 位址的封包啟用偽裝,否則請將
masqLinkLocal設為 false (預設值)。詳情請參閱「偽裝成連結本機目的地」。說明
kube-system命名空間中的ip-masq-agentConfigMap:kubectl describe configmaps/ip-masq-agent -n kube-system輸出結果會與下列內容相似:
Name: ip-masq-agent Namespace: kube-system Labels: <none> Annotations: <none> Data ==== config: ---- nonMasqueradeCIDRs: - 198.15.5.92/24 - 10.0.0.0/8 masqLinkLocal: false resyncInterval: 60s BinaryData ==== Events: <none>這項輸出內容包含
config參數,該參數與您建立的檔案中的設定值相符。
部署 ip-masq-agent DaemonSet
建立或編輯 ip-masq-agent ConfigMap 後,請部署 ip-masq-agent DaemonSet。
將下列資訊清單儲存為 YAML 檔案:
apiVersion: apps/v1 kind: DaemonSet metadata: name: ip-masq-agent namespace: kube-system spec: selector: matchLabels: k8s-app: ip-masq-agent template: metadata: labels: k8s-app: ip-masq-agent spec: hostNetwork: true containers: - name: ip-masq-agent image: gke.gcr.io/ip-masq-agent:v2.12.3-gke.4@sha256:b5db41ddaf863b660da330322714f668101482b528829c50c53229d901d11af5 args: - --v=2 - --logtostderr=false - --log_file=/dev/stdout - --log_file_max_size=0 # The masq-chain must be IP-MASQ - --masq-chain=IP-MASQ # To non-masquerade reserved IP ranges by default, # uncomment the following line. # - --nomasq-all-reserved-ranges # Must be set to false when using Dataplane V2. - --random-fully=false securityContext: privileged: false capabilities: drop: ["ALL"] add: ["NET_ADMIN", "NET_RAW"] allowPrivilegeEscalation: false seccompProfile: type: RuntimeDefault volumeMounts: - name: config-volume mountPath: /etc/config volumes: - name: config-volume configMap: name: ip-masq-agent optional: true items: - key: config path: ip-masq-agent tolerations: - effect: NoSchedule operator: Exists - effect: NoExecute operator: Exists - key: "CriticalAddonsOnly" operator: "Exists"
這份資訊清單會建立名為
config-volume的磁碟區,並按照容器的 volumeMount 指定方式掛接。如需編輯這個資訊清單,請考慮下列情況:
磁碟區名稱可以隨意命名,但必須與容器的
volumeMount名稱相符。ConfigMap 名稱必須與 Pod 中
config-volumeVolume 參照的名稱相符。configMap連鎖店名稱 (
--masq-chain) 必須為IP-MASQ。否則,GKE 不會覆寫預設的偽裝規則。DaemonSet Pod 會從
ip-masq-agent檔案讀取資料。ip-masq-agent檔案內容是 ConfigMap 中config鍵的值。如果您預設使用非偽裝保留 IP 範圍,請取消
arg區段中的- --nomasq-all-reserved-ranges行註解。
部署 DaemonSet:
kubectl apply -f LOCAL_FILE_PATH將
LOCAL_FILE_PATH替換為上一步建立的檔案路徑。
您可以手動更新建立的 ip-masq-agent DaemonSet。詳情請參閱「更新 DaemonSet」一文。
刪除「ip-masq-agent」
本節說明如何刪除 ip-masq-agent DaemonSet 和 ip-masq-agent ConfigMap。刪除 ip-masq-agent 不會還原節點上現有的 IP 偽裝設定。
刪除 ip-masq-agent DaemonSet
如果您手動建立 ip-masq-agent DaemonSet,可以執行下列指令刪除:
kubectl delete daemonsets ip-masq-agent -n kube-system
刪除 ip-masq-agent ConfigMap
如要徹底刪除 ip-masq-agent ConfigMap,請執行下列指令:
kubectl delete configmap ip-masq-agent -n kube-system
疑難排解
下列各節提供疑難排解建議。
一般疑難排解
請按照下列步驟診斷 IP 位址偽裝問題:
- 確認
ip-masq-agent的狀態。如果未定義 ConfigMap,系統不會偽裝所有預設目的地的流量,並保留 Pod IP 位址。前往其他目的地的流量會保留節點 IP 位址。 - 確認 DaemonSet 中指定的
ip-masq-agent映像檔版本。 如果ip-masq-agentDaemonSet 不是最新版本,請按照部署步驟更新 DaemonSet。 - 在受影響的節點中執行
sudo iptables -t nat -L IP-MASQ指令,檢查 NAT IP 表格是否已正確填入 IP-MASQ 鏈。如果 ConfigMap 中定義的nonMasqueradeCIDRs未顯示在 NAT IP 表格中,請確認用於建立 ConfigMap 的設定檔中沒有錯字。 - 確認目的地允許節點和 Pod IP 位址範圍。
- 如果無法從節點或 Pod 存取流量,請執行連線測試。
問題:Pod IP 位址變更為節點 IP 位址
使用 IP 偽裝代理程式時,您可能會發現 Pod 與外部目的地通訊時,Pod 的來源 IP 位址會意外使用節點的 IP 位址。
問題原因是缺少或不完整的自訂來源網路位址轉譯 (SNAT) 清單。使用 IP 偽裝代理程式時,如果缺少 ConfigMap 或 ConfigMap 不含 nonMasqueradeCIDRs 清單,系統會使用叢集的預設 SNAT。封包離開 Pod 時,預設 SNAT 會將來源 IP 位址從 Pod 的 IP 位址變更為節點的內部 IP 位址。如要進一步瞭解 SNAT,請參閱IP 偽裝代理程式。
如要解決這個問題,請在 ip-masq-agent ConfigMap 中定義 nonMasqueradeCIDRs 清單,設定自訂 SNAT 清單:
開啟
ip-masq-agentConfigMap:kubectl edit configmap ip-masq-agent --namespace=kube-system查看 ConfigMap 中的
nonMasqueradeCIDRs清單。nonMasqueradeCIDRs清單應完整呈現。例如:... nonMasqueradeCIDRs: - 35.100.0.0/16 ...如果清單缺漏或不完整,請新增或修改清單,加入要保留來源 Pod IP 位址的目的地 IP 範圍。
nonMasqueradeCIDRs這份清單也應包含您想使用 Cloud NAT 的位址。如果不想讓任何外部流量使用 SNAT,請將
nonMasqueradeCIDRs欄位設為0.0.0.0/0。例如:... nonMasqueradeCIDRs: - 0.0.0.0/0 ...如果流量未使用 SNAT,則無論目的地為何,從 Pod 傳送的所有封包都會保留 Pod 的 IP 位址做為來源 IP 位址。
檢查 Pod 傳出封包的來源 IP 位址。如要檢查這個位址,請擷取封包。如果無法這麼做,您可以使用下列指令檢查節點的 IP 位址,這應該是受 SNAT 影響的出埠封包來源 IP 位址:
kubectl get nodes -o wide
後續步驟
- 瞭解如何使用 Egress NAT 政策在 Autopilot 叢集中設定 IP 偽裝。
- 瞭解如何建立虛擬私有雲原生叢集。
- 閱讀 GKE 網路總覽。
- 瞭解如何設定授權網路。