Kubernetes(k8s):更换集群IP网段,更新API Server证书(也可用于 Kubernetes APIServer 证书更新)

客户又又有更换网段的需求了,第一次接到要更换网段的时候已经更换了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.confcontroller-manager.confkubelet.confscheduler.conf
2.修改/etc/kubernetes/manifests下的kube-apiserver.yamlkube-controller-manager.yamlkube-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.crtca.keysa.keysa.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日

发布者

ChiuYut

咦?我是谁?这是什么地方? Ya ha!我是ChiuYut!这里是我的小破站!