Kubernetes,如何让kubernetes使用内部网络进行节点到节点通信?

Kubernetes,如何让kubernetes使用内部网络进行节点到节点通信?

语境。

我正在遵循基本的 kubernetes 安装这里(如果需要,可以在 Hetzner Cloud 中使用)。1 个控制器和 1 个工作者。

显然一切都很好。

  • 服务器有一个外部 IP 接口(公共 Ipv4)和一个内部 IP 接口(通常为 10.0.0.2 或 10.0.0.3)
  • 控制器上升
  • 我安装法兰绒
  • 我设置选项,kubeadm init并改变kubectl 配置仅使用内部 IP(否则会将外部 IP 显示为节点的“内部 IP”)。即
private_ipaddr=$( ifconfig eth1 | grep -i inet | head -1 | awk '{print $2}' ) #eth0 is the public Ipv4
echo "KUBELET_EXTRA_ARGS='--node-ip ${private_ipaddr}'" > /etc/sysconfig/kubelet
systemctl daemon-reload
systemctl restart kubelet

kubeadm init --apiserver-advertise-address=$private_ipaddr --pod-network-cidr=10.244.0.0/16
  • 然后我加入了工作人员,并且 api 的宣传地址确实是内部的(例如 10.0.0.3)
  • kubectl get nodes -o wide显示两个节点几分钟后就准备就绪。
  • 然后我开始部署一个 pod。这个 pod 是一个简单的 busybox 或 alpine。
  • 该 Pod 被部署在唯一的工作进程上。
  • 我尝试从已部署的 pod 访问 coredns pod 的 fqdn。这是行不通的
  • 系统上除 kubernetes 链外没有设置防火墙。如果使用内部网络,系统之间没有防火墙,而公共 ipv4 上的流量有防火墙(端口 22 除外)
  • 我发现:如果我打开服务器两个公共 ipv4 之间的防火墙,那么 pod 和 core-dns pod 之间的连接就可以正常工作。否则就不行。

这让我意识到,尽管节点 IP 设置为内部 IP,但对于通信kubernetes 仍然通过公共 ipv4 接口进行通信,而不是通过内部网络进行通信

因此问题是,我怎样才能告诉 kubernetes 只使用内部网络而不使用外部网络?

答案1

有一种观点认为,这种情况会发生。基于flannel 配置文档,有一个选项:

--iface="": 用于主机间通信的接口(IP 或名称)。默认为机器上默认路由的接口。可以多次指定以按顺序检查每个选项。返回找到的第一个匹配项。

为了传递此选项,您需要下载 yaml 中的 flannel 清单,并将此部分添加到in-- argsonedaemonSet中,因此它应如下所示:containerskube-flannel

  containers:
  - name: kube-flannel
    image: quay.io/coreos/flannel:v0.14.0
    command:
    - /opt/bin/flanneld
    args:
    - --ip-masq
    - --kube-subnet-mgr
    - --iface=interface_name

进而kubectl apply -f kube-flannel.yaml

可能需要删除法兰绒并从头开始应用。

更新:

您可以在 kube-flannel pod 日志中检查使用了哪个接口:

kubectl logs -n kube-system kube-flannel-ds-xxxxx -c kube-flannel | grep interface

对我来说,它是唯一一个网络接口:

I0611 12:21:47.303175       1 main.go:520] Determining IP address of default interface
I0611 12:21:47.303636       1 main.go:533] Using interface with name ens4 and address 10.186.0.2
I0611 12:21:47.303668       1 main.go:550] Defaulting external address to interface address (10.186.0.2)

相关内容