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

《Kubernetes证书篇:使用TLS bootstrapping简化kubelet证书制作》

一、背景

Master apiserver启用TLS认证后,Node节点kubelet和kube-proxy要与kube-apiserver进行通信,必须使用CA签发的有效证书才可以,当Node节点很多时,这种客户端证书颁发需要大量工作,同样也会增加集群扩展复杂度。

为了简化流程,Kubernetes引入了TLS bootstraping机制来自动颁发客户端证书,kubelet会以一个低权限用户自动向apiserver申请证书,kubelet的证书由apiserver动态签署。

所以强烈建议在Node上使用这种方式,目前主要用于kubelet,kube-proxy还是由我们统一颁发一个证书。(当机器越来越多的时候,手动的为kubelet颁发证书,还是比较麻烦的,应用这个机制就是为自动的为kubelet颁发证书)

TLS bootstrapping,使用Token时整个引导过程:

1、在集群内创建特定和Bootstrap Token Secret,或者创建token.csv内置用户声明文件
2、在集群内创建首次TLS Bootstrap申请证书的ClusterRole,后续renew kubelet client/server的ClusterROle,以及相关对应的ClusterROleBinding,并绑定到对应的组或用户
3、调整Controller Manager配置,使其能自动签发相关证书和自动清理过期的TLS Bootstrapping Token
4、生成特定的包含TLS Bootstrapping Token的bootstrap.kubeconfig以供kubelet启动时使用
5、调整Kubelet配置,使其首次启动加载bootstrap.kubeconfig并使用其中的 TLS Bootstrapping Token完成首次证书申请
6、证书被Controller Manager签署,成功下发,Kubelet 自动重载完成引导流程
7、后续Kubelet自动 renew相关证书


二、kubelet配置TLS客户端证书启动引导

2.1、启动引导认证

2.1.1、方法一:基于令牌认证文件

1、如果你希望使用令牌认证文件,你必须在kube-apiserver上使用下面的标志启用之

--token-auth-file=/etc/kubernetes/pki/token.csv

2、创建令牌认证文件并复制到 master节点的/etc/kubernetes/pki目录下

export bootstrap_token="$(head -c 6 /dev/urandom | md5sum |head -c 6).$(head -c 16 /dev/urandom | md5sum | head -c 16)"
echo "$bootstrap_token,kubelet-bootstrap,10001,\"system:bootstrappers\"" > token.csv
cp token.csv /etc/kubernetes/pki

3、生成bootstrap.kubeconfig凭证文件并复制到 master节点 和 worker节点的 /etc/kubernetes目录下

export kube_api_server="192.168.1.65:6443"
kubectl config --kubeconfig=kubelet-bootstrap.kubeconfig set-cluster kubernetes --server=https://${kube_api_server} --certificate-authority=ca.pem --embed-certs=true
kubectl config --kubeconfig=kubelet-bootstrap.kubeconfig set-credentials kubelet-bootstrap --token="$bootstrap_token"
kubectl config --kubeconfig=kubelet-bootstrap.kubeconfig set-context bootstrap --user=kubelet-bootstrap --cluster=kubernetes 
kubectl config --kubeconfig=kubelet-bootstrap.kubeconfig use-context bootstrap
cp kubelet-bootstrap.kubeconfig /etc/kubernetes

总结:

1、kubelet首次启动通过加载kubelet-bootstrap.kubeconfig文件中定义的用户token和apiserver CA证书发起CSR请求,这个token被预先内置在apiserver节点的token.csv文件中,其身份为kubelet-bootstrap用户和system:bootstrappers用户组。想要首次CSR请求成功,则还需要将kubelet-bootstrap用户和system:bootstrappers用户组与内置的ClusterRole绑定。对于CSR请求可以手动签发,也可以将system:bootstrappers用户组与ClusterRole system:certificates.k8s.io:certificatesigningrequests:nodeclient绑定实现自动签发。
2、默认签署的证书只有1年有效期,如果想要调整证书的有效期可以通过设置 kube-controller-manager 的 --experimental-cluster-signing-duration 参数实现,该参数默认值为 8760h0m0s。


2.2.2、方法二:基于启动引导令牌(Bootstrap Token)

启动引导令牌在Kubernetes集群中存储为Secret对象,被发放给各个kubelet。 你可以在整个集群中使用同一个令牌,也可以为每个节点发放单独的令牌。

