修改Kubernetes Master IP

可能会遇到需要修改Kubernetes Mater IP地址的场景:

  • 我在最初部署 创建单一控制平面(单master)集群 时,由于GFW的存在,在安装部署Kubernetes集群时需要启动 OpenConnect VPN ,但这带来一个问题:如果你是直接在Kubernetes节点上启用VPN,会导致增加了一个 tun0 网络接口,并且由于这个接口启用了默认路由,导致 kubeadm init 会将这个接口作为Kubernetes集群的control panel地址。

  • 服务器搬迁或者云服务器采用动态IP地址分配,重启服务器后主机IIP变化。

Master IP变化的影响

/etc/kubenetes 目录下所有涉及接口IP的配置文件可以通过以下方式找出一一修订:

cd /etc/kubernetes
grep -R 192.168.101.81 *

但是,实际上 kubeadm init 签发的证书是包含服务器IP地址的,所以 kubectl 访问API服务器会提示错误:

Unable to connect to the server: x509: certificate is valid for 10.96.0.1, 192.168.101.81, not 192.168.122.11

备注

最好的初始化Kubernetes集群采用主机名方式,这样或许可以使得证书签发仅涉及主机名(域名),则可以方便后续调整master服务器IP地址。后续可以尝试验证。

修正Master IP

参考 Changing master IP address 中 valerius257 的解决方法:

systemctl stop kubelet docker

cd /etc/

# backup old kubernetes data
mv kubernetes kubernetes-backup
mv /var/lib/kubelet /var/lib/kubelet-backup

# restore certificates
mkdir -p kubernetes
cp -r kubernetes-backup/pki kubernetes
rm kubernetes/pki/{apiserver.*,etcd/peer.*}

systemctl start docker

# reinit master with data in etcd
# add --kubernetes-version, --pod-network-cidr and --token options if needed
# 原文使用如下命令:
# kubeadm init --ignore-preflight-errors=DirAvailable--var-lib-etcd
# 但是由于我使用的是Flannel网络,所以一定要加上参数,否则后续安装 flannel addon无法启动pod
kubeadm init --ignore-preflight-errors=DirAvailable--var-lib-etcd --pod-network-cidr=10.244.0.0/16

# update kubectl config
cp kubernetes/admin.conf ~/.kube/config

# wait for some time and delete old node
sleep 120
kubectl get nodes --sort-by=.metadata.creationTimestamp
kubectl delete node $(kubectl get nodes -o jsonpath='{.items[?(@.status.conditions[0].status=="Unknown")].metadata.name}')

# check running pods
kubectl get pods --all-namespaces

备注

如果集群具有多个master节点,并且master IP地址转换是可控硅的,可以采用轮转替换master服务求来修订IP地址。即将新的Master加入集群,下线老的Master,逐步替换。

参考