Kubernetes IP Masquerade Agent用戶指南

2022-06-06 11:44 更新

IP Masquerade Agent 用戶指南

此頁(yè)面展示如何配置和啟用 ?ip-masq-agent?。

在開(kāi)始之前

你必須擁有一個(gè) Kubernetes 的集群,同時(shí)你的 Kubernetes 集群必須帶有 kubectl 命令行工具。 建議在至少有兩個(gè)節(jié)點(diǎn)的集群上運(yùn)行本教程,且這些節(jié)點(diǎn)不作為控制平面主機(jī)。 如果你還沒(méi)有集群,你可以通過(guò) Minikube 構(gòu)建一個(gè)你自己的集群,或者你可以使用下面任意一個(gè) Kubernetes 工具構(gòu)建:

要檢查版本,請(qǐng)輸入 ?kubectl version?。

IP Masquerade Agent 用戶指南

?ip-masq-agent? 配置 iptables 規(guī)則以隱藏位于集群節(jié)點(diǎn) IP 地址后面的 Pod 的 IP 地址。 這通常在將流量發(fā)送到集群的 Pod CIDR 范圍之外的目的地時(shí)使用。

關(guān)鍵術(shù)語(yǔ)

  • NAT (網(wǎng)絡(luò)地址轉(zhuǎn)譯) 是一種通過(guò)修改 IP 地址頭中的源和/或目標(biāo)地址信息將一個(gè) IP 地址重新映射 到另一個(gè) IP 地址的方法。通常由執(zhí)行 IP 路由的設(shè)備執(zhí)行。
  • 偽裝 NAT 的一種形式,通常用于執(zhí)行多對(duì)一地址轉(zhuǎn)換,其中多個(gè)源 IP 地址被隱藏在 單個(gè)地址后面,該地址通常是執(zhí)行 IP 路由的設(shè)備。在 Kubernetes 中, 這是節(jié)點(diǎn)的 IP 地址。
  • CIDR (無(wú)類別域間路由) 基于可變長(zhǎng)度子網(wǎng)掩碼,允許指定任意長(zhǎng)度的前綴。 CIDR 引入了一種新的 IP 地址表示方法,現(xiàn)在通常稱為CIDR表示法, 其中地址或路由前綴后添加一個(gè)后綴,用來(lái)表示前綴的位數(shù),例如 192.168.2.0/24。
  • 本地鏈路 本地鏈路是僅對(duì)網(wǎng)段或主機(jī)所連接的廣播域內(nèi)的通信有效的網(wǎng)絡(luò)地址。 IPv4 的本地鏈路地址在 CIDR 表示法的地址塊 169.254.0.0/16 中定義。

ip-masq-agent 配置 iptables 規(guī)則,以便在將流量發(fā)送到集群節(jié)點(diǎn)的 IP 和集群 IP 范圍之外的目標(biāo)時(shí) 處理偽裝節(jié)點(diǎn)或 Pod 的 IP 地址。這本質(zhì)上隱藏了集群節(jié)點(diǎn) IP 地址后面的 Pod IP 地址。 在某些環(huán)境中,去往“外部”地址的流量必須從已知的機(jī)器地址發(fā)出。 例如,在 Google Cloud 中,任何到互聯(lián)網(wǎng)的流量都必須來(lái)自 VM 的 IP。 使用容器時(shí),如 Google Kubernetes Engine,從 Pod IP 發(fā)出的流量將被拒絕出站。 為了避免這種情況,我們必須將 Pod IP 隱藏在 VM 自己的 IP 地址后面 - 通常稱為“偽裝”。 默認(rèn)情況下,代理配置為將 RFC 1918 指定的三個(gè)私有 IP 范圍視為非偽裝 CIDR。 這些范圍是 10.0.0.0/8,172.16.0.0/12 和 192.168.0.0/16。 默認(rèn)情況下,代理還將鏈路本地地址(169.254.0.0/16)視為非偽裝 CIDR。 代理程序配置為每隔 60 秒從 /etc/config/ip-masq-agent 重新加載其配置, 這也是可修改的。


