IP 偽裝代理程式

本頁面說明 Google Kubernetes Engine IP 偽裝代理程式的運作方式。

總覽

「IP 偽裝」是一種網路位址轉譯 (NAT) 形式,用於執行多對一的 IP 位址轉譯。偽裝功能可將多個來源 IP 位址隱藏在一個位址後面。

將 IP 偽裝功能運用到叢集,可以防止個別 Pod IP 位址暴露於連結-本機範圍 (169.254.0.0/16) 和其他任意 IP 範圍之外的流量,進而提高叢集的安全性。

此外,IP 偽裝功能也可以讓您設定 IP 範圍之間直接通訊而不使用偽裝,例如,192.168.0.0/16 範圍內的 Pod 與叢集 CIDR 範圍 (10.0.0.0/8) 內的網路資源進行互動時。

事前準備

如要準備這項工作,請執行下列步驟:

  • 確認您已啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 確認您已安裝 Cloud SDK
  • 設定預設的專案 ID
    gcloud config set project [PROJECT_ID]
  • 如果您使用區域叢集,請設定預設的運算區域
    gcloud config set compute/zone [COMPUTE_ZONE]
  • 如果您使用地區叢集,請設定預設的運算地區
    gcloud config set compute/region [COMPUTE_REGION]
  • gcloud 更新到最新版本:
    gcloud components update

ip-masq-agent 的運作方式

GKE 的 IP 偽裝功能會交由 ip-masq-agent 工具來處理;符合以下「一或多個」額外條件時,GKE v1.7 及更高版本就會自動啟用 ip-masq-agent

  • 叢集有網路政策
  • 叢集的 CIDR 範圍不在 10.0.0.0/8 之內

如果您的叢集是使用 GKE v1.7 或更高版本,但不符合自動啟用 ip-masq-agent 的其他條件,您就可以手動建立 ip-masq-agent 代理程式

ip-masq-agent 會設定 iptables 規則,當流量傳送到節點 IP 範圍和叢集 IP 範圍外的目的地時,系統將會處理偽裝節點/Pod IP 位址。Pod IP 位址會隱藏在節點位址後面。

根據預設,代理程式的設定是將 RFC 1918 指定的三個私人 IP 範圍視為非偽裝 CIDR

  • 10.0.0.0/8,叢集 CIDR 會將此用於 Pod IP 位址
  • 172.16.0.0/12
  • 192.168.0.0/16

根據預設,IP 偽裝功能也會將連結-本機範圍 (169.254.0.0/16) 視為非偽裝 CIDR。

代理程式預設會每 60 秒從容器的 /etc/config/ip-masq-agent 檔案重新載入設定檔。

以下是 ip-masq-agent 套用的預設 iptables 規則集合:

iptables -t nat -L IP-MASQ
RETURN     all  --  anywhere             169.254.0.0/16       /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
RETURN     all  --  anywhere             10.0.0.0/8           /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
RETURN     all  --  anywhere             172.16.0.0/12        /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
RETURN     all  --  anywhere             192.168.0.0/16       /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
MASQUERADE  all  --  anywhere            anywhere             /* ip-masq-agent: outbound traffic should be subject to MASQUERADE (this match must come after cluster-local CIDR matches) */ ADDRTYPE match dst-type !LOCAL

使用 ConfigMap 設定代理程式

如果上述預設的規則集合不夠您的叢集所需,您可以使用 ConfigMap 自訂受影響的 IP 範圍。

ConfigMap 檔案必須以 YAML 或 JSON 格式撰寫,且必須命名為 config

這個檔案可以包含三個鍵值 (皆為選填):

  • nonMasqueradeCIDRs:以 CIDR 標記法表示的字串清單,可用來指定不使用 IP 偽裝功能的 IP 位址範圍。
  • masqLinkLocal:這個布林值可用來指示是否將流量偽裝成連結-本機前置字串 (169.254.0.0/16)。預設值是 false
  • resyncInterval:這個整數值代表代理程式嘗試從磁碟同步 ConfigMap 檔案的時間間隔。格式為 Nx,其中 N 是整數,x 則是 sms 等時間單位。

舉例來說,以下 ConfigMap config 會允許 ip-masq-agent 排除 10.0.0.0/8

nonMasqueradeCIDRs:
  - 10.0.0.0/8
resyncInterval: 60s

根據預設,連結-本機範圍 (169.254.0.0/16) 不必執行 IP 偽裝。

如要讓 ip-masq-agent 針對連結-本機範圍啟用 IP 偽裝功能,請將 ConfigMap 中的 masqLinkLocal 鍵值設為 true

例如:

nonMasqueradeCIDRs:
  - 10.0.0.0/8
resyncInterval: 60s
masqLinkLocal: true

將 ConfigMap 新增到您的叢集

如要新增 ConfigMap 到您的叢集,請從殼層或終端機視窗執行下列指令:

kubectl create configmap [CONFIGMAP_NAME] \
--from-file config \
--namespace kube-system

其中:

  • [CONFIGMAP_NAME] 是您為 ConfigMap 資源選擇的項目,例如 ip-masq-agent

例如:

kubectl create configmap ip-masq-agent --from-file config --namespace kube-system

同步執行完畢後,您應該會看到 iptables 的改變:

iptables -t nat -L IP-MASQ
Chain IP-MASQ (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             169.254.0.0/16       /* ip-masq-agent: cluster-local traffic should not be subject to MASQUERADE */ ADDRTYPE match dst-type !LOCAL
RETURN     all  --  anywhere             10.0.0.0/8           /* ip-masq-agent: cluster-local */
MASQUERADE  all  --  anywhere            anywhere             /* ip-masq-agent: outbound traffic should be subject to MASQUERADE (this match must come after cluster-local CIDR matches) */ ADDRTYPE match dst-type !LOCAL

手動建立 ip-masq-agent 資源 (選用)

您可能需要手動建立並設定 ip-masq-agent。如要進行此操作,您必須將 ip-masq-agent 資源部署到您的叢集中。

執行下列指令:

kubectl apply -f \
https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/ip-masq-agent/ip-masq-agent.yaml

這個指令會套用 Kubernetes 提供的設定檔

接著,將 masq-agent-ds-ready 標籤套用到節點和 DaemonSet,這些項目會使用您建立的 ip-masq-agent 資源。為節點和 DaemonSet 加上標籤,可指示 ip-masq-agent 應該在這些資源上操作。

kubectl label nodes [NAME] beta.kubernetes.io/masq-agent-ds-ready=true
kubectl label daemonsets [NAME] beta.kubernetes.io/masq-agent-ds-ready=true -n kube-system

其中 [NAME] 是資源名稱。

如要設定 ip-masq-agent 工具,請參閱使用 ConfigMap 設定代理程式

相關資源

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Kubernetes Engine 說明文件