IP 偽裝代理使用者指南
此頁面展示如何配置和啟用 ip-masq-agent。
準備工作
你需要擁有一個 Kubernetes 叢集,並且 kubectl 命令列工具已配置為與你的叢集通訊。 建議你在至少有兩個不作為控制平面主機的節點的叢集上執行本教程。 如果你還沒有叢集,可以使用 minikube 建立一個,或者使用這些 Kubernetes 遊樂場之一
要檢查版本,請輸入 kubectl version。
IP 偽裝代理使用者指南
ip-masq-agent 配置 iptables 規則,將 Pod 的 IP 地址隱藏在叢集節點的 IP 地址後面。 這通常發生在向叢集 Pod CIDR 範圍之外的目標傳送流量時。
關鍵術語
- NAT (網路地址轉換):一種透過修改 IP 頭中的源和/或目標地址資訊,將一個 IP 地址重新對映到另一個 IP 地址的方法。通常由執行 IP 路由的裝置執行。
- 偽裝 (Masquerading):NAT 的一種形式,通常用於執行多對一的地址轉換,其中多個源 IP 地址被隱藏在單個地址後面,該地址通常是執行 IP 路由的裝置。在 Kubernetes 中,這是節點的 IP 地址。
- CIDR (無類別域間路由):基於可變長度子網掩碼,允許指定任意長度的字首。CIDR 引入了一種新的 IP 地址表示方法,現在通常稱為 CIDR 表示法,其中地址或路由字首帶有一個字尾,指示字首的位數,例如 192.168.2.0/24。
- 鏈路本地:鏈路本地地址是一種僅在主機所連線的網路段或廣播域內進行通訊才有效的網路地址。IPv4 的鏈路本地地址以 CIDR 表示法定義在地址塊 169.254.0.0/16 中。
ip-masq-agent 配置 iptables 規則來處理將流量傳送到叢集節點 IP 和叢集 IP 範圍之外的目標時進行節點/Pod IP 地址偽裝。這實質上隱藏了 Pod 的 IP 地址,使其隱藏在叢集節點的 IP 地址後面。在某些環境中,流向“外部”地址的流量必須來自一個已知的機器地址。例如,在 Google Cloud 中,所有流向網際網路的流量都必須來自 VM 的 IP。當使用容器時(如在 Google Kubernetes Engine 中),Pod IP 將被拒絕用於出口。為了避免這種情況,我們必須將 Pod IP 隱藏在 VM 自己的 IP 地址後面——通常稱為“偽裝”。預設情況下,該代理被配置為將 RFC 1918 指定的三個私有 IP 範圍視為非偽裝 CIDR。這些範圍是 10.0.0.0/8、172.16.0.0/12 和 192.168.0.0/16。代理還會預設將鏈路本地 (169.254.0.0/16) 視為非偽裝 CIDR。該代理配置為每 60 秒從 /etc/config/ip-masq-agent 位置重新載入其配置,這也是可配置的。

代理配置檔案必須以 YAML 或 JSON 語法編寫,並且可能包含三個可選鍵
nonMasqueradeCIDRs:以 CIDR 表示法指定非偽裝範圍的字串列表。masqLinkLocal:一個布林值 (true/false),指示是否偽裝到鏈路本地字首169.254.0.0/16的流量。預設為 false。resyncInterval:代理嘗試從磁碟重新載入配置的時間間隔。例如:“30s”,其中“s”表示秒,“ms”表示毫秒。
發往 10.0.0.0/8、172.16.0.0/12 和 192.168.0.0/16 範圍的流量將不會被偽裝。任何其他流量(假定為網際網路流量)將被偽裝。來自 Pod 的本地目標的示例可以是其節點的 IP 地址以及另一個節點的地址或叢集 IP 範圍中的一個 IP 地址。任何其他流量將預設被偽裝。以下條目顯示了 ip-masq-agent 應用的預設規則集
iptables -t nat -L IP-MASQ-AGENT
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 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
預設情況下,在 GCE/Google Kubernetes Engine 中,如果啟用了網路策略或者你使用的叢集 CIDR 不在 10.0.0.0/8 範圍內,ip-masq-agent 將在你的叢集中執行。 如果你在其他環境中執行,可以將 ip-masq-agent DaemonSet 新增到你的叢集中。
建立 ip-masq-agent
要建立 ip-masq-agent,請執行以下 kubectl 命令
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/ip-masq-agent/master/ip-masq-agent.yaml
你還必須將適當的節點標籤應用於叢集中你希望代理執行的任何節點。
kubectl label nodes my-node node.kubernetes.io/masq-agent-ds-ready=true
更多資訊請參見 ip-masq-agent 文件 此處。
在大多數情況下,預設的規則集應該足夠了;但是,如果你的叢集不是這種情況,你可以建立一個 ConfigMap 並應用它來定製受影響的 IP 範圍。 例如,要只允許 ip-masq-agent 考慮 10.0.0.0/8,你可以在名為“config”的檔案中建立以下 ConfigMap。
注意
重要的是該檔名為 config,因為預設情況下,它將被 ip-masq-agent 用作查詢鍵。
nonMasqueradeCIDRs:
- 10.0.0.0/8
resyncInterval: 60s
執行以下命令將 ConfigMap 新增到你的叢集中
kubectl create configmap ip-masq-agent --from-file=config --namespace=kube-system
這將更新位於 /etc/config/ip-masq-agent 的檔案,該檔案會每隔 resyncInterval 定期檢查並應用於叢集節點。 在重新同步間隔到期後,你應該會看到 iptables 規則反映了你的更改
iptables -t nat -L IP-MASQ-AGENT
Chain IP-MASQ-AGENT (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
預設情況下,鏈路本地範圍 (169.254.0.0/16) 也由 ip-masq 代理處理,該代理設定適當的 iptables 規則。 要讓 ip-masq-agent 忽略鏈路本地,你可以在 ConfigMap 中將 masqLinkLocal 設定為 true。
nonMasqueradeCIDRs:
- 10.0.0.0/8
resyncInterval: 60s
masqLinkLocal: true