代理配置文件必須使用 YAML 或 JSON 語(yǔ)法編寫(xiě),并且可能包含三個(gè)可選值:

  • ?nonMasqueradeCIDRs?: CIDR 表示法中的字符串列表,用于指定不需偽裝的地址范圍。
  • ?masqLinkLocal?:布爾值 (true/false),表示是否為本地鏈路前綴 169.254.0.0/16 的流量提供偽裝。 默認(rèn)為 false。
  • ?resyncInterval?:代理從磁盤重新加載配置的重試時(shí)間間隔。 例如 '30s',其中 's' 是秒,'ms' 是毫秒。

10.0.0.0/8、172.16.0.0/12 和 192.168.0.0/16 范圍內(nèi)的流量不會(huì)被偽裝。 任何其他流量(假設(shè)是互聯(lián)網(wǎng))將被偽裝。 Pod 訪問(wèn)本地目的地的例子,可以是其節(jié)點(diǎn)的 IP 地址、另一節(jié)點(diǎn)的地址或集群的 IP 地址范圍內(nèi)的一個(gè) IP 地址。 默認(rèn)情況下,任何其他流量都將偽裝。以下條目展示了 ip-masq-agent 的默認(rèn)使用的規(guī)則:

iptables -t nat -L IP-MASQ-AGENT
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

默認(rèn)情況下,在 GCE/Google Kubernetes Engine 中,如果啟用了網(wǎng)絡(luò)策略, 或者你使用的集群 CIDR 不在 10.0.0.0/8 范圍內(nèi), 則 ?ip-masq-agent? 將在你的集群中運(yùn)行。 如果你在其他環(huán)境中運(yùn)行,可以將 ?ip-masq-agent? DaemonSet 添加到你的集群中。

創(chuàng)建 ip-masq-agent

通過(guò)運(yùn)行以下 kubectl 指令創(chuàng)建 ip-masq-agent:

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

你必須同時(shí)將適當(dāng)?shù)墓?jié)點(diǎn)標(biāo)簽應(yīng)用于集群中希望代理運(yùn)行的任何節(jié)點(diǎn)。

kubectl label nodes my-node beta.kubernetes.io/masq-agent-ds-ready=true

更多信息可以通過(guò) ip-masq-agent 文檔 這里 找到。

在大多數(shù)情況下,默認(rèn)的規(guī)則集應(yīng)該足夠;但是,如果你的集群不是這種情況,則可以創(chuàng)建并應(yīng)用 ConfigMap 來(lái)自定義受影響的 IP 范圍。 例如,要允許 ip-masq-agent 僅作用于 10.0.0.0/8,你可以在一個(gè)名為 “config” 的文件中創(chuàng)建以下 ConfigMap 。

Note:
重要的是,該文件之所以被稱為 config,因?yàn)槟J(rèn)情況下,該文件將被用作 ?ip-masq-agent? 查找的主鍵:
nonMasqueradeCIDRs:
  - 10.0.0.0/8
resyncInterval: 60s

運(yùn)行以下命令將 ConfigMap 添加到你的集群:

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

這將更新位于 ?/etc/config/ip-masq-agent? 的一個(gè)文件,該文件以 ?resyncInterval ?為周期定期檢查并應(yīng)用于集群節(jié)點(diǎn)。 重新同步間隔到期后,你應(yīng)該看到你的更改在 iptables 規(guī)則中體現(xiàn):

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

默認(rèn)情況下,本地鏈路范圍 (169.254.0.0/16) 也由 ip-masq agent 處理, 該代理設(shè)置適當(dāng)?shù)?nbsp;iptables 規(guī)則。 要使 ip-masq-agent 忽略本地鏈路, 可以在 ConfigMap 中將 ?masqLinkLocal ?設(shè)置為 true。

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


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)