k8s高可用集群更换节点ip
好久没更新笔记了,上次才更新了自己很久很久以前记录的内容,十分之一还没记录完,这次先记录点新的。最近有个项目k8s服务器要换机房,节点ip需要变更,因为不想有太大工作量所以想保证在节点ip更换后k8s集群可以保持原本内容正常启动使用,下面开始把集群是kubeadm部署的,二进制或者其他方式部署的可作参考。
好久没更新笔记了,上次才更新了自己很久很久以前记录的内容,十分之一还没记录完,这次先记录点新的。最近有个项目k8s服务器要换机房,节点ip需要变更,因为不想有太大工作量所以想保证在节点ip更换后k8s集群可以保持原本内容正常启动使用,下面开始把
集群是kubeadm部署的,二进制或者其他方式部署的可作参考
原ip | 新ip |
---|---|
172.16.203.11 | 172.16.203.84 |
172.16.203.12 | 172.16.203.85 |
172.16.203.13 | 172.16.203.86 |
单master集群
master节点
1、修改/etc/hosts解析(所有节点)
vim /etc/hosts
k8s-master 10.0.0.10
k8s-node-1 10.0.0.11
k8s-node-2 10.0.0.12
这一步最后改也无妨,不影响
2、备份
# 更改前先备份以防万一,每个节点都需要备份
cp -r /etc/kubernetes{,-bak}
cp -r /var/lib/etcd{,-bak}
# etcd数据备份,每个节点都备份
alias etcdctl='etcdctl --endpoints=https://172.16.203.11:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key'
etcdctl snapshot save snapshot.db
3、修改集群初始化配置文件
kubeadm config view > /root/kubeadm.yaml
这会生成集群初始化配置文件中的clusterConfiguration
部分,但实际我们还需要initConfiguration
部分内容,主要是
localAPIEndpoint
指定的advertiseAddress
当然你可以直接使用你初始化集群时指定的yaml文件
修改内容如下
cat kubeinit.yaml
...
# 此处ip需要修改
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 172.16.203.86
...
---
apiServer:
# 此处ip需要修改
certSANs:
- 172.16.203.84
- 172.16.203.85
- 172.16.203.86
- k8s-1
- k8s-2
- k8s-master03
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 172.16.203.84:6443
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: 172.16.203.84:5000
kind: ClusterConfiguration
kubernetesVersion: v1.18.2
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16
serviceSubnet: 10.96.0.0/12
scheduler: {}
certSANs 设置 API 服务器签署证书所用的额外主体替代名(Subject Alternative Name,SAN)
serverCertSANs 为 etcd 服务器的签名证书设置额外的 主体替代名(Subject Alternative
Names,SAN) peerCertSANs 为 etcd 的对等端签名证书设置额外的 主体替代名(Subject Alternative
Names,SAN)
4、修改configmap配置
kubectl get cm -n kube-system
查看原本配置中哪里用到了老的ip,更新为新的
正常需要修改的为
kubeadm-config
kube-proxy
kubeadm-config也可以通过如下命令直接修改
kubeadm init phase upload-config kubeadm --config kubeadm.yaml
5、修改/etc/kubernetes/menifests/目录下文件的ip地址
主要修改etcd.yaml
和kube-apiserver.yaml
6、更新证书及kubeconfig
查看原本证书内容哪些包含了老的ip地址
for i in $(find /etc/kubernetes/pki -type f -name "*.crt");do echo ${i} && openssl x509 -in ${i} -text | grep 'Address'; done
# 删除旧证书
rm -rf /etc/kubernetes/pki/{apiserver.key,apiserver.crt}
rm -rf /etc/kubernetes/pki/etcd/{peer*,server*}
# 生成新的
kubeadm init phase certs all --config kubeinit.yaml
# 删除原本的conf文件
rm -rf /etc/kubernetes/*.conf
# 生成新的
kubeadm init phase kubeconfig all --config kubeinit.yaml
7、验证
将新的admin.conf
拷贝到/root/.kube/
目录下替换掉原本的config文件
systemctl restart docker kubelet
kubectl get nodes
报错:
Error from server: error dialing backend: dial tcp 172.16.203.84:10250: connect: no route to host
如果遇到类似报错,可以先查看一下kubelet证书内容,一般都是hosts文件未修改或者修改错了
node节点
node节点只需要修改kubelet.conf文件里的ip地址便可
多master高可用集群
master节点
重点来了,高可用集群修改要比单节点复杂一些,复杂的点在于etcd
此处执行的步骤在单节点步骤中第四步之后
首先kubeadm部署的集群可以看到三个主节点的etcd.yaml文件配置并不相同,在初始化第一个master节点时,etcd还是单节点模式,而在后面的master节点加入集群后,kubeadm会调用etcdctl member add
等命令去扩展etcd集群,所以像单master的集群那样修改ip后可以发现重启后etcd一直在报错,并且地址还是老的ip地址,那是因为etcd集群中的元数据信息还未更改
当然了,使用kubeadm reset命令并不会导致etcd集群节点从三个变回两个
# 进入etcd容器内部
alias etcdctl='etcdctl --endpoints=https://172.16.203.11:2379,https://172.16.203.12:2379,https://172.16.203.13:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key'
etcdctl member list -w table
etcdctl endpoint status -w table
修改集群元数据信息,更改三个节点
etcdctl member update [$id] --peer-urls=[nodeip]
更改完元数据信息后再像前面那样更换ip就可以保证集群在更换ip地址后正常启动了,不然可能会相当麻烦,所以此处执行步骤放在更改cm配置文件之后,保证更换元数据前集群还可以正常使用
更多推荐
所有评论(0)