k8s证书过期处理

证书一共分为

  • 根CA(ca.crt)

  • master各组件的证书(包括etcd、apiserver、front-proxy、controller-manager等各种)

  • kubelet证书

k8s证书有效期说明:

1、原生版本有效期

master节点:
/etc/kubernetes/ssl/apiserver.crt                #1年有效期
/etc/kubernetes/ssl/front-proxy-ca.crt           #10年有效期
/etc/kubernetes/ssl/ca.crt                       #10年有效期
/etc/kubernetes/ssl/front-proxy-client.crt       #1年有效期
/etc/kubernetes/ssl/etcd/ca.pem                  #10年有效期
/etc/kubernetes/ssl/apiserver-kubelet-client.crt #1年有效期

node节点:
/var/lib/kubelet/pki/kubelet-client-current.pem  #1年有效期


2、DET K8S版本(注意采用邮件发的新包,20190821及之前版本可能存在node节点kubelet证书等问题)

master节点:
/etc/kubernetes/ssl/apiserver.crt                #10年有效期
/etc/kubernetes/ssl/front-proxy-ca.crt           #100年有效期
/etc/kubernetes/ssl/ca.crt                       #100年有效期
/etc/kubernetes/ssl/front-proxy-client.crt       #10年有效期
/etc/kubernetes/ssl/etcd/ca.pem                  #10年有效期
/etc/kubernetes/ssl/apiserver-kubelet-client.crt #10年有效期

node节点:
/var/lib/kubelet/pki/kubelet-client-current.pem  #10年有效期

3、证书有效期查看命令

master节点:
for i in $(find /etc/kubernetes -type f -name "*.crt");do  echo "crt: $i" &&  openssl x509 -in $i -noout -text|grep Not; done
for i in $(find /etc/kubernetes -type f -name "*.pem");do  echo "crt: $i" &&  openssl x509 -in $i -noout -text|grep Not; done

node节点:
openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem   -noout -dates

其中,根CA和master各组件证书默认已经改成了100年,kubelet证书改成了10年且有自动轮换

在一些用老包部署的环境里,可能出现证书过期问题,需要按如下操作解决证书问题。

检查

全部证书过期时间检查命令

master节点:
for i in $(find /etc/kubernetes -type f -name "*.crt");do  echo "crt: $i" &&  openssl x509 -in $i -noout -text|grep Not; done
for i in $(find /etc/kubernetes -type f -name "*.pem");do  echo "crt: $i" &&  openssl x509 -in $i -noout -text|grep Not; done
node节点:
openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem   -noout -dates

场景1、集群整体证书已经到期

说明:证书更新会影响到K8s和docker服务,业务服务会出现一段时间不对外提供服务

0.替换所有节点的kubeadm二进制,默认是1年的二进制文件

注意,这里是k8s1.12版本的kubeadm,如果需要1.16或者1.18版本的kubeadm自行下载

mv /usr/local/bin/kubeadm /usr/local/bin/kubeadm-bak #备份旧的kubeadm
cp kubeadm /usr/local/bin/kubeadm #将新的kubeadm二进制文件放到对应位置
chmod +x /usr/local/bin/kubeadm

1.在第一个master节点更换证书和配置

  • 备份/etc/kubernetes/ssl目录,生成新证书,然后把etcd证书拷贝到此目录

    cp -r /etc/kubernetes/ssl /etc/kubernetes/ssl-bak

    根据不同版本执行不同的证书更新命令

    如默认1.12版本使用如下命令

    kubeadm alpha phase certs all --config /etc/kubernetes/kubeadm-config.v1alpha3.yaml

    如1.16版本执行

    kubeadm alpha certs renew all --config /etc/kubernetes/kubeadm-config.yaml
    cp -r /etc/ssl/etcd/ssl/ /etc/kubernetes/ssl/etcd/

  1. 然后把第一台master节点的证书拷贝到其他的master节点

  2. 在所有master节点操作如下

  • 备份旧.conf文件,重新生成.conf文件,并拷贝到/root/.kube/config

    cd /etc/kubernetes
    ls |grep conf$ | xargs -I{} mv /etc/kubernetes/{} {}.bak
    ## 根据不同版本执行不同的证书更新命令
    ## 如默认1.12版本使用如下命令
    kubeadm alpha phase kubeconfig all --config /etc/kubernetes/kubeadm-config.v1alpha3.yaml
    
    
    ## 如1.16版本执行:
    kubeadm alpha kubeconfig user --client-name=admin
    kubeadm alpha kubeconfig user --org system:masters --client-name kubernetes-admin  > /etc/kubernetes/admin.conf
    kubeadm alpha kubeconfig user --client-name system:kube-controller-manager > /etc/kubernetes/controller-manager.conf
    kubeadm alpha kubeconfig user --org system:nodes --client-name system:node:$(hostname) > /etc/kubernetes/kubelet.conf
    kubeadm alpha kubeconfig user --client-name system:kube-scheduler > /etc/kubernetes/scheduler.conf
    
    cp /etc/kubernetes/admin.conf /root/.kube/config
    
    复制代码
    重启 systemctl restart kubelet &&systemctl restart docker

