1、概述

  Kubelet 使用证书进行 Kubernetes API 的认证。 默认情况下,这些证书的签发期限为一年,所以不需要太频繁地进行更新。

  Kubernetes 包含特性 Kubelet 证书轮换, 在当前证书即将过期时, 将自动生成新的秘钥,并从 Kubernetes API 申请新的证书。 一旦新的证书可用,它将被用于与 Kubernetes API 间的连接认证。

注意: 要求 Kubernetes 1.8.0 或更高的版本。

2、启用客户端证书轮换

Kubelet 进程接收 --rotate-certificates 参数,该参数决定 Kubelet 在当前使用的 证书即将到期时,是否会自动申请新的证书。

kube-controller-manager 进程接收 --cluster-signing-duration 参数 (在 1.19 版本之前为 --experimental-cluster-signing-duration),用来控制签发证书的有效期限。

  • experimental-cluster-signing-duration=87600h0m0s # kubelet客户端证书颁发有效期设置为10年
  • feature-gates=RotateKubeletServerCertificate=true # 启用server证书颁发

注意 1:当前环境是k8s 1.21.5,Kubelet客户端证书轮换功能是默认开启的。

3、理解证书轮换配置

  当 Kubelet 启动时,如被配置为自举(使用--bootstrap-kubeconfig 参数),Kubelet 会使用其初始证书连接到 Kubernetes API ,并发送证书签名的请求。 可以通过以下方式查看证书签名请求的状态:

kubectl get csr

  最初,来自节点上 Kubelet 的证书签名请求处于 Pending 状态。 如果证书签名请求满足特定条件, 控制器管理器会自动批准,此时请求会处于 Approved 状态。 接下来,控制器管理器会签署证书, 证书的有效期限由 --cluster-signing-duration 参数指定,签署的证书会被附加到证书签名请求中。

  Kubelet 会从 Kubernetes API 取回签署的证书,并将其写入磁盘,存储位置通过 --cert-dir 参数指定。 然后 Kubelet 会使用新的证书连接到 Kubernetes API。

  当签署的证书即将到期时,Kubelet 会使用 Kubernetes API,自动发起新的证书签名请求。 该请求会发生在证书的有效时间剩下 30% 到 10% 之间的任意时间点。 同样地,控制器管理器会自动批准证书请求,并将签署的证书附加到证书签名请求中。 Kubelet 会从 Kubernetes API 取回签署的证书,并将其写入磁盘。 然后它会更新与 Kubernetes API 的连接,使用新的证书重新连接到 Kubernetes API。

注意 1:Kubelet自举模式

  在 Kubernetes 集群的安全配置中,组件之间的通信需要进行认证和授权,以确保集群的安全。Kubelet 作为节点上的关键组件,需要与 Kubernetes API Server(API 服务器)进行安全通信。这种通信通常通过 TLS 证书来实现加密和身份验证。然而,在集群初始化或节点加入集群的过程中,Kubelet 可能还没有被颁发有效的 TLS 证书。这时,Kubelet 可以采用自举(Bootstrap)机制来获取证书。自举机制允许 Kubelet 使用一个临时的、低权限的证书(或引导令牌token;或 kubeconfig 文件,其中包含了连接 API 服务器的配置信息,包括证书和密钥)来启动,并请求 API 服务器为其颁发一个长期有效的、权限更高的证书。

  当 Kubelet 启动时,如果它被配置为自举(这通常通过 --bootstrap-kubeconfig 参数实现,该参数指定了包含临时证书和 API 服务器地址的 kubeconfig 文件),它会使用这个文件中的初始证书来连接到 Kubernetes API 服务器。一旦连接成功,Kubelet 会向 API 服务器发送一个证书签名请求(Certificate Signing Request, CSR)。这个 CSR 包含了 Kubelet 的身份信息以及它希望获得的证书的信息(如有效期、用途等)。

  API 服务器收到这个 CSR 后,创建CSR资源对象,控制器会根据集群的证书颁发策略(如是否允许自动批准来自特定节点的 CSR)来处理它。如果 CSR 被批准,控制器会使用集群的证书颁发机构(Certificate Authority, CA)来签署这个请求,生成一个新的证书,并将这个证书返回给 Kubelet。Kubelet 收到新证书后,会使用它来替换初始的临时证书,从而以更高的权限和安全性与 API 服务器进行后续的通信。

