好久没更新笔记了,上次才更新了自己很久很久以前记录的内容,十分之一还没记录完,这次先记录点新的。最近有个项目k8s服务器要换机房,节点ip需要变更,因为不想有太大工作量所以想保证在节点ip更换后k8s集群可以保持原本内容正常启动使用,下面开始把

集群是kubeadm部署的,二进制或者其他方式部署的可作参考

原ip新ip
172.16.203.11172.16.203.84
172.16.203.12172.16.203.85
172.16.203.13172.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.yamlkube-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配置文件之后,保证更换元数据前集群还可以正常使用

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