4.在第一台master节点操作重新生成token(如果集群中只有master节点,或者只有master与node节点混合的节点,则不需要操作第4点)

  • 将ca证书拷贝到node节点,并将node重新加入集群(注意这里的node节点是非master节点,不需要对既是master节点又是node节点进行操作)

    $ scp /etc/kubernetes/ssl/ca.crt root@[node节点]:/etc/kubernetes/ssl/
    $ kubectl delete nodes [worker-nodes]
    $ kubeadm token create --config /etc/kubernetes/kubeadm-config.v1alpha3.yaml
    
  • 需要更新kubeadm cluster-info

  $ kubeadm alpha phase bootstrap-token cluster-info --kubeconfig /etc/kubernetes/admin.conf
  [bootstraptoken] creating the "cluster-info" ConfigMap in the "kube-public" namespace
  1. 在node节点(非master节点,不需要对既是master节点又是node节点进行操作)

备份bootstrap-kubelet.conf和kubelet.conf

cd /etc/kubernetes/
mv kubelet.conf kubelet.conf.bak
mv bootstrap-kubelet.conf bootstrap-kubelet.conf.bak

将新生成的token更新到/etc/kubernetes/kubeadm-client.v1alpha3.conf

discoveryToken: 55ovb3.up3t22u5a0c9p1sy
tlsBootstrapToken: 55ovb3.up3t22u5a0c9p1sy
token: 55ovb3.up3t22u5a0c9p1sy

在node节点,重新加入到集群

$ kubeadm join --config /etc/kubernetes/kubeadm-client.v1alpha3.conf --ignore-preflight-errors=all

以上所有操作在所有节点完成之后,在master节点确认

kubectl get nodes显示node Ready,然后再进行以下操作

6.在ansible controller节点上操作(需要使用最新的kubespray代码)最新地址:http://10.130.22.17:8000/kubespray/kubespray-code-20200508.tgz

修改hosts.ini和environment.yml(将之前的hosts.ini和environment.yml替换新代码库里的对应文件)-注意老的代码库里的enviroment文件修改为environment.yml文件

更新完成之后,需要更新k8s集群所有的secret,要不然pod会因为token失效连接不到证书

tar -zxvf kubespray-code-20200508.tgz
cd kubespray/
ansible-playbook -i inventory/mycluster/hosts.ini recover.yml --become --become-user=root -e @environment.yml -e gpu_share_enabled=false --tags rotate_tokens

默认会把kubespray自带的组件进行更新,业务组件需要业务人员进行手动查看token是否过期,如果过期则进行kubectl delete secret xxx重建

场景2、只node节点kubelet证书到期或者即将到期,其他证书都没问题

加上客户端证书自动轮换的配置,默认情况下客户端的证书是1年的、如下操作之后证书为10年。

更新客户端的证书为证书轮换策略(若没有纯node节点则不需要进行以下操作)

k8s 1.8之后增加客户端证书自动轮换,在有效期70%-90%这个区间,也就是大概剩下37-110天(大致1-3个多月)的有效期之间,kubelet 会使用其初始证书连接到 Kubernetes API ,并发送证书签名的请求

openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem   -noout -dates  

2、验证所有节点kubelet有无开启证书自动轮换

在所有节点验证如下配置

## 执行如下命令,看输出是否有:rotateCertificates: true
cat /var/lib/kubelet/config.yaml |grep rotateCertificates

如果有,则不需要添加如下配置直接进行第三步即可。

如果没有,需要编辑/etc/kubernetes/kubelet.env增加,