注意 2:Kubernetes使用CertificateSigningRequest方式签发客户端证书详细步骤参见《Kubernetes客户端认证(三)—— Kubernetes使用CertificateSigningRequest方式签发客户端证书》这篇博文。

4、测试

(1)找一台测试node节点,查看现有客户端证书有效期

[root@member-cluster1-worker1 ~]# cd /var/lib/kubelet/pki/
[root@member-cluster1-worker1 pki]# ls
kubelet-client-2024-07-01-12-00-25.pem kubelet-client-current.pem kubelet.crt kubelet.key
[root@member-cluster1-worker1 pki]# openssl x509 -in kubelet-client-current.pem -noout -dates
notBefore=Jul 1 03:55:22 2024 GMT
notAfter=Jun 29 03:55:22 2034 GMT

(2)修改服务器时间,模拟kubelet证书即将到期

[root@member-cluster1-worker1 pki]# date
2024年 09月 05日 星期四 18:35:40 CST
[root@member-cluster1-worker1 pki]# date -s "2034-6-22"
2034年 06月 22日 星期四 00:00:00 CST

(3)重启Kubelet服务

[root@member-cluster1-worker1 pki]# systemctl restart kubelet

(4)再次查看证书有效期

注意 1: Kubelet证书的起始时间是由Kube-Controller-Manager所在服务器时间决定的。

注意 2:Kubelet的证书轮换功能是自动的,这里重启Kubelet服务是为了立马查看证书轮换效果。

Kubelet证书自动续签(为 kubelet 配置证书轮换)的更多相关文章

  1. 宝塔面板配置Let's Encrypt证书自动续签失效及解决方案

    一.背景小故事 笔者手里有个朋友交给我去日常运维项目是PHP+微信小程序,部署在Linux系统上. 这个项目是用宝塔面板去进行日常的可视化运维管理,用起来蛮香的. 如不清楚宝塔的同学,可以自行了解,这 ...

  2. LNMP安装Let’s Encrypt 免费SSL证书方法:自动安装与手动配置Nginx

    前几天介绍了最新StartSSL免费SSL申请与配置,很多人看到部落介绍SSL证书安装时总是推荐了OneinStack,因为OneinStack提供了一键添加和配置Let's Encrypt 免费SS ...

  3. iOS10 远程推送服务器所需证书以及应用授权文件配置

    推送证书制作步骤(目的:导出服务器需要的p12证书) 第一步: 打开Mac系统的"钥匙串访问"-"证书助理"-"从证书颁发机构请求证书" 取 ...

  4. StartCom 申请 SSL 证书及 Nginx HTTPS 支持配置全攻略

    来源:https://www.williamyao.com/index.php/archives/1397/ 前言 最近收到 StartCom 的邮件,数字证书即将过期,想到去年在 StartSSL ...

  5. IIS6的SSL配置,如何配置SSL到登陆页,如何将SSL证书设置成受信任的证书

    一. 申请证书1. 到受信任的机构申请 略 2. 到自建的证书服务器申请 a. 安装证书服务 通过控制面板中的“添加/删除程序”,选择“添加/删除Windows组件”.在Windows组件向导中找到“ ...

  6. [转]部署Let’s Encrypt免费SSL证书&&自动续期

    最近公司网站要用https,从自己摸索到找到国内的免费证书到选购正式的收费证书,最后老板说:太贵!不要.一脸懵逼的听老板提到Let's Encrypt证书,没办法,用呗.之前是有一些了解,国外发布的一 ...

  7. k8s实践 - 如何优雅地给kong网关配置证书和插件。

    前言 从去年上半年微服务项目上线以来,一直使用kong作为微服务API网关,整个项目完全部署于k8s,一路走来,对于k8s,对于kong,经历了一个从无到有,从0到1的过程,也遇到过了一些坎坷,今天准 ...

  8. 使用 acme.sh 签发续签 Let‘s Encrypt 证书 泛域名证书

    1. 安装 acme.sh 安装很简单, 一个命令: curl https://get.acme.sh | sh 并创建 一个 bash 的 alias, 方便你的使用 alias acme.sh=~ ...

  9. nginx下如何配置 ssl证书?腾讯云ssl证书为例!

    nginx下如何配置 ssl证书?腾讯云ssl证书为例! 目前为止,https已经成为一种趋势,想要开启https就需要ssl证书. 首先,为域名注册ssl证书. 腾讯云注册地址:https://cl ...

  10. 使用acme.sh申请&自动续期LetsEncrypt免费SSL证书(转)

    一.简介 LetsEncrypt是一个免费.自动.开放的证书颁发机构.acme.sh 实现了 acme 协议, 可以从 LetsEncrypt 生成免费的证书. 本文介绍如何使用acme.sh来签发并 ...

