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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/426341.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv10改进系列,YOLOv10损失函数更换为Powerful-IoU(2024年最新IOU),助力高效涨点

改进前训练结果: 改进后的结果: 摘要 边界框回归(BBR)是目标检测中的核心任务之一,BBR损失函数显著影响其性能。然而,观察到现有基于IoU的损失函数存在不合理的惩罚因子,导致回归过程中锚框扩展,并显著减缓收敛速度。为了解决这个问题,深入分析了锚框扩展的原因。针…

基于 K8S kubernetes 的常见日志收集方案

目录 1、日志对我们来说到底重不重要? 2、常见的日志收集方案 2.1 EFK 2.2 ELK Stack 2.3 ELKfilebeat 2.4 其他方案 2、elasticsearch组件介绍 3、filebeat组件介绍 3.1 filebeat和beat关系 3.2 filebeat是什么? 3.3 Filebeat工作原理 3.4 …

ELFK日志分析平台,架构和通信

整个架构,加上跳板机,总共12台机器 技术方案: 1. 配置nfs服务器,为web集群提供共享网络文件系统 # 部署 NFS 服务 [rootnfs ~]# dnf install -y nfs-utils [rootnfs ~]# vim /etc/exports /var/webroot 192.168.1.0/24(rw,…

xml重点笔记(尚学堂 3h)

XML:可扩展标记语言 主要内容(了解即可) 1.XML介绍 2.DTD 3.XSD 4.DOM解析 6.SAX解析 学习目标 一. XML介绍 1.简介 XML(Extensible Markup Language) 可扩展标记语言,严格区分大小写 2.XML和HTML XML是用来传输和存储数据的。 XML多用在框架的配置文件…

剖析 MySQL 数据库连接池(C++版)

目录 ☀️0. 前言 🌤️1. 数据库连接池概述 ⛅1.1 服务器与数据库交互 ⛅1.2 MySQL 数据库网络模型 ⛅1.3 MySQL 连接驱动安装 ⛅1.4 同步(synchronous)连接池与异步(asynchronous)连接池 ⛅1.5 同步连接池和异…

记录开发一个英语听力训练网站

背景 在当前全球经济衰退的背景下,IT相关的工作在国内的竞争也是越来越激烈,为了能够获得更多的可能性,英语的学习也许能为程序员打开一扇新的窗户,比如很多远程的工作尤其是国际化背景的工作团队,英语的协作沟通是必…

yolov8-obb中存在的一个bug

yolov8支持OBB目标检测,且能提供较好的性能。 但是最近在使用yolov8-obb的过程中,发现yolov8-obb存在一个bug。即训练数据如果包含不带旋转角度的水平目标时,训练出的模型,经常会输出垂直的检测框,需要旋转90度以后才能得到最终结果。把yolov8-obb相关的源码阅读一遍才发…

初始爬虫5

响应码: 数据处理: re模块(正则表达式) re模块是Python中用于正则表达式操作的标准库。它提供了一些功能强大的方法来执行模式匹配和文本处理。以下是re模块的一些常见用法及其详细说明: 1. 基本用法 1.1 匹配模式 …

STM32 的 RTC(实时时钟)详解

目录 一、引言 二、RTC 概述 三、RTC 的工作原理 1.时钟源 2.计数器 3.闹钟功能 4.备份寄存器 四、RTC 寄存器 1.RTC_TR(Time Register,时间寄存器) 2.RTC_DR(Date Register,日期寄存器) 3.RTC_S…

TCP 拥塞控制:一场网络数据的交通故事

从前有条“高速公路”,我们叫它互联网,而这条公路上的车辆,则是数据包。你可以把 TCP(传输控制协议)想象成一位交通警察,负责管理这些车辆的行驶速度,以防止交通堵塞——也就是网络拥塞。 第一…

【MPC】无人机模型预测控制复现Data-Driven MPC for Quadrotors项目(Part 1)

无人机模型预测控制复现Data-Driven MPC for Quadrotors项目 参考链接背景和问题方法与贡献实验结果安装ROS创建工作空间下载RotorS仿真器源码和依赖创建Python虚拟环境下载data_driven_mpc仓库代码下载并配置ACADO求解器下载并配置ACADO求解器的Python接口下载并配置rpg_quadr…

基于密码的大模型安全治理的思考

文章目录 前言一、大模型发展现状1.1 大模型技术的发展历程1.2 大模型技术的产业发展二、大模型安全政策与标准现状2.1 国外大模型安全政策与标准2.2 我国大模型安全政策与标准前言 随着大模型技术的迅速发展和广泛应用,其安全性问题日益凸显。密码学作为网络空间安全的核心技…

如何简化机器人模型,加速仿真计算与可视化

通常,我们希望将自己设计的机器人模型导入仿真环境。由于是通过 CAD 软件设计的,导出的 urdf 使用 STL 或 DAE 文件来表示 3D 几何。但原始的 STL 或 DAE 文件通常过于复杂(由数十万个三角面片组成),这会减慢仿真速度,有时也会导致仿真软件报错(如Webots)。为了在正确描述…

【Linux】调试和Git及进度条实现

这里是阿川的博客,祝您变得更强 ✨ 个人主页:在线OJ的阿川 💖文章专栏:Linux入门到进阶 🌏代码仓库: 写在开头 现在您看到的是我的结论或想法,但在这背后凝结了大量的思考、经验和讨论 目录 1.…

KVM创建的虚拟机无法访问外网

基础环境如下: [rootlocalhost ~]# virsh domifaddr CentOS7_YFName MAC address Protocol Address -------------------------------------------------------------------------------vnet0 52:54:00:cb:a6:0d ipv4 192.168.…

Java中的事务管理

1.1 事务管理 1.1 事务回顾 事务是一组操作的集合,它是一个不可分割的工作单位。事务会把所有的操作作为一个整体,一起向数据库提交或者是撤销操作请求。所以这组操作要么同时成功,要么同时失败。 怎么样来控制这组操作,让这组操…

OpenCV高阶操作

在图像处理与计算机视觉领域,OpenCV(Open Source Computer Vision Library)无疑是最为强大且广泛使用的工具之一。从基础的图像读取、 1.图片的上下,采样 下采样(Downsampling) 下采样通常用于减小图像的…

RabbitMQ(高阶使用)延时任务

文章内容是学习过程中的知识总结,如有纰漏,欢迎指正 文章目录 1. 什么是延时任务? 1.1 和定时任务区别 2. 延时队列使用场景 3. 常见方案 3.1 数据库轮询 优点 缺点 3.2 JDK的延迟队列 优点 缺点 3.3 netty时间轮算法 优点 缺点 3.4 使用消息…

安卓BLE蓝牙通讯

蓝牙测试demo 简介   Android手机间通过蓝牙方式进行通信,有两种常见的方式,一种是socket方式(传统蓝牙),另一种是通过GATT(BLE蓝牙)。与传统蓝牙相比,BLE 旨在大幅降低功耗。这样…

【Obsidian】当笔记接入AI,Copilot插件推荐

当笔记接入AI,Copilot插件推荐 自己的知识库笔记如果增加AI功能会怎样?AI的回答完全基于你自己的知识库余料,是不是很有趣。在插件库中有Copilot插件这款插件,可以实现这个梦想。 一、什么是Copilot? 我们知道githu…