--feature-gates=RotateKubeletClientCertificate=true \ 
--rotate-certificates=true \

3、选取一个master节点生成永久不失效token

首先生成一个新的token,记录这个token后面会用,生成之前需要配置token有效期为forever

  • 使用客户端证书轮换必须保证配置中token为有效的。

  • 图中1画圈的为添加部分最终效果如图:

    vim  /etc/kubernetes/kubeadm-config.v1alpha3.yaml
    ##  如果没有bootstrapTokens,则需要添加如下内容bootstrapTokens部分;如果有,则修改其中内容ttl: "0"
    apiVersion: kubeadm.k8s.io/v1alpha3
    bootstrapTokens:
    - groups:
      - system:bootstrappers:kubeadm:default-node-token
      ttl: "0"
      usages:
      - signing
      - authentication
    
    ##  生成token
    kubeadm token create --config /etc/kubernetes/kubeadm-config.v1alpha3.yaml
    ##  查看TTL失效为 forever 见图2
    kubeadm token list
    

    4、在所有node节点替换token

    vim /etc/kubernetes/bootstrap-kubelet.conf  
    ## 前面是旧token   /斜线后面是第一步生成的token替换一下  , 新token失效一定要是永久的要不然没有
    :$s/dpcrb8.xj5ukm9y904kr1nl/3rqf1x.3sdbxo8vein3br2o/g
    
    
    ## 如果不存在/etc/kubernetes/bootstrap-kubelet.conf该文件,则执行cp /etc/kubernetes/kubelet.conf /etc/kubernetes/bootstrap-kubelet.conf,然后vim /etc/kubernetes/bootstrap-kubelet.conf修改下面contexts和users部分
    apiVersion: v1
    clusters:
    - cluster:
        certificate-authority-data: xxx
        server: xxx
      name: cluster.local
    contexts:
    - context:
        cluster: cluster.local
        user: tls-bootstrap-token-user
      name: tls-bootstrap-token-user@cluster.local
    current-context: tls-bootstrap-token-user@cluster.local
    kind: Config
    preferences: {}
    users:
    - name: tls-bootstrap-token-user
      user:
        token: 3rqf1x.3sdbxo8vein3br2o
    

    重启kubelet

    复制代码

    systemctl daemon-reload

    systemctl restart kubelet

5、修改controller-manager自动轮换的证书签署时间

在所有master节点操作

编辑/etc/kubernetes/manifests/kube-controller-manager.yaml增加签署时间,默认为8760,这里把签署时间改为10年

- --experimental-cluster-signing-duration=87600h0m0s

重启kubelet和controller-manager

systemctl daemon-reload
systemctl restart kubelet


## 检查controller-manager有无重启,没有则手动delete或者docker操作下触发重启,操作如下:
kubectl get po -n kube-system|grep controller-manager
kubectl delete po {查询到的所有controller-manager pod name} -n kube-system

6、备份并让controller-manager重新生成kubelet证书

在所有node节点操作

cd /var/lib/kubelet/pki && mkdir bak-kubelet-client
mv kubelet-client-* bak-kubelet-client/
systemctl restart kubelet
相关推荐
KubeSphere 云原生2 小时前
云原生周刊:Prometheus 3.0 Beta 发布|2024.09.16
云计算·k8s·容器平台·kubesphere
耐心坚持努力�1 天前
k8s重要知识点
linux·运维·k8s·k8s重要知识点
G皮T4 天前
【Kubernetes】K8s 的鉴权管理(二):基于属性 / 节点 / Webhook 的访问控制
kubernetes·k8s·鉴权·rbac·webhook·访问控制·abac
橙子家6 天前
k8s 中的 Service 简介【k8s 系列之二】
k8s
KubeSphere 云原生6 天前
云原生周刊:OpenTofu Registry 获得用户界面和 API|2024.9.9
云计算·k8s·容器平台·kubesphere
阿珂来了9 天前
怎么安装Grafana-Loki
linux·k8s·grafana
solinger10 天前
Tekton简介,安装和构建最简单ci/cd
k8s·tekton·operator
滴石编程11 天前
云原生技术:‌引领数字化转型的新浪潮
云原生·k8s·容器自动化
王一横不要停止努力吖12 天前
ELK学习笔记(二)——使用K8S部署Kibana8.15.0
笔记·学习·elk·k8s