随机推荐

  1. Bond——大数据时代的数据交换和存储格式

    设想我们在一家很大的互联网公司做IT方面的规划.开发和维护,有以下这样的应用场景: 公司里有若干个不同的开发团队,开发语言有Java..net.Python.C++....十来种,还有很多外包团队对项 ...

  2. 什么是JS执行上下文?

    我们都知道,JS代码的执行顺序总是与代码先后顺序有所差异,当先抛开异步问题你会发现就算是同步代码,它的执行也与你的预期不一致,比如: function f1() { console.log('听风是风 ...

  3. SpringBoot 整合EasyExcel 获取动态Excel列名

    导读 最近负责消息网关,里面有个短信模板导入功能,因为不同模板编号对应不同参数,导入后的数据定时发送,涉及到Excel中列名不固定问题,于是想根据列名+值,组合成一个大JSON,具体代码如下. 引入依 ...

  4. redis基本数据结构-集合set

    redis基本数据结构-集合set 特性 一个集合键最多存储 2^32 - 1 个字符串值 元素在集合内无序(哈希表-链地址法解决冲突) 元素在集合内唯一 向集合添加元素 sadd key value ...

  5. 历代iPhone及Android手机的屏幕参数对比

    手机逻辑分辨率Point,也就是CSS像素,是进行网页适配的关键,以下是平时整理的一些备忘录数据,可以收藏. 屏幕清晰度分类 SD标清 HD高清(2倍屏) FHD全高清(3倍屏) QHD倍高清(4倍屏 ...

  6. oeasy教您玩转vim - 22 - 配置文件

    配置文件 回忆上节课内容 我们上次了解到了状态横条 通过转义表示 item 控制 item 宽度的方法 将 item 成组的方法 还有一个总开关 laststatus 但是每次都要写很长的一段话来配置 ...

  7. Jenkins如何使用CrumbIssuer防御CSRF攻击

    1.CSRF(跨站请求伪造)概述 在讲解Jenkins的跨站请求伪造(CSRF)保护机制之前,让我们首先对CSRF这一安全威胁及其重要性进行简明扼要的概述. 1.1  CSRF(跨站请求伪造)的原理 ...

  8. 【Vue】可编辑表格与三级联动下拉

    需求是给员工分配岗位,设计上是一人多岗的存在... 单位 -- 部门 -- 岗位 这样的层级 功能效果: 因为员工可以在不同的单位下任职岗位,所以这个每一个岗位都是一个独立 查询单位列表是固定的,但是 ...

  9. 强化学习中经典算法 —— reinforce算法 —— (进一步理解, 理论推导出的计算模型和实际应用中的计算模型的区别)

    在奖励折扣率为1的情况下,既没有折扣的情况下,reinforce算法理论上可以写为: 但是在有折扣的情况下,reinforce算法理论上可以写为: 以上均为理论模型. ================ ...

  10. Redis源码安装(Linux环境)

    下载源码: wget https://download.redis.io/redis-stable.tar.gz 解压: tar -xzvf redis-stable.tar.gz 编译&安装 ...