【问题标题】:Kubectl port-forwarding not working for IPv6 binding with socatKubectl 端口转发不适用于与 socat 的 IPv6 绑定
【发布时间】: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-forwardcurl 连接到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


【解决方案1】:

对于那些在仅 IPv6 的 Kubernetes 集群上遇到类似问题的人来说,这是我迄今为止调查发现的内容。

背景:这似乎是与 IPv6 和 CRI 有关的一般问题。 我在我的设置中运行 containerdcontainerd 版本 1.5.0-1.5.2 添加了两个 PR(don't use socat for port forwardinguse happy-eyeballs for port-forwarding)修复了 IPv6 端口转发中的一些问题。

潜在的修复:在引入containerd 版本1.5.2(作为Ubuntu 20.04 LTS 的一部分)之后,我在端口转发时也收到了错误IPv4: dial tcp4 127.0.0.1:15021: connect: connection refused IPv6 dial tcp6: address localhost: no suitable address found。这是由解析 localhost 时的 DNS 问题引起的。因此,我使用以下命令在主机中添加了localhost 以解析为::1

sed -i 's/::1 ip6-localhost ip6-loopback/::1 localhost ip6-localhost ip6-loopback/' /etc/hosts

我认为这里的重点是检查您的容器运行时以确保支持 IPv6(tcp6 绑定)。

【讨论】:

    猜你喜欢
    • 2019-08-22
    • 2020-10-23
    • 2016-04-19
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 2014-05-25
    相关资源
    最近更新 更多