1、如果你希望使用启动引导令牌,你必须在kube-apiserver上使用下面的标志启用之

--enable-bootstrap-token-auth=true

2、随机生成Token ID和Token Secret

c3047froot@k8s-master-65:~# export token_id=`head -c 6 /dev/urandom | md5sum |head -c 6`
root@k8s-master-65:~# echo $token_id
e9a59broot@k8s-master-65:~# export token_secret=`head -c 16 /dev/urandom | md5sum | head -c 16`
root@k8s-master-65:~# echo $token_secret
b5490ff78e038ba1

2、创建bootstrap-token.yaml启动引导令牌文件

启动引导令牌使用 abcdef.0123456789abcdef 的形式。 更加规范地说,它们必须符合正则表达式 [a-z0-9]{6}.[a-z0-9]{16}。令牌的第一部分是 “Token ID”,它是一种公开信息,用于引用令牌并确保不会 泄露认证所使用的秘密信息。 第二部分是“令牌秘密(Token Secret)”,它应该被共享给受信的第三方。

#1、创建bootstrap-token.yaml文件
vim bootstrap-secret.yaml
apiVersion: v1
kind: Secret
metadata:name: bootstrap-token-e9a59bnamespace: kube-system
type: bootstrap.kubernetes.io/token
stringData:token-id: e9a59btoken-secret: b5490ff78e038ba1usage-bootstrap-authentication: "true"usage-bootstrap-signing: "true"auth-extra-groups: system:bootstrappers:worker,system:bootstrappers:ingress# 2、执行yaml文件
kubectl apply -f bootstrap-token.yaml

3、生成bootstrap.kubeconfig凭证文件并复制到 master节点 和 worker节点的 /etc/kubernetes目录下

export kube_api_server="192.168.1.65:6443"
kubectl config --kubeconfig=kubelet-bootstrap.kubeconfig set-cluster kubernetes --server=https://${kube_api_server} --certificate-authority=ca.pem --embed-certs=true
kubectl config --kubeconfig=kubelet-bootstrap.kubeconfig set-credentials system:bootstrap:e9a59b --token=e9a59b.b5490ff78e038ba1
kubectl config --kubeconfig=kubelet-bootstrap.kubeconfig set-context bootstrap --user=system:bootstrap:e9a59b --cluster=kubernetes 
kubectl config --kubeconfig=kubelet-bootstrap.kubeconfig use-context bootstrap
cp kubelet-bootstrap.kubeconfig /etc/kubernetes

2.3、授权 kubelet 创建 CSR

现在启动引导节点被身份认证 为system:bootstrapping组的成员, 它需要被授权创建证书签名请求(CSR)并在证书被签名之后将其取回。 幸运的是,Kubernetes提供了一个ClusterRole,其中精确地封装了这些许可, system:node-bootstrapper。

为了实现这一点,你只需要创建ClusterRoleBinding,将system:bootstrappers组绑定到集群角色system:node-bootstrapper。

这时候kubelet还无法加入集群,因为kubelet还没有客户端证书,无法正常的连接kube-apiserver。默认Kubernetes是不允许kubelet申请证书的,需要手动授权才行。

#1、创建create-csrs-for-bootstrapping.yaml文件
vim create-csrs-for-bootstrapping.yaml
# 允许启动引导节点创建CSR
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: create-csrs-for-bootstrapping
subjects:
- kind: Groupname: system:bootstrappersapiGroup: rbac.authorization.k8s.io
roleRef:kind: ClusterRolename: system:node-bootstrapperapiGroup: rbac.authorization.k8s.io#2、执行yaml文件
kubectl apply -f create-csrs-for-bootstrapping.yaml    

2.4、自动批准kubelet证书

说明:申请下来的证书是 kubelet用于访问kube-apiserver。

# 1、创建auto-approve-csrs-for-group.yaml文件
vim auto-approve-csrs-for-group.yaml
# 批复 "system:bootstrappers" 组的所有 CSR
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: auto-approve-csrs-for-group
subjects:
- kind: Groupname: system:bootstrappersapiGroup: rbac.authorization.k8s.io
roleRef:kind: ClusterRolename: system:certificates.k8s.io:certificatesigningrequests:nodeclientapiGroup: rbac.authorization.k8s.io#2、执行yaml文件
kubectl apply -f auto-approve-csrs-for-group.yaml

