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

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; donenode节点:
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.confcp /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-tokenttl: "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: xxxserver: xxxname: cluster.local
    contexts:
    - context:cluster: cluster.localuser: tls-bootstrap-token-username: tls-bootstrap-token-user@cluster.local
    current-context: tls-bootstrap-token-user@cluster.local
    kind: Config
    preferences: {}
    users:
    - name: tls-bootstrap-token-useruser: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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【2025】中医药健康管理小程序(安卓原生开发+用户+管理员)
  • C#基础知识-.NET,变量,容量单位,数据类型
  • MATLAB系列05:自定义函数
  • android设置实现广告倒计时功能
  • 基于协同过滤+python+django+vue的音乐推荐系统
  • MVC应用单元测试以及请求参数的验证
  • 你必须知道的C语言问题(12)
  • Linux 基础IO 1
  • LeetCode746:使用花费最小爬楼梯
  • Flutter-底部选择弹窗(showModalBottomSheet)
  • BMC 虚拟i2c访问PCA9545(switch芯片)后面的设备,为什么找不到PCA9545?
  • Leetcode 470. 用 Rand7() 实现 Rand10()
  • 【linux】kill命令
  • 【Java面向对象二】static的注意事项
  • 滑动窗口算法专题(1)
  • 【RocksDB】TransactionDB源码分析
  • CentOS6 编译安装 redis-3.2.3
  • Java新版本的开发已正式进入轨道,版本号18.3
  • JS函数式编程 数组部分风格 ES6版
  • MobX
  • Mybatis初体验
  • python学习笔记 - ThreadLocal
  • React as a UI Runtime(五、列表)
  • Spark RDD学习: aggregate函数
  • text-decoration与color属性
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 翻译:Hystrix - How To Use
  • 使用 Docker 部署 Spring Boot项目
  • 小程序测试方案初探
  • 在Docker Swarm上部署Apache Storm:第1部分
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​ubuntu下安装kvm虚拟机
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #知识分享#笔记#学习方法
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • $forceUpdate()函数
  • ( 10 )MySQL中的外键
  • (02)Hive SQL编译成MapReduce任务的过程
  • (2)STM32单片机上位机
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (LeetCode C++)盛最多水的容器
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (八)Spring源码解析:Spring MVC
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .CSS-hover 的解释
  • .Net Core缓存组件(MemoryCache)源码解析
  • .Net IOC框架入门之一 Unity
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .Net环境下的缓存技术介绍
  • .net项目IIS、VS 附加进程调试