我使用以下方式设置了 Kubernetes 集群Kubernetes 的艰难之路教程中,每当 Pod 通过 ClusterIP(发夹流量)连接到同一节点上的另一个 Pod 时,连接就会挂起。
如果我直接访问 pod,而不通过 ClusterIP,一切都可以正常工作。
因此,从视觉上看,这是行不通的:
PodA -> ServiceA ClusterIP -> PodA
PodA -> ServiceB ClusterIP -> PodB on same node
但是,这种方法 100% 有效,任何 Pod 都可以直接通过其 IP 联系另一个 Pod:
PodA -> ServiceB ClusterIP -> PodB on other node
我发现有关调试服务的 Kubernetes 文档并进行了检查,一切似乎都很好,直到Pod 无法通过 Service VIP 访问自身。
我在输出中看到为我的服务添加了规则iptables-save
(并且我确认使用iptables
模式):
-A KUBE-SERVICES ! -s 10.200.0.0/16 -d 10.32.0.10/32 -p udp -m comment --comment "kube-system/kube-dns:dns cluster IP" -m udp --dport 53 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 10.32.0.10/32 -p udp -m comment --comment "kube-system/kube-dns:dns cluster IP" -m udp --dport 53 -j KUBE-SVC-TCOU7JCQXEZGVUNU
-A KUBE-SERVICES ! -s 10.200.0.0/16 -d 10.32.0.10/32 -p tcp -m comment --comment "kube-system/kube-dns:dns-tcp cluster IP" -m tcp --dport 53 -j KUBE-MARK-MASQ
-A KUBE-SERVICES -d 10.32.0.10/32 -p tcp -m comment --comment "kube-system/kube-dns:dns-tcp cluster IP" -m tcp --dport 53 -j KUBE-SVC-ERIFXISQEP7F7OF4
我可以从 kubelet 的日志promiscuous-bridge
发夹模式标志中看到:
kubelet[12496]: I1204 04:13:29.761707 12496 flags.go:33] FLAG: --hairpin-mode="promiscuous-bridge"
我没有看到Hairpin mode set to "promiscuous-bridge"
具体确认模式的日志,因此我也在 kubelet-config.yml 中明确设置了它
另外,我编辑了 CNI 插件以添加promiscMode: true
(文档),我PROMISC
在cnio0
界面上看到:
cnio0: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST> mtu 1500
此时,我认为要么 1)本教程没有涉及发夹式流量工作,要么 2)我搞砸了一些不为人知的、导致问题的东西,但我不知道是什么!
由于这个 Kubernetes the Hard Way 教程被认为是规范的设置参考,我怀疑它是否会是第一名……有人有其他建议来确定第二名吗?
答案1
我认为抽象的“允许发夹行为”是插件的一个属性。有些插件支持它。有些插件不支持。有些插件可能需要配置才能以多种方式支持它。如果您在 Kubernetes 安装中不支持它,则一类服务行为将无法正常工作。对于某些安装来说,这可能没问题,但对于其他安装来说则不行。
不过,你可以使用绒布hairpinMode
设置为(true
默认的 flannel 配置不会设置HairpinMode
为true
)。该部分配置如下所示:
{
"name": "<name_here>",
"type": "flannel",
"delegate": {
"hairpinMode": true,
"isDefaultGateway": true
}
}
如果有帮助的话请告诉我。