2.5、自动续签kubelet证书

说明:证书即将过期时,可以续签之前申请下来的证书,也是kubelet用于访问kube-apiserver。

#1、创建auto-approve-renewals-for-nodes.yaml文件
vim auto-approve-renewals-for-nodes.yaml
# 批复"system:nodes"组的CSR续约请求
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: auto-approve-renewals-for-nodes
subjects:
- kind: Groupname: system:nodesapiGroup: rbac.authorization.k8s.io
roleRef:kind: ClusterRolename: system:certificates.k8s.io:certificatesigningrequests:selfnodeclientapiGroup: rbac.authorization.k8s.io#2、执行yaml文件
kubectl apply -f auto-approve-renewals-for-nodes.yaml    

2.6、创建服务启动文件

创建/etc/systemd/system/kubelet.service服务启动文件

vim /etc/systemd/system/kubelet.service 
[Unit]
Description=Kubernetes Kubelet
Documentation=https://github.com/kubernetes/kubernetes
After=containerd.service
Requires=containerd.service[Service]
ExecStart=/usr/local/bin/kubelet \--bootstrap-kubeconfig=/etc/kubernetes/kubelet-bootstrap.kubeconfig \--kubeconfig=/var/lib/kubelet/kubelet.kubeconfig \--config=/var/lib/kubelet/kubelet-config.yaml \--container-runtime=remote \--runtime-request-timeout=15m \--container-runtime-endpoint=unix:///run/containerd/containerd.sock \--cgroup-driver=systemd \--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.7[Install]
WantedBy=multi-user.target

字段解释:

--bootstrap-kubeconfig:首次启动向apiserver申请证书
--kubeconfig:空路径,会自动生成,后面用于连接apiserver
--config:配置参数文件
--pod-infra-container-image:管理Pod网络容器的镜像

总结:整理不易,如果对你有帮助,可否点赞关注一下?

更多详细内容请参考:企业级K8s集群运维实战

相关文章:

《Kubernetes证书篇:使用TLS bootstrapping简化kubelet证书制作》

一、背景 Master apiserver启用TLS认证后,Node节点kubelet和kube-proxy要与kube-apiserver进行通信,必须使用CA签发的有效证书才可以,当Node节点很多时,这种客户端证书颁发需要大量工作,同样也会增加集群扩展复杂度。 …...

vue+elementui+nodejs机票航空飞机航班查询与推荐

语言 node.js 框架:Express 前端:Vue.js 数据库:mysql 数据库工具:Navicat 开发软件:VScode )本系统主要是为旅客提供更为便利的机票预定方式,同时提高民航的预定机票的工作效率。通过网络平台实现信息化和网络化&am…...

将ssh发布密钥添加到服务器的ssh授权密钥中,但是为什么我仍然无法ssh登录到此服务器?

我已经将ssh发布密钥添加到服务器的ssh授权密钥中,但是为什么我仍然无法ssh登录到此服务器? 即使将ssh公钥添加到服务器的授权密钥中,您也可能无法通过SSH登录到服务器,这有几个原因: 1.服务器的authorized_keys文件的权限不正确…...

LeetCode——子串能表示从 1 到 N 数字的二进制串

1016. 子串能表示从 1 到 N 数字的二进制串 - 力扣(Leetcode) 目录 一、题目 二、题目解读 三、代码 一、题目 给定一个二进制字符串 s 和一个正整数 n,如果对于 [1, n] 范围内的每个整数,其二进制表示都是 s 的 子字符串 &…...

看火山引擎DataLeap如何做好电商治理(二):案例分析与解决方案

接上篇,以短视频优质项目为例,火山引擎DataLeap平台治理团队会去对每天发布的这种挂购物车车短视频打上标签,识别这些短视频它是优质的还是低质的,以及具体原因。一个视频经过这个模型识别之后,会给到奖惩中心去做相应…...

MySQL笔记-多表查询

本文标签 : 多表查询 事务四大特性 并发事务问题 事务隔离级别 文章目录 目录 文章目录 一、多表查询 1.多表关系 2.多表查询概念 3.多表查询的分类 4.内连接 5.外连接 6.自连接 7.联合查询 8.子查询 1.标量子查询 2.列子查询 3.行子查询 4.表子查询 9.多表查询案例练习 二…...

