问题背景
使用华北地域的两台ECS服务器搭建了k8s1.11集群,可参考:阿里云ECS搭建kubernetes1.11
角色 | 主机名 | 私网 | 公网 | 公网类型 |
master | node1.com | 172.31.2.130 | 120.27.2.2 | 固定公网 |
node | node2.com | 172.31.2.131 | 120.27.2.3 | 固定公网 |
原k8s集群节点之间使用私网通信,节点本地hosts解析如下。
node1.com 172.31.2.130
node2.com 172.31.2.131
现华东地区有一新的ECS实例,主机名为harbor(因为这个节点装了harbor),希望加入上述集群,新节点信息如下表格
备注:
node1.com和node2.com之间私网通,node1.com、node2.com的私网与harbor节点私网不通。三个节点公网可正常通信。上述ip非真实ip
角色 | 主机名 | 私网 | 公网 | 公网类型 |
node | harbor | 10.1.75.3 | 47.110.11.34 | 弹性公网 |
使用kubeadm加入节点
#参考上一篇集群安装方法添加计算节点:阿里云ECS搭建kubernetes1.11
#在harbor节点配置node1.com的解析为node1的公网ip
echo "120.27.2.2 node1.com" >> /etc/hosts
#获取加入集群需要使用的hash值 openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //' #获取加入集群需要使用的token值 kubeadm token list #如果上述命令没有token,说明已过期,通过如下命令重新生成 kubeadm token create #使用kubeadm加入集群 kubeadm join node1.com:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
#报无法从master下载kubelet配置文件,如下
[kubelet] Downloading configuration for the kubelet from the "kubelet-config-1.11" ConfigMap in the kube-system namespace
Get https://172.31.2.130:6443/api/v1/namespaces/kube-system/configmaps/kubelet-config-1.11: dial tcp 172.31.2.130:6443: i/o timeout
#上述报错信息表明,可见新增节点需要与node1.com节点的私网172.31.2.130进行通信(节点的kubelet服务需要定期上报节点状态给master)
解决思路
#思路一:node节点中,是哪里指定了与master通信的ip?找到并尝试修改这个ip为公网ip
#查看/etc/kubernetes/bootstrap-kubelet.conf文件,文件中指定了master的ip地址为私网ip,但是该文件无法直接修改(修改之后执行kubeadm join会立即恢复)
#思路二:重新安装k8s集群,集群之间节点使用公网通信,方案应该可行,由于需要重新安装集群,暂且不考虑。
#思路三:新增节点harbor与node1私网虽然不通,但是公网之间是通的,考虑NAT,可以把从harbor节点中发出的目的ip地址为172.31.2.130的数据包在流向网络前进行DNAT转换,既将目的地址转换为node1的公网ip 120.27.2.2即可
#iptables操作表nat的OUTPUT链,进行DNAT
iptables -t nat -A OUTPUT -d 172.31.2.130 -p tcp -j DNAT --to-destination 120.27.2.2
#为什么是在nat表的OUTPUT添加DNAT规则,可参考下表
#从本地应用发出的数据包所经过的链在表nat的部分只有nat:OUTPUT和nat:POSTROUTING,而DNAT这个动作只允许PREROUTING/OUTPUT
ip_tables: DNAT target: used from hooks POSTROUTING, but only usable from PREROUTING/OUTPUT
#在harbor节点测试node1私网端口6443是否通
telnet 172.31.2.130 6443
#通过上述kubeadn join方法重新加入节点成功
#查看pod状态,发现部署在harbor节点的Kube-flannel容器不断失败重启,如下
#在node1通过kubectl logs查看CrashLoopBackOff的flannel容器,报连接10.1.75.3:10250 timeout(10.1.75.3为harbor节点的私网,10250为kubelet服务监听的端口)
#参考上述DNAT,node1节点通过kubectl logs来获取harbor节点上跑的容器kube-flannel-ds-78wtf时需要与harbor节点的kubelet通信以获取日志,由于连接使用harbor私网,同样需要在node1节点做DNAT,如下
iptables -t nat -A OUTPUT -d 10.1.75.3 -p tcp -j DNAT --to-destination 47.110.11.34
#在node1添加完上述iptables规则后,通过kubectl logs查看pod日志如下:harbor节点的flannel容器连接api-server超时(10.96.0.1为kube-apiserver的cluster ip)
#由于kube-flannel pod不ready,所以调度到harbor节点的pod一直处于ContainerCreating状态,通过describe pod,报network cni plugin not found
#
遗留问题:pod ip不通;cluster ip不通
所有评论(0)