【问题标题】:iptables rules for kube-dnskube-dns 的 iptables 规则
【发布时间】:2021-09-11 18:07:07
【问题描述】:

我查看了kube-dns使用的iptables规则,我对子链“KUBE-SEP-V7KWRXXOBQHQVWAT”有点困惑,这个子链的内容如下:
我的问题是为什么当源 IP 地址(172.168.1.5)是 kube-dns IP 地址时我们需要目标“KUBE-MARK-MASQ”。根据我的理解,目标 IP 地址应该是 kube-dns pod 的地址 172.168.1.5,而不是源 IP 地址。因为所有的 DNS 查询都来自其他地址(服务),DNS 查询不能来自它自己。

# iptables -t nat -L KUBE-SEP-V7KWRXXOBQHQVWAT
Chain KUBE-SEP-V7KWRXXOBQHQVWAT (1 references)
target     prot opt source               destination
KUBE-MARK-MASQ  all  --  172.18.1.5           anywhere             /* kube-system/kube-dns:dns-tcp */
DNAT       tcp  --  anywhere             anywhere             /* kube-system/kube-dns:dns-tcp */ tcp to:172.18.1.5:53

这是完整的链信息

# iptables -t nat -L KUBE-SERVICES
Chain KUBE-SERVICES (2 references)
target     prot opt source               destination
KUBE-MARK-MASQ  tcp  -- !172.18.1.0/24        10.0.62.222          /* kube-system/metrics-server cluster IP */ tcp dpt:https
KUBE-SVC-QMWWTXBG7KFJQKLO  tcp  --  anywhere             10.0.62.222          /* kube-system/metrics-server cluster IP */ tcp dpt:https
KUBE-MARK-MASQ  tcp  -- !172.18.1.0/24        10.0.213.2           /* kube-system/healthmodel-replicaset-service cluster IP */ tcp dpt:25227
KUBE-SVC-WT3SFWJ44Q74XUPR  tcp  --  anywhere             10.0.213.2           /* kube-system/healthmodel-replicaset-service cluster IP */ tcp dpt:25227
KUBE-MARK-MASQ  tcp  -- !172.18.1.0/24        10.0.0.1             /* default/kubernetes:https cluster IP */ tcp dpt:https
KUBE-SVC-NPX46M4PTMTKRN6Y  tcp  --  anywhere             10.0.0.1             /* default/kubernetes:https cluster IP */ tcp dpt:https
KUBE-MARK-MASQ  udp  -- !172.18.1.0/24        10.0.0.10            /* kube-system/kube-dns:dns cluster IP */ udp dpt:domain
KUBE-SVC-TCOU7JCQXEZGVUNU  udp  --  anywhere             10.0.0.10            /* kube-system/kube-dns:dns cluster IP */ udp dpt:domain
KUBE-MARK-MASQ  tcp  -- !172.18.1.0/24        10.0.0.10            /* kube-system/kube-dns:dns-tcp cluster IP */ tcp dpt:domain
KUBE-SVC-ERIFXISQEP7F7OF4  tcp  --  anywhere             10.0.0.10            /* kube-system/kube-dns:dns-tcp cluster IP */ tcp dpt:domain
KUBE-NODEPORTS  all  --  anywhere             anywhere             /* kubernetes service nodeports; NOTE: this must be the last rule in this chain */ ADDRTYPE match dst-type LOCAL
# iptables -t nat -L KUBE-SVC-ERIFXISQEP7F7OF4
Chain KUBE-SVC-ERIFXISQEP7F7OF4 (1 references)
target     prot opt source               destination
KUBE-SEP-V7KWRXXOBQHQVWAT  all  --  anywhere             anywhere             /* kube-system/kube-dns:dns-tcp */ statistic mode random probability 0.50000000000
KUBE-SEP-BWCLCJLZ5KI6FXBW  all  --  anywhere             anywhere             /* kube-system/kube-dns:dns-tcp */
# iptables -t nat -L KUBE-SEP-V7KWRXXOBQHQVWAT
Chain KUBE-SEP-V7KWRXXOBQHQVWAT (1 references)
target     prot opt source               destination
KUBE-MARK-MASQ  all  --  172.18.1.5           anywhere             /* kube-system/kube-dns:dns-tcp */
DNAT       tcp  --  anywhere             anywhere             /* kube-system/kube-dns:dns-tcp */ tcp to:172.18.1.5:53

【问题讨论】:

    标签: kubernetes iptables


    【解决方案1】:

    您可以将 iptables 中的 kubernetes 服务路由视为以下步骤:

    1. 通过持有所有 Kubernetes 服务的链循环
    2. 如果你找到匹配的服务地址和IP,就去服务链
    3. 服务链将从端点列表中随机选择一个端点(使用概率)
    4. 如果所选端点与流量的源地址具有相同的 IP,请稍后将其标记为 MASQUERADE(这是您询问的 KUBE-MARK-MASQ)。换句话说,如果一个 pod 尝试与一个服务 IP 对话并且该服务 IP “解析”到 pod 本身,我们需要稍后将它标记为 MASQUERADE(实际 MASQUERADE 目标在 POSTROUTING 链中,因为它只允许在那里发生)
    5. 对选定的端点和端口执行 DNAT。无论 3) 是否发生,都会发生这种情况。

    如果您查看iptables -t nat -L POSTROUTING,将会有一条规则正在寻找标记的数据包,而这正是 MASQUERADE 实际发生的地方。

    KUBE-MARK-MASQ 规则必须存在的原因是为了发夹式 NAT。详细原因是一个有点复杂的解释,但这是我的最佳尝试:

    如果 MASQUERADE没有发生,流量将离开 pod 的网络命名空间为 (pod IP, source port -> virtual IP, virtual port),然后被 NAT 到 (pod IP, source port-> pod IP, service port) 并立即发送回 pod。因此,此流量将到达源为(pod IP, source port) 的服务。因此,当此服务回复时,它将回复(pod IP, source port) pod(实际上是内核)期望流量返回到它最初将流量发送到的相同 IP 和端口,这是(virtual IP, virtual port),因此在返回的路上流量会被丢弃。

    【讨论】:

      猜你喜欢
      • 2015-05-22
      • 2019-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-31
      • 2019-01-31
      • 1970-01-01
      • 2019-02-28
      相关资源
      最近更新 更多