如何用100天时间,让CSDN的粉丝数从0狂飙到10000

2022年10月7日,正式开通了CSDN账号。但因为工作忙的原因,一直没有时间写博客文章,也没有投入精力在CSDN上。理所当然的,我的粉丝数量很稳定,一直保持着0的记录。 2023年春节假期过后,有点空闲时间了&#x…...

各种同质图神经网络模型的理论和节点表征学习任务的集合包rgb_experiment

诸神缄默不语-个人CSDN博文目录 最近更新时间:2023.5.10 最早更新时间:2023.5.10 本文仅考虑同质图setting下的模型。 对于异质图场景,可以参考我写的另一篇博文:异质图神经网络(持续更新ing…) node2ve…...

【C++进阶之路】类和对象(中)

文章目录 前言六大默认成员函数 一.构造函数性质默认构造函数构造函数(需要传参) 二.析构函数性质默认析构函数练习 三.拷贝构造函数基本性质:形参必须是引用默认拷贝构造浅拷贝深拷贝自定义类型 四.赋值运算符重载函数基本特征全局的运算符重载函数局部的运算符重载…...

AIMD 为什么收敛(tcp reno/cubic 为什么好)

TCP 拥塞控制目标是缓解并解除网络拥塞,让所有流量公平共享带宽,合在一起就是公平收敛。 AIMD(几乎所有与拥塞控制相关的协议或算法都有 AIMD 的影子,包括 RoCE,BBRv2) 为什么收敛?我一般会给出下面的老图:…...

医院智能导诊系统,医院导航解决方案

随着现代医院规模不断扩大,功能区域越来越细化,面对复杂的楼宇结构,集中的就诊人流,患者在就诊中经常会面临找不到目的地的困境,就诊体验变差。针对这个问题,一些面积和规模都比较大的医院,已经…...

【论文复现】基于区块链的分布式光伏就地消纳交易模式研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

在滴滴和字节跳动划水4年,过于真实了...

先简单交代一下吧,沅哥是某不知名211的本硕,18年毕业加入滴滴,之后跳槽到了头条,一直从事测试开发相关的工作。之前没有实习经历,算是四年半的工作经验吧。 这四年半之间他完成了一次晋升,换了一家公司&am…...

tensorflow GPU训练环境布置

tensorflow GPU训练环境布置 一、显卡驱动安装1.1 如何处理**Failed to initialize NVML: Driver/library version mismatch的问题**1.2 卸载旧的版本1.3 驱动安装 1.3.1 利用apt 安装1.3.2 手动安装 二、安装CUDA2.1 确定CUDA版本2.2 下载文件1. 找匹配版本2. 选合适的平台 2…...

理解和使用Java中的枚举

枚举是一种特殊的数据类型,用于定义一组具名的常量。Java中的枚举类型可以包含多个枚举常量,每个常量都具有唯一的名称和值。本文将详细介绍Java中的枚举,包括为什么要使用枚举、枚举的好处、如何定义和使用枚举等。 为什么要使用枚举&#…...

C++和Java:哪种语言更适合你

C和Java:哪种语言更适合你 一、引言1 背景介绍2 问题阐述3 目的和意义 二、C与Java的介绍1 C的特点和优缺点2 Java的特点和优缺点3 两种语言的比较4 选择C的理由4.1 适合底层开发的特点4.2高效的编译器和运行速度4.3 自由且灵活的语言风格4.4 良好的内存管理能力 5 …...

FE_Vue学习笔记 框架的执行流程详解

