k8s 证书过期解决

K8S CA证书是10年,但是组件证书的日期只有1年,为了证书一直可用状态需要更新,目前主流的一共有3种:

1、版本升级,只要升级就会让各个证书延期1年,官方设置1年有效期的目的就是希望用户在一年内能升级1次,详见:k8s升级
2、通过命令续期 (这种只能延长一年)
3、编译源码Kubeadm,设置10年

一、查看证书过期时间

vim test.sh

for item in `find /etc/kubernetes/pki -maxdepth 2 -name "*.crt"`;
do openssl x509 -in $item -text -noout| grep Not;
echo ======================$item===============;
done

或者一个个看:

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

二、通过命令续期

master操作

1、修改机器时间模拟证书过期

date -s "2025-12-30 12:00"

证书过期报错

[root@bogon ~]# kubectl get pod -n kube-system
Unable to connect to the server: x509: certificate has expired or is not yet valid

2、备份文件:

cp -r /etc/kubernetes  /etc/kubernetes_old
cp $HOME/.kube/config /home/lihongbao/aa/config/
#mv /var/lib/kubelet/pki /var/lib/kubelet/pki.old

3、重新生成
##kubeadm config view > kubeadm.yaml
3.1 重新生成证书:
在当前目录下编辑配置文件kubeadm.conf并写入以下内容:

apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
kubernetesVersion: v1.13.0
imageRepository: my.registry:5000/google_containers

3.2 更新证书命令:

kubeadm alpha certs renew all --config kubeadm.conf

openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep ' Not '
输出:
            Not Before: May 24 03:32:37 2019 GMT
            Not After : Dec 30 12:43:03 2025 GM

3.3 重新生成配置文件:

kubeadm init phase kubeconfig all --config kubeadm.conf

3.4 更新.kube下的配置文件:

cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

3.5 重启kube-apiserver,kube-controller,kube-scheduler,etcd这4个容器:

docker ps | grep -v pause | grep -E "etcd|scheduler|controller|apiserver" | awk '{print $1}' | awk '{print "docker","restart",$1}' | bash

或者重启docker

node操作

1、先在node节点备份文件

cp /etc/kubernetes/kubelet.conf  /etc/kubernetes/kubelet.conf_bak

2、在master节点上生成kubelet.conf并拷贝到node节点上

#kubeadm init phase kubeconfig kubelet --node-name <节点名称> --kubeconfig-dir /tmp/ --apiserver-advertise-address <集群VIP>,例如:
kubeadm init phase kubeconfig kubelet --node-name test1 --kubeconfig-dir /tmp/ --apiserver-advertise-address 192.168.180.45

scp /tmp/kubelet.conf root@192.168.180.46:/etc/kubernetes/

3、重启node节点的kubelet

 systemctl restart kubelet

三、编译源码Kubeadm,设置10年

master操作

1、安装go语言。

到go中文社区https://studygolang.com/下载对应版本的go语言包,配置go环境

##下载
wget https://studygolang.com/dl/golang/go1.14.1.linux-amd64.tar.gz
tar -zxvf go1.14.1.linux-amd64.tar.gz -C /usr/local
##添加环境变量:
vim /etc/profile
export PATH=/usr/local/go/bin:$PATH
##使环境生效
source /etc/profile
##查看go语言版本
go verison

warning: GOPATH set to GOROOT (/usr/local/go) has no effect
go version go1.13.5 linux/amd64

一定要确定go语言有环境变量 不然后面编译会报错。

2、下载源码

# git下载
git clone https://github.com/kubernetes/kubernetes.git   
# 切换到v1.13.0分支
cd kubernetes && git checkout -b remotes/origin/release-1.13.0 v1.13.0           
# 浏览器打开下载
https://github.com/kubernetes/kubernetes/releases/tag/v1.13.0

3、修改时间为10年

vim staging/src/k8s.io/client-go/util/cert/cert.go # kubeadm 1.14 版本之前

k8s 证书过期解决_第1张图片

vim cmd/kubeadm/app/util/pkiutil/pki_helpers.go # kubeadm 1.14 至今

    const duration365d = time.Hour * 24 * 365 * 10
    NotAfter: time.Now().Add(duration365d).UTC()

k8s 证书过期解决_第2张图片

# 编译kubeadm    
make WHAT=cmd/kubeadm GOFLAGS=-v

#生成k8syaml文件
kubeadm config view > cluster.yaml

# 更新 kubeadm,将 kubeadm 进行替换
cp /usr/bin/kubeadm /usr/bin/kubeadm.old
cp _output/bin/kubeadm /usr/bin/kubeadm
chmod 775 /usr/bin/kubeadm

4、备份文件

cp -r /etc/kubernetes  /etc/kubernetes_old
cp $HOME/.kube/config /home/lihongbao/aa/config/
#mv /var/lib/kubelet/pki /var/lib/kubelet/pki.old

5、重新生成

5.1更新证书命令:

kubeadm alpha certs renew all --config cluster.conf

openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep ' Not '
输出:
            Not Before: May 24 03:32:37 2019 GMT
            Not After : Dec 30 12:43:03 2025 GM

5.2 重新生成配置文件:

rm -rf admin.conf controller-manager.conf kubelet.conf scheduler.conf

kubeadm init phase kubeconfig all --config cluster.conf

5.3 更新.kube下的配置文件:

cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

5.4 重启kube-apiserver,kube-controller,kube-scheduler,etcd这4个容器:

docker ps | grep -v pause | grep -E "etcd|scheduler|controller|apiserver" | awk '{print $1}' | awk '{print "docker","restart",$1}' | bash

或者重启docker

node操作

1、先在node节点备份文件

cp /etc/kubernetes/kubelet.conf  /etc/kubernetes/kubelet.conf_bak

2、在master节点上生成kubelet.conf并拷贝到node节点上

#kubeadm init phase kubeconfig kubelet --node-name <节点名称> --kubeconfig-dir /tmp/ --apiserver-advertise-address <集群VIP>,例如:
kubeadm init phase kubeconfig kubelet --node-name test1 --kubeconfig-dir /tmp/ --apiserver-advertise-address 192.168.180.45

scp /tmp/kubelet.conf root@192.168.180.46:/etc/kubernetes/

3、重启node节点的kubelet

 systemctl restart kubelet

你可能感兴趣的:(Kubernetes)