本頁說明如何設定在 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
,取得最新版本。
檢查 ip-masq-agent
狀態
本節將說明如何:
- 判斷叢集是否有
ip-masq-agent
DaemonSet。 - 檢查
ip-masq-agent
ConfigMap 資源。
檢查 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-agent
DaemonSet 存在,輸出內容會類似以下內容:NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE ip-masq-agent 3 3 3 3 3 <none> 13d
如果
ip-masq-agent
DaemonSet 不存在,輸出內容會類似下列內容:Error from server (NotFound): daemonsets.apps "ip-masq-agent" not found
確認
ip-masq-agent
DaemonSet 是否執行最新版本: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-agent
DaemonSet 存在,您可以在表格中看到 DaemonSet 記錄。如果ip-masq-agent
DaemonSet 不存在,就不會顯示任何資料列。
如要建立 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-agent
ConfigMap:kubectl describe configmaps/ip-masq-agent -n kube-system
如果
ip-masq-agent
ConfigMap 存在,輸出內容會類似以下內容: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-agent
ConfigMap 不存在,輸出內容會類似於下列內容:Error from server (NotFound): configmaps "ip-masq-agent" not found
控制台
前往 Google Cloud 控制台的「Configuration」(設定) 頁面。
在「
篩選器」部分,執行下列操作:- 按一下 ,清除「Is system object: False」篩選器。
- 篩選下列屬性:
- 名稱:
ip-masq-agent
。 - 叢集:叢集名稱。
- 名稱:
如果
ip-masq-agent
ConfigMap 存在,您可以在表格中看到 ConfigMap 記錄。如果ip-masq-agent
ConfigMap 不存在,就不會顯示任何資料列。
如果叢集已有 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-agent
Pod 檢查ip-masq-agent
ConfigMap 內容,並將所有變更寫入本機/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-agent
ConfigMap: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
DeamonSet。
編輯現有的 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 位址範圍。nonMasqueradeCIDRs
SYNC_INTERVAL
:每個ip-masq-agent
Pod 檢查ip-masq-agent
ConfigMap 內容,並將所有變更寫入本機/etc/config/ip-masq-agent
檔案的時間間隔。預設值為60
。UNIT_OF_TIME
:resyncInterval 的時間單位。 有效值包括s
(秒) 或ms
(毫秒)。預設為s
。
除非需要為傳送至連結本機 IPv4 位址的封包啟用偽裝,否則請將
masqLinkLocal
設為 false (預設值)。詳情請參閱「偽裝成連結本機目的地」。說明
kube-system
命名空間中的ip-masq-agent
ConfigMap: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-volume
Volume 參照的名稱相符。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-agent
DaemonSet 不是最新版本,請按照部署步驟更新 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-agent
ConfigMap: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