0%

k8s 证书更新

由于安全性的考虑,k8s 默认生成的 https 证书,默认有效期为1年。在运维集群的过程中,这个因素一定要有所考虑。
解决这个问题的办法,有如下几个办法:

  • 定期更新证书
  • 定期升级集群,因为每次升级过程中都会更新证书
  • 改代码把生成的证书的有效期设置为10年或更长时间

手动触发更新证书的方式

注意: 手动更新证书的时候,需要每台 master 都要更新

1
2
3
4
5
6
7
8
9
10
11
12
13
14
## 检查证书有效期
kubeadm alpha certs check-expiration

## 或者
sudo openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep ' Not '

## 在一台 master 上执行更新证书的操作
kubeadm alpha certs renew all

## 再次检查证书有效期
kubeadm alpha certs check-expiration

## 在每台 master 集群都操作,或将生成的证书同步到其他 master 机器上
rsync -Pav -e "ssh -p 22" /etc/kubernetes/pki/ root@<master-ip>:/etc/kubernetes/pki/

参考:
https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/

升级集群的时候,会自动更新证书

每次升级,只允许 1.21.x ==>1.22.x 或者 1.22.x ==> 1.22.y
不允许跨多个版本的升级,比如不允许 1.14 升级到 1.16

注意:升级节点经常会遇到配置不兼容、起不来等问题,需要先在非线上环境进行验证,再操作。
kubeadm upgrade apply 在任意一台master机器操作即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 先在非主节点安装新版本的包,并确认节点状态为 READY
yum list --showduplicates kubeadm --disableexcludes=kubernetes
yum install -y kubeadm-1.22.x-0 --disableexcludes=kubernetes
yum install -y kubelet-1.22.x-0 kubectl-1.22.x-0 --disableexcludes=kubernetes

kubectl get nodes

# 在主节点安装新版本的包

# 驱逐该主 master 节点
kubectl drain <cp-node-name> --ignore-daemonsets
# 检查升级的版本
kubeadm upgrade plan
# 升级集群的配置文件
sudo kubeadm upgrade apply v1.22.x

参考:
https://kubernetes.io/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/

修改代码,将证书时间改为 30 年

安装go环境(1.12版本)

1
2
3
4
5
6
7
wget https://storage.googleapis.com/golang/go1.12.5.linux-amd64.tar.gz
tar -C /root -xzf go1.12.5.linux-amd64.tar.gz
vim ~/.bashrc
export GOPATH=/root/Go
export GOROOT=/root/go
export PATH=$PATH:$GOROOT/bin
source ~/.bashrc

重新编译kubernetes

1
2
3
4
5
6
cd /root/go/src
git clone https://github.com/kubernetes/kubernetes.git
git checkout v1.16.3#对应自己的版本
vim cmd/kubeadm/app/constants/constants.go #修改源代码
CertificateValidity = time.Hour * 24 * 365 * 100
make WHAT=cmd/kubeadm

备份原有的配置文件

1
2
cp /usr/bin/kubeadm{,.bak20210707}
cp -r /etc/kubernetes/pki{,.bak20210707}

替换原有的kubeadm

1
cp _output/bin/kubeadm /usr/bin/kubeadm

生成新的证书

1
2
cd /etc/kubernetes/pki
kubeadm alpha certs renew all