首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Kubernetes TLS bootstrapping

Kubernetes TLS bootstrapping

作者头像
看、未来
发布于 2022-06-12 08:36:42
发布于 2022-06-12 08:36:42
92700
代码可运行
举报
运行总次数:0
代码可运行

文章目录

代码语言:txt
AI代码解释
复制
- [what && why?](https://cloud.tencent.com/developer)
- [启动引导过程](https://cloud.tencent.com/developer)
    - [TLS 作用](https://cloud.tencent.com/developer)
    - [RBAC 作用](https://cloud.tencent.com/developer)
    - [kubelet 首次启动流程](https://cloud.tencent.com/developer)
    - [手动签发证书](https://cloud.tencent.com/developer)
- [几个重要术语](https://cloud.tencent.com/developer)
    - [kubelet server](https://cloud.tencent.com/developer)
    - [CSR 请求类型](https://cloud.tencent.com/developer)
- [TLS bootstrapping 主要流程细节](https://cloud.tencent.com/developer)
- [证书及配置文件作用](https://cloud.tencent.com/developer)
    - [token.csv](https://cloud.tencent.com/developer)
    - [bootstarp.kubeconfig](https://cloud.tencent.com/developer)
    - [kubelet-client.crt](https://cloud.tencent.com/developer)
    - [kubelet.crt](https://cloud.tencent.com/developer)
    - [kubelet-server.crt](https://cloud.tencent.com/developer)
    - [kubelet-client-current.pem](https://cloud.tencent.com/developer)
    - [kubelet-server-current.pem](https://cloud.tencent.com/developer)
- [官方文档](https://cloud.tencent.com/developer)

注:本篇主讲理论,一切涉及到的实践都在我的 二进制部署k8s集群 系列中。

what && why?

众所周知 TLS 的作用就是对通讯加密,防止中间人窃听;同时如果证书不信任的话根本就无法与 apiserver建立连接,更不用提有没有权限向 apiserver 请求指定内容。在开启了 TLS 的集群中,每当与集群交互的时候少不了的是身份认证,使用 kubeconfig(即证书) 和 token 两种认证方式是最简单也最通用的认证方式。

当集群开启了 TLS 认证后,每个节点的 kubelet 组件都要使用由 apiserver 使用的 CA 签发的有效证书才能与 apiserver 通讯;此时如果节点多起来,为每个节点单独签署证书将是一件非常繁琐的事情;TLS bootstrapping 功能就是让 kubelet 先使用一个预定的低权限用户连接到 apiserver,然后向 apiserver 申请证书,kubelet 的证书由 apiserver 动态签署;


启动引导过程

TLS 作用

众所周知 TLS 的作用就是对通讯加密,防止中间人窃听;同时如果证书不信任的话根本就无法与 apiserver 建立连接,更不用提有没有权限向 apiserver 请求指定内容

RBAC 作用

当 TLS 解决了通讯问题后,那么权限问题就应由 RBAC 解决(可以使用其他权限模型,如 ABAC);RBAC 中规定了一个用户或者用户组(subject)具有请求哪些 api 的权限;在配合 TLS 加密的时候,实际上 apiserver 读取客户端证书的 CN 字段作为用户名,读取 O 字段作为用户组。

从以上两点上可以总结出两点: 第一,想要与 apiserver 通讯就必须采用由 apiserver CA 签发的证书,这样才能形成信任关系,建立 TLS 连接;第二,可以通过证书的 CN、O 字段来提供 RBAC 所需的用户与用户组。


kubelet 首次启动流程

如果逻辑思维敏锐的朋友应该能从上面的表述中看出这个破绽吧,既然你要证书才能连接,那我初来乍到人生地不熟的我哪里来的证书给你啊?

这个问题实际上可以去查看一下 bootstrap.kubeconfig 和 token.csv 得到答案: 在 apiserver 配置中指定了一个 token.csv 文件,该文件中是一个预设的用户配置;同时该用户的 Token 和 apiserver 的 CA 证书被写入了 kubelet 所使用的 bootstrap.kubeconfig 配置文件中;这样在首次请求时,kubelet 使用 bootstrap.kubeconfig 中的 apiserver CA 证书来与 apiserver 建立 TLS 通讯,使用 bootstrap.kubeconfig 中的用户 Token 来向 apiserver 声明自己的 RBAC 授权身份,如下图所示

在有些用户首次启动时,可能与遇到 kubelet 报 401 无权访问 apiserver 的错误;这是因为在默认情况下,kubelet 通过 bootstrap.kubeconfig 中的预设用户 Token 声明了自己的身份,然后创建 CSR 请求;但是不要忘记这个用户在我们不处理的情况下他没任何权限的,包括创建 CSR 请求;所以需要如下命令创建一个 ClusterRoleBinding,将预设用户 kubelet-bootstrap 与内置的 ClusterRole system:node-bootstrapper 绑定到一起,使其能够发起 CSR 请求

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl create clusterrolebinding kubelet-bootstrap \
  --clusterrole=system:node-bootstrapper \
  --user=kubelet-bootstrap

手动签发证书

然后如果有跟着我一起手动安装k8s集群的朋友就知道,接下来是要我们手动去 master 节点签发 node 节点的证书了。

注:在 kubelet 首次启动后,如果用户 Token 没问题,并且 RBAC 也做了相应的设置,那么此时在集群内应该能看到 kubelet 发起的 CSR 请求

当成功签发证书后,目标节点的 kubelet 会将证书写入到 --cert-dir= 选项指定的目录中;注意此时如果不做其他设置应当生成四个文件:

kubelet 与 apiserver 通讯所使用的证书为 kubelet-client.crt,剩下的 kubelet.crt 将会被用于 kubelet server(10250) 做鉴权使用;注意,此时 kubelet.crt 这个证书是个独立于 apiserver CA 的自签 CA,并且删除后 kubelet 组件会重新生成它。


几个重要术语

kubelet server

在官方 TLS bootstrapping 文档中多次提到过 kubelet server 这个东西, 指的应该是 kubelet 的 10250 端口;

kubelet 组件在工作时,采用主动的查询机制,即定期请求 apiserver 获取自己所应当处理的任务,如哪些 pod 分配到了自己身上,从而去处理这些任务;同时 kubelet 自己还会暴露出两个本身 api 的端口,用于将自己本身的私有 api 暴露出去,这两个端口分别是 10250 与 10255;对于 10250 端口,kubelet 会在其上采用 TLS 加密以提供适当的鉴权功能;对于 10255 端口,kubelet 会以只读形式暴露组件本身的私有 api,并且不做鉴权处理

总结一下,就是说 kubelet 上实际上有两个地方用到证书,一个是用于与 API server 通讯所用到的证书,另一个是 kubelet 的 10250 私有 api 端口需要用到的证书


CSR 请求类型

kubelet 发起的 CSR 请求都是由 controller manager 来做实际签署的,对于 controller manager 来说,TLS bootstrapping 下 kubelet 发起的 CSR 请求大致分为以下三种

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
nodeclient: kubelet 以 O=system:nodes 和 CN=system:node:(node name) 形式发起的 CSR 请求
selfnodeclient: kubelet client renew 自己的证书发起的 CSR 请求(与上一个证书就有相同的 OCN)
selfnodeserver: kubelet server renew 自己的证书发起的 CSR 请求

TLS bootstrapping 主要流程细节

kubelet 首次启动通过加载 bootstrap.kubeconfig 中的用户 Token 和 apiserver CA 证书发起首次 CSR 请求,这个 Token 被预先内置在 apiserver 节点的 token.csv 中,其身份为 kubelet-bootstrap 用户和 system:bootstrappers 用户组;想要首次 CSR 请求能成功(成功指的是不会被 apiserver 401 拒绝),则需要先将 kubelet-bootstrap 用户和 system:node-bootstrapper 内置 ClusterRole 绑定;

对于首次 CSR 请求可以手动批准,也可以将 system:bootstrappers 用户组与 approve-node-client-csr ClusterRole 绑定实现自动批准(1.8 之前这个 ClusterRole 需要手动创建,1.8 后 apiserver 自动创建,并更名为 system:certificates.k8s.io:certificatesigningrequests:nodeclient)

默认签署的的证书只有 1 年有效期,如果想要调整证书有效期可以通过设置 kube-controller-manager 的 --experimental-cluster-signing-duration 参数实现,该参数默认值为 8760h0m0s

对于证书自动续签,需要通过协调两个方面实现;第一,想要 kubelet 在证书到期后自动发起续期请求,则需要在 kubelet 启动时增加 --feature-gates=RotateKubeletClientCertificate=true,RotateKubeletServerCertificate=true 来实现;第二,想要让 controller manager 自动批准续签的 CSR 请求需要在 controller manager 启动时增加 --feature-gates=RotateKubeletServerCertificate=true 参数,并绑定对应的 RBAC 规则;同时需要注意的是 1.7 版本的 kubelet 自动续签后需要手动重启 kubelet 以使其重新加载新证书,而 1.8 后只需要在 kublet 启动时附带 --rotate-certificates 选项就会自动重新加载新证书。


证书及配置文件作用

token.csv

该文件为一个用户的描述文件,基本格式为 Token,用户名,UID,用户组;这个文件在 apiserver 启动时被 apiserver 加载,然后就相当于在集群内创建了一个这个用户;接下来就可以用 RBAC 给他授权;持有这个用户 Token 的组件访问 apiserver 的时候,apiserver 根据 RBAC 定义的该用户应当具有的权限来处理相应请求

bootstarp.kubeconfig

该文件中内置了 token.csv 中用户的 Token,以及 apiserver CA 证书;kubelet 首次启动会加载此文件,使用 apiserver CA 证书建立与 apiserver 的 TLS 通讯,使用其中的用户 Token 作为身份标识像 apiserver 发起 CSR 请求

kubelet-client.crt

该文件在 kubelet 完成 TLS bootstrapping 后生成,此证书是由 controller manager 签署的,此后 kubelet 将会加载该证书,用于与 apiserver 建立 TLS 通讯,同时使用该证书的 CN 字段作为用户名,O 字段作为用户组向 apiserver 发起其他请求

kubelet.crt

该文件在 kubelet 完成 TLS bootstrapping 后并且没有配置 --feature-gates=RotateKubeletServerCertificate=true 时才会生成;这种情况下该文件为一个独立于 apiserver CA 的自签 CA 证书,有效期为 1 年;被用作 kubelet 10250 api 端口

kubelet-server.crt

该文件在 kubelet 完成 TLS bootstrapping 后并且配置了 --feature-gates=RotateKubeletServerCertificate=true 时才会生成;这种情况下该证书由 apiserver CA 签署,默认有效期同样是 1 年,被用作 kubelet 10250 api 端口鉴权

kubelet-client-current.pem

这是一个软连接文件,当 kubelet 配置了 --feature-gates=RotateKubeletClientCertificate=true 选项后,会在证书总有效期的 70%~90% 的时间内发起续期请求,请求被批准后会生成一个 kubelet-client-时间戳.pem;kubelet-client-current.pem 文件则始终软连接到最新的真实证书文件,除首次启动外,kubelet 一直会使用这个证书同 apiserver 通讯

kubelet-server-current.pem

同样是一个软连接文件,当 kubelet 配置了 --feature-gates=RotateKubeletServerCertificate=true 选项后,会在证书总有效期的 70%~90% 的时间内发起续期请求,请求被批准后会生成一个 kubelet-server-时间戳.pem;kubelet-server-current.pem 文件则始终软连接到最新的真实证书文件,该文件将会一直被用于 kubelet 10250 api 端口鉴权。


官方文档

TLS bootstrapping

Kubelet Server Certificate Bootstrap & Rotation

Using RBAC Authorization

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
给Java程序猿们推荐一些值得一看的好书
文章主要介绍了如何通过阅读源代码、学习经典书籍、多交流、写博客、参与开源项目等方式来提升自己的Java技术能力。同时,作者还分享了一些对于Java程序员来说值得一读的好书,并提供了相应的推荐理由。
Java后端工程师
2017/12/27
2.6K0
给Java程序猿们推荐一些值得一看的好书
硬核!万字长文!Java零基础入门到精通知识点汇总
其实学习 Java 学到什么程度算是精通,这个其实没有盖棺定论的,也不是说你拿个年薪几十万的 offer 就可以自诩精通了。
牛仔码农
2021/07/15
4460
一位资深程序员大牛给予Java的学习路线建议
Java学习这一部分其实也算是今天的重点,这一部分用来回答很多群里的朋友所问过的问题,那就是你是如何学习Java的,能不能给点建议?今天我是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容甚至是一些书籍。这一部分的内容,同样适用于一些希望转行到Java的同学。   在大家看之前,我要先声明两点。1、由于我本人是Java后端开发出身,因此所推荐的学习内容是Java Web和Java后端开发的路线,非Java Web和Java后端开发的同学请适当参考其学习思想即可,切勿照搬。2、下
Java高级架构
2018/04/19
9060
适合普通大学生的 Java 后端开发学习路线
接下来的一段时间,帅地会总结各种技术栈的学习路线,例如 Java 开发,C++ 开发,python 开发,前端开发等等,假如你没有明确的目标,或许可以按照我说的学习路线来学习一波,我写的每一份学习路线,不会很全面,因为我认为,东西列的太多,反而不利于新手的学习,所以我列举的,都是比较必要的知识,当你把这些知识学了的时候,我相信你不需要别人的学习路线,也能知道自己接下来需要学啥了。
帅地
2021/04/14
7330
【原创】为了你,我又又又把Java学习路线和方法更新了一遍
到目前为止,我觉得不管是在公众号后台、知乎还是微信上面我被问的做多的就是:“大佬,有没有 Java 学习路线和方法”(大佬属现代流行的客气称呼,本人非大佬哈)。大概 5 个多月之前,我在公众号发过一篇类似的文章:【原创】Java 学习路线以及方法推荐。今天突然想到能把一些读者问我的一些常见问题汇总起来,于是利用下班后的时间,我先把这篇文章重新完善了一遍。另外,我把 Java 学习的一些常见问题整理在了 JavaGuide 上,并且单独为它开了一个 tab,以后我会整理一些常见的 Java 学习方向的问题放在这里避免重复回答一些常见的问题。
Guide哥
2020/05/08
1.3K0
【原创】为了你,我又又又把Java学习路线和方法更新了一遍
Java后端工程师必备书单(含大后端方向相关书籍)
作者黄小斜,斜杠青年,某985硕士,阿里研发工程师,于2018 年秋招拿到 BAT 头条、网易、滴滴等 8 个大厂 offer
程序员黄小斜
2019/03/11
3.4K0
你不可错过的Java学习资源清单(包含社区、大牛、专栏、书籍等)
作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条、网易、滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验、求职心得和成长感悟,以及作为程序员的思考和见解。
程序员黄小斜
2019/03/11
1.5K0
给学妹的 Java 学习路线
大家好,这篇文章主要是讲解下如何自学 Java,这个问题有很多粉丝私信问过,今天又有直系学妹问我如何学习 Java?
武培轩
2020/04/21
5330
给学妹的 Java 学习路线
Java这样学,Offer随便拿,学习方法和面试经验分享
现在各大互联网公司,对Java类的校招要求越来越高,导致很多小伙伴都很迷茫,今天分享一篇谢照东关于Java学习进阶之路,希望能帮助到一些人
帅地
2019/03/06
8070
Java这样学,Offer随便拿,学习方法和面试经验分享
Java 后端开发学习路线(修订版)
接下来的一段时间,帅地会总结各种技术栈的学习路线,假如你没有明确的目标,或许可以按照我说的学习路线来学习一波。
帅地
2022/01/13
3K0
Java 后端开发学习路线(修订版)
科班和非科班都适用的 Java 学习路线
很多面试官在基础考察的时候都是直接是根据书来问,因为这些面试官也是从学生时代过来的,而他们可能和你看的是同一本书。也就是如果你和面试官的知识体系结构一样的话,面试官问出来的问题,你自然可以回答得很好。下面是书籍推荐:
乔戈里
2019/03/02
1.1K0
Java工程师学习指南 中级篇
最近有很多小伙伴来问我,Java小白如何入门,如何安排学习路线,每一步应该怎么走比较好。原本我以为之前的几篇文章已经可以解决大家的问题了,其实不然,因为我写的文章都是站在Java后端的全局上进行思考和总结的,忽略了很多小白们的感受,而很多朋友都需要更加基础,更加详细的学习路线。
程序员黄小斜
2019/03/10
5830
计算机科班Java开发好书推荐
这些书全部都是我看过的,大部分都至少读了一遍到两遍,且还整理了笔记,少部分是挑的重点章节看的。
乔戈里
2019/01/07
7950
Java工程师核心书单推荐
书籍是获取知识的最好来源之一。技术书籍浩如烟海,市场上有不少《XXX入门到精通》,《XXX王者归来》,《21天学会XXX》这样的书,当然也有不少经典,个人的精力有限,这些经典不可能都通读。所以·,博主尝试整理一个Java工程师所需知识的核心书单,尽可能优中选优,挑选出Java工程师必备知识的一些最核心、最经典的书籍,希望能一起学习,一起进步。
三分恶
2021/03/16
6860
Java工程师核心书单推荐
牛逼!Java 从入门到精通,超全汇总版
其实学习 Java 学到什么程度算是精通,这个其实没有盖棺定论的,也不是说你拿个年薪几十万的 offer 就可以自诩精通了。另外,每当面试的时候简历上填个精通 offer 的家伙我就觉得很搞笑,没有几个熬得过开出门左拐的命运。但是我认为,如果市面上这些资料、书籍你都啃的差不多,你能在所有的 Java 程序员中跻身前 0.1% 的话,你就可以达到”精通” 这个阶段了,因为没人比你强了,你当然是精通了。
全栈程序员站长
2022/07/02
2.6K0
牛逼!Java 从入门到精通,超全汇总版
学习 Java,有什么书籍推荐?学习的方法和过程是怎样的?
为什么要学 Linux 呢?因为在实际的开发工作中,项目基本上都要部署到 Linux 环境下。Windows 作为服务器的很少,除了慢没别的原因。
AI码师
2020/11/19
6750
学习 Java,有什么书籍推荐?学习的方法和过程是怎样的?
Java学习之路 -- Java怎么学?
当时,作为懵懂的小白,大一学习了c和c++,还有数据结构,后来才自学的java。有了c++的基础,其实学java确实感觉挺容易上手。如果没有c或者c++的基础,建议开始需要先把java的基础打好,基础是指什么?基础的语法,能用!至于源码,不建议在刚刚开始学就看源码,绝对劝退!!!
秦怀杂货店
2021/03/29
1.4K0
python,java,c语言哪个好_小萌新
才发现语言的选择也就那一回事,我猜不少人刚入门的人依然被这个问题困扰着,所以决定认真分享一波我的经历。
全栈程序员站长
2022/11/01
1K0
2022最新JAVA学习路线(附面试题)
在 Java 学习这条路上也踩过无数次的坑,秋招也幸运的拿到了一些大厂 Java 开发的offer。
dizhiguo
2022/09/07
7690
java 进阶之路(书籍推荐)
学习Java,书籍是必不可少的学习工具之一,尤其是对于自学者而言。废话不多说,下边就给大家推荐一些Java进阶的好书。
马士兵的朋友圈
2020/09/08
2K0
java 进阶之路(书籍推荐)
推荐阅读
相关推荐
给Java程序猿们推荐一些值得一看的好书
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验