通过建立VPN网络向集群加入外部节点所遇到的问题
- 已编辑
kevendeng 感谢dalao帮忙! 让我学到很多关于k8s网络的知识, 我总结了一下:
首先是两个网络, 节点网络和pod网络(10.233.0.0/18)( k8s要求节点网络中所有节点都是互通的,
因为我是先在服务器内网部署k8s的, 所以主节点的ip就是它的内网ip, 节点网络就是服务器内网,
后来我搭建vpn想将本地机器添加进集群, 于是就多了一个vpn网络和主节点的vpnIP,
在我通过vpn在本地节点使用kubeadm join加入集群后,
kubeadm帮我安装和配置work节点需要的pod,
此处有误已由kevendeng在楼下补充:
在kubeadm配置kube-proxy的时候应该是需要从apiserver获取主节点ip的, ( apiserver使用的主节点IP通过 --advertise-address 参数设置 (/etc/kubernetes/manifests/kube-apiserver.yaml
于是就获取了主节点ip(内网ip)并设置进kube-proxy了,
我的kube-proxy再设置ipvs, 将10.233.0.1映射到主节点内网ip而不是vpn ip,
所以就导致本地节点的pod无法通过10.233.0.1去访问apiserver. ( 例如我的问题calico-node这个pod无法请求10.233.0.1:443 timeout.
于是在@kevendeng dalao的指导下,
我通过设置/etc/systemd/system/kubelet.service.d/10-kubeadm.conf和/etc/kubernetes/manifests/kube-apiserver.yaml将集群使用的节点网络从服务器内网切换成vpn就解决了.
最好确定集群节点使用的是什么网络, 要添加节点时要将节点加入进这个网络, 而不是新建一个网络.
在我理解的在pod网络中,不同节点的pod的通信路径:
节点1-pod1, 节点2-pod2
此处有误已由kevendeng在楼下补充:
pod1要访问pod2:
pod1 -> kube-proxy1 -> 节点2 -> kube-proxy2 -> pod2
如有错误请指出,非常感谢!
再次感谢@kevendeng dalao的帮助!!!
kevendengK零S
- 已编辑
heming
不客气,每一次Debug让我自己对K8s的了解也多了一分。
你的理解大体上是正确的,有一些细节错误,如:
在kubeadm配置kube-proxy的时候应该是需要从apiserver获取主节点ip的, ( apiserver使用的主节点IP通过 –
advertise-address 参数设置 (/etc/kubernetes/manifests/kube-apiserver.yaml
于是就获取了主节点ip(内网ip)并设置进kube-proxy了,
实际上,此Endpoint对象是由apiserver定期更新的。
kubernetes
Service IP 到 此Endpoint IP的IPVS转发规则是由kube-proxy观察到该对象后创建的。
以及:
pod1要访问pod2:
pod1 -> kube-proxy1 -> 节点2 -> kube-proxy2 -> pod2
这并不是全部情况。在K8s集群内部,主要有两个网段,一种是Pod,一种是Service,若Pod之间通过IP/(非Service)域名互相访问,并不会通过kube-proxy所设置的转发。
这些概念,以及底层运行原理,需要对K8s的网络模型更加熟悉,K8s的官方文档是一个很好的参考资料。
你提到的这一点:
最好确定集群节点使用的是什么网络, 要添加节点时要将节点加入进这个网络, 而不是新建一个网络.
确实应该这样做,网络规划应该在部署集群之前完成,如果不得不跨网络运行,VPN也应该在部署集群之前建立。
以及:建议你为此贴的标题补充上更加详细的描述,如“K8s集群部署后,通过建立VPN网络加入外部节点”,以便其他遇到类似问题的同学搜索。