客户又又有更换网段的需求了,第一次接到要更换网段的时候已经更换了etcd集群已经无法启动了,由于当时技术有限只能通过重置的方式了。年后又又说要更换网段了,这次还好在更换前我已经知道了还能在etcd集群正常的时候更新里面的集群信息。
本来打算“在线”“无感知”迁移的,但是由于两个VLAN不能互通没办法只好在更新了etcd集群信息后等啊等那边的网管将网段切过去了。
假设原IP信息是:
IP | 主机名 |
---|---|
10.10.100.1 | master01 |
10.10.100.2 | master02 |
10.10.100.3 | master03 |
更换后:
IP | 主机名 |
---|---|
10.20.100.1 | master01 |
10.20.100.2 | master02 |
10.20.100.3 | master03 |
一、修改etcd集群信息
先使用命令查看etcd集群信息:
etcdctl --endpoints http://10.20.100.1:2379 member list
然后可以看到输出的集群信息:
336ed971fc853b2d: name=master01 peerURLs=http://10.20.100.1:2380 clientURLs=http://10.20.100.1:2379 isLeader=true 0c29405aeda0656d: name=master02 peerURLs=http://10.20.100.2:2380 clientURLs=http://10.20.100.2:2379 isLeader=false 9af99013de5a8ec1: name=master03 peerURLs=http://10.20.100.3:2380 clientURLs=http://10.20.100.3:2379 isLeader=false
然后使用update更新节点IP
etcdctl member update <memberID> <peerURLs>
比如:
etcdctl --endpoints http://10.20.100.1:2379 member update 9af99013de5a8ec1 http://10.20.100.3:2380
都进行更新新IP后还需要将对应etcd.service
里面的IP进行相应修改,并让其重载。
二、修改Kubernetes里面的配置文件的IP
1.修改/etc/kubernetes
下的admin.conf
、controller-manager.conf
、kubelet.conf
、scheduler.conf
。
2.修改/etc/kubernetes/manifests
下的kube-apiserver.yaml
、kube-controller-manager.yaml
、kube-scheduler.yaml
文件的IP。
3.修改/root/.kube/
下config
文件的IP。
4.重命名/home/root2/.kube/cache/discovery
下的文件夹为新的IP。
三、重新生成证书(用于 Kubernetes APIServer 证书更新)
1.导出K8s集群初始化时的信息:
kubectl -n kube-system get configmap kubeadm-config -o jsonpath='{.data.ClusterConfiguration}' > kubeadm.yaml
2.更新kubeadm.yaml
里面certSANs:
的IP或者主机名信息。
3.备份原有的证书(更新证书只需要移走备份API Server的证书,保险起见全部备份,但是移走差不多算是全部都更新了。)
mv /etc/kubernetes/pki/
4.更新证书(全部证书)
kubeadm alpha certs renew all --config kubeadm.conf
or
假设100.20.100.100是浮动地址
kubeadm alpha phase certs apiserver --apiserver-advertise-address 10.20.100.100 --apiserver-cert-extra-sans 10.20.100.1 --apiserver-cert-extra-sans 10.20.100.2 --apiserver-cert-extra-sans 10.20.100.3 --apiserver-cert-extra-sans master01 --apiserver-cert-extra-sans master02 --apiserver-cert-extra-sans master03
5.查看证书
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text
四、只更新部分证书
[root@master01 ~]# kubeadm alpha certs renew -h This command is not meant to be run on its own. See list of available subcommands. Usage: kubeadm alpha certs renew [flags] kubeadm alpha certs renew [command] Available Commands: all renew all available certificates apiserver Generates the certificate for serving the Kubernetes API apiserver-etcd-client Generates the client apiserver uses to access etcd apiserver-kubelet-client Generates the Client certificate for the API server to connect to kubelet etcd-healthcheck-client Generates the client certificate for liveness probes to healtcheck etcd etcd-peer Generates the credentials for etcd nodes to communicate with each other etcd-server Generates the certificate for serving etcd front-proxy-client Generates the client for the front proxy Flags: -h, --help help for renew Global Flags: --log-file string If non-empty, use this log file --rootfs string [EXPERIMENTAL] The path to the 'real' host root filesystem. --skip-headers If true, avoid header prefixes in the log messages -v, --v Level number for the log level verbosity Use "kubeadm alpha certs renew [command] --help" for more information about a command.
参数 | 用途(原文) | 用途(渣翻) |
---|---|---|
all | renew all available certificates | 更新所有证书 |
apiserver | Generates the certificate for serving the Kubernetes API | 生成Kubernetes API(apiserver)证书 |
apiserver-etcd-client | Generates the client apiserver uses to access etcd | 生成apiserver访问etcd的证书 |
apiserver-kubelet-client | Generates the client certificate for liveness probes to healtcheck etcd | 生成用于etcd健康检查的证书(?) |
etcd-peer | Generates the credentials for etcd nodes to communicate with each other | 生成etcd集群间通信证书 |
etcd-server | Generates the certificate for serving etcd | 生成用于提供etcd的证书 |
front-proxy-client | Generates the client for the front proxy | 生成front-proxy-client服务证书 |
五、总结
貌似重新生成全部证书后需要将ca.crt
、ca.key
、sa.key
、sa.pub
更新到其他节点。
只需要将ca.crt
更新到工作节点,当然多主控的话还是需要将全部生成的更新到全部主控节点。
重启k8s
service kubelet restart
六、参考
实际上来说当时为了更换集群IP又不想重置的方法而找了一堆教程(感觉难点在于证书是旧的IP导致切换后无法使用),由于时间久远只能贴出几个参考了。
最后怎么更新的也不太记得了只知道最后因为节点信息是旧IP而全部重置(不删除etcd和docker images)了。
更新一个10年有效期的 Kubernetes 证书
https://cloud.tencent.com/developer/article/1689059
更新 Kubernetes APIServer 证书
https://cloud.tencent.com/developer/article/1692477
有时使用命令的-h帮助还是不错的嘛!
不过使用kubectl edit node
命令能不能更新节点IP呢?有没有知道的或者要等下次有机会再试试了。(还是不要这么折腾了吧~~~滑稽~~~)
ChiuYut
2021年3月27日