1 分析脚手架结构 (1)CLI就是 command line interface 的缩写。Vue CLI官网:Vue CLI (2)安装过程: (PS: 提前安装过node.js了,没有安装的可以打开这个:Downl…...

KingbaseES V8R6 等待事件之LWLock Buffer_IO

等待事件含义 当进程同时尝试访问相同页面时,等待其他进程完成其输入/输出(I/O)操作时,会发生LWLock:BufferIO等待事件。其目的是将同一页读取到共享缓冲区中。 每个共享缓冲区都有一个与LWLock:BufferIO等待事件相关联的I/O锁,每次都必须在共…...

桂院导航小程序 静态项目 二次开发教程

Gitee代码仓库:桂院导航小程序 先 假装 大伙都成功安装了静态项目,并能在 微信开发者工具 和 手机 上正确运行。 接着就是 将项目 改成自己的学校。 代码里的注释我就不说明了,有提到 我的学校 的文字都改成你自己的就行 1. 全局 app.json…...

即时通讯APP开发费用成本多少?

移动互联网的发展,为人们的通讯交流提供了非常多的便利,一些即时通讯APP的出现,将人与人的距离再一次缩短。通过即时通讯APP软件,人们可以随时随地了解身边发生的新鲜事物,以及和朋友探讨各类趣事,甚至可以…...

女生学大数据好找工作么

好不好找工作和性别无关,无论你是男生还是女生,找工作的时候首先要看的都是学历,然后是个人能力,其中还有一定的面试经验和简历加分项~ 不要自己先把这个性别限定死,你有能力都能找到工作,不满足企业要求都…...

02-mysql升级篇(rpm方式+压缩包升级)

文章目录 升级方式一、二进制方式安装1、下载mysql-5.7.42安装包(mysql-5.7.37升级mysql-5.7.42)2、备份数据库、my.cnf文件,停止mysql服务(重要)3、查看当前数据库版本3、上传 mysql-5.7.42-1.el7.x86_64.rpm-bundle.…...

【Java零基础入门篇】第 ④ 期 - 继承(三)

【Java零基础入门篇】第 ④ 期 - 继承(三) 博主:命运之光专栏:Java零基础入门 学习目标 1.掌握继承性的主要作用、实现、使用限制; 2.掌握this和super的含义及其用法; 3.掌握方法覆写的操作; 4.…...

Python Selenium搭建UI自动化测试框架

自动化测试是软件测试中非常重要的一部分,可以提高测试效率和测试覆盖率。在UI自动化测试中,Selenium是非常流行的工具。本文将介绍如何使用Python和Selenium搭建UI自动化测试框架。 一、环境准备 在开始搭建UI自动化测试框架之前,需要先安装…...

开发大语言模型需要数据?算法?算力?

开发大语言模型的关键是什么。最近看到不少文章为了流量,甚至连 5G 通讯都说成了是开发大语言模型的关键 其实从前面的原理介绍,不难看出,大语言模型的其中一个关键点是数据。 关键一:数据​ 训练数据主要是所谓的语料库。今天的很多语言模型的语料库主要有以下几种: …...

CSS选择器的常见用法

目录 1、CSS编写方式 2.CSS选择器 1.标签选择器 2.类选择器 3.id选择器 4.后代选择器 3.CSS属性 CSS叫做"层叠样式表",作用就是装饰网页.类似于我们平时所说的化妆。 字体、大小、间距、颜色、位置、边框、背景等等统称为样式,用来描述一个网页。 …...

Oracle EBS修改密码

FNDCPASS修改密码 用户名必须出现在FND_USER或FND_ORACLE_USERID表中。FNDCPASS实用程序和ALLRACLE功能是为应用程序用户/模式设计的。 对于FND_USER或FND_ORACLE_USERID中不存在的用户,可以使用alter命令更改密码。 查询用户是否存在FND_USER或FND_ORACLE_USERI…...

《花雕学AI》33:如何用XMind制作AI思维导图、鱼骨图和组织结构图

思维导图是一种有效的思维工具,它可以帮助我们整理信息,激发创意,提高效率。思维导图是一种以中心主题为核心,以分支结构为形式,以关键词和图像为内容的图形表示法。它可以让我们一目了然地看到知识的层次和逻辑&#…...

【rust】| 06——语言特性 | 所有权

系列文章目录 【rust】| 00——开发环境搭建 【rust】| 01——编译并运行第一个rust程序 【rust】| 02——语法基础 | 变量(不可变?)和常量 【rust】| 03——语法基础 | 数据类型 【rust】| 04——语法基础 | 函数 【rust】| 05——语法基础 | 流程控制 【rust】| 06——语言特…...

AUTOSAR入门

简介 AUTOSAR(AUTomotive Open System ARchitecture)是一种汽车软件架构标准,由德国大陆、博世、宝马等汽车及零部件制造商共同发起,拥有广泛的行业参与。其目标是为了解决汽车电子和软件系统日益复杂的问题,提高可重…...