最近更新时间:2022-11-22 10:31:46
金山云容器服务的独立部署集群、托管集群中默认安装了 ip-masq-agent
,Pod 之间跨节点相互访问以及 Pod 访问同 VPC 内其他节点时将不对 Pod 的 IP 地址做 SNAT。
注:在2022年8月30日后创建的独立集群或2022年11月8日后创建的托管集群才会默认安装
ip-masq-agent
。
ip-masq-agent
以 daemonset 形式部署,在每个节点上启动一个代理程序。代理程序通过配置 iptables 规则,在将 Pod 流量发送到本集群的 Pod CIDR 或者当前 VPC 网段内时,可以选择以 Pod 自己的 IP 地址或伪装成节点的 IP 地址作为出向流量的源地址。代理程序默认每隔 60 秒从名为 ip-masq-agent-config
的 ConfigMap 中重新加载其配置,更新 iptables 规则。
代理程序配置的的 iptables 规则是在 POSTROUTING 链上添加自定义链 IP-MASQ-AGENT,通过判断 IP-MASQ-AGENT 链中每一条规则是否匹配,来决定出向流量是否需要进行伪装。
ip-masq-agent
配置文件必须使用 YAML 或 JSON 语法编写,并且包含三个可选值:
nonMasqueradeCIDRs: CIDR 表示法中的字符串列表,用于指定不需伪装的地址范围。
masqLinkLocal: 布尔值 (true / false),表示是否将流量伪装到本地链路169.254.0.0/16 前缀,默认为 true。
resyncInterval: ip-masq-agent
从磁盘重新加载配置的重试时间间隔。 例如 ‘30s’,其中 ‘s’ 是秒,‘ms’ 是毫秒。
在您新建独立集群或托管集群时,如网络模型选择 Flannel,则集群创建过程中会自动在集群中安装 ip-masq-agent
,默认不对集群 VPC 网段和 Pod CIDR 做 SNAT。例如,当容器集群的 VPC 网段和 Pod CIDR 如下所示时:
ip-masq-agent
的默认配置如下:
# kubectl get cm -n kube-system ip-masq-agent-config -o yaml
apiVersion: v1
data:
config: '{"NonMasqueradeCIDRs":["172.18.0.0/16","10.0.0.0/16"],"MasqLinkLocal":true,"ResyncInterval":"1m0s"}'
kind: ConfigMap
metadata:
name: ip-masq-agent-config
namespace: kube-system
......
上述配置的意思是:访问目的网络 10.0.0.0/16 和 172.18.0.0/16 不做 SNAT,其他网段都做 SNAT,不对网段 169.254.0.0/16 做特殊处理,同步周期为1分钟。
您可以通过以下命令,查看 ip-masq-agent
在节点上生成的iptables规则:
# iptables -t nat -L IP-MASQ-AGENT
Chain IP-MASQ-AGENT (1 references)
target prot opt source destination
RETURN all -- anywhere 172.18.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/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
纯净模式