语境。
我正在遵循基本的 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-- args
onedaemonSet
中,因此它应如下所示:containers
kube-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)