当前位置: 首页 > article >正文

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/

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

3. 在所有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

5. 在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


http://www.kler.cn/news/306808.html

相关文章:

  • Scratch植物大战僵尸【机器人vs外星人版本】
  • 【Go】Go语言中的数组基本语法与应用实战
  • RecyclerView的子项长按选择功能
  • 幼儿与非幼儿识别系统源码分享
  • 【C++】多态,要这样学
  • PFC理论基础与Matlab仿真模型学习笔记(1)--PFC电路概述
  • requests-html的具体使用方法有哪些?
  • Docker安装mysql安装nginx安装Redis
  • 蓝桥杯18小白第5题
  • labview串口大数据量报错的一种解决思路(通过tcp进行写入和读取串口数据)
  • 最小二乘估计
  • ubuntu使用wireshark抓取数据
  • 【Scala入门学习】Scala的方法和函数
  • 【Go】十五、分布式系统、Consul服务注册发现、Nacos配置中心搭建
  • Rust 赋能前端: 视频抽帧
  • 【Python】基本使用
  • 构建高效入学审核系统:Spring Boot解决方案
  • 开源模型应用落地-qwen2-7b-instruct-LoRA微调-unsloth(让微调起飞)-单机单卡-V100(十六)
  • visual studio给项目增加eigen库 手把手教程
  • AI客服机器人开启企业客户服务新纪元
  • 外网(公网)访问VMware workstation 虚拟机内web网站的配置方法---端口转发总是不成功的原因
  • 动手学深度学习(pytorch)学习记录29-网络中的网络(NiN)[学习记录]
  • wpf触发与模板的使用示例:批量生产工具
  • git 你要如何打开这个文件
  • 【nginx】缓存配置文件
  • 用Blender来烘培模型材质
  • Linux cat命令详解使用:高效文本内容管理
  • html 中如何使用 uniapp 的部分方法
  • JavaEE:文件内容操作练习(三)
  • 新能源汽车光储充一体化设计