【发布时间】:2021-10-28 22:10:21
【问题描述】:
我试图理解为什么这个特定的socat 命令在我在仅 IPv6 的 Kubernetes 集群中运行的情况下不起作用。
Cluster 使用 Calico CNI 和 containerd 构建在 AWS 之上。使用 kubeadm 和 Kubernetes 1.21 进行配置。
我已经运行了以下socat 命令绑定到环回接口::1,
kubectl --context=$CLUSTER1 run --image=alpine/socat socat -- tcp6-listen:15000,bind=\[::1\],fork,reuseaddr /dev/null
然后我尝试将port-forward 和curl 连接到15000 端口,
kubectl --context=$CLUSTER1 port-forward pod/socat 35000:15000 --address=::1
curl -ivg http://localhost:35000
我得到了错误,
Forwarding from [::1]:35000 -> 15000
Handling connection for 35000
E0830 17:09:59.604799 79802 portforward.go:400] an error occurred forwarding 35000 -> 15000: error forwarding port 15000 to pod a8ba619774234e73f4c1b4fe4ff47193af835cffc56cb6ad1a8f91e745ac74e9, uid : failed to execute portforward in network namespace "/var/run/netns/cni-8bade2c1-28c9-6776-5326-f10d55fd0ff9": failed to dial 15000: dial tcp4 127.0.0.1:15000: connect: connection refused
它正在收听15000,
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 ::1:15000 :::* LISTEN 1/socat
但是,如果我运行以下它可以正常工作,
kubectl --context=$CLUSTER1 run --image=alpine/socat socat -- tcp6-listen:15000,bind=\[::\],fork,reuseaddr /dev/null
不确定我是否理解为什么 port-forward 会因环回接口绑定 ::1 而失败,但不能完全捕获 ::。有人可以解释一下吗?
【问题讨论】:
-
能否在您的帖子中添加以下信息:您是如何设置 Kubernetes 集群的(一些云解决方案、裸机等)?您使用的是哪个 CNI 和容器运行时?
-
@MikolajS。添加了更多信息。如果需要,甚至可以分享我的 github 项目,但它专门用于部署多集群。
-
您可以分享您的 GitHub 项目,这样会更容易理解整体用例,因为我想知道它现在的用例是什么? ;) 据我所知,
socat的大部分用法都与 Docker 严格相关。 -
无论如何,我有几个问题 - 您是否在集群上以某种方式配置/启用了 IPv6?如果是,如何?您是否能够通过运行
ping -6 ::1在 pod 上成功 ping IPv6 localhost?你从kubectl port-forward发送的日志——你确定你没有剪掉它们吗——似乎没有关于 IPv6 转发的信息——应该还有类似connect: connection refused IPv6 dial tcp6: address localhost: no suitable address found的东西。 -
@MikolajS。抱歉迟到了。是的,我确实收到“拨号 tcp6:地址 localhost:找不到合适的地址”。这是作为 github.com/containerd/containerd/blame/main/pkg/cri/server/… 的一部分在 containerd 中引入的修复程序
标签: kubernetes kubectl portforwarding socat