kubelet TLS

  • 时间:
  • 浏览:2

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

RBAC 中 ClusterRole 也不我 我描述将会说定义有并不是集群范围内的能力,这另有三个白 ClusterRole 在 1.7 事先前要你这俩人手动创建,在 1.8 后 apiserver 会自动创建前另有三个白 (1.8 事先名称有改变,你这俩人查看文档);以上另有三个白 ClusterRole 含义如下

配置 kubelet 自动续期,RotateKubeletClientCertificate 用于自动续期 kubelet 连接 apiserver 所用的证书(kubelet-client-xxxx.pem),RotateKubeletServerCertificate 用于自动续期 kubelet 1021000 api 端口所使用的证书(kubelet-server-xxxx.pem)

对于证书自动续签,前要通过协调另有三个白 方面实现;第一,随后 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 选项就会自动重新加载新证书

允许 kubelet-bootstrap 用户创建首次启动的 CSR 请求

对于首次 CSR 请求能不到手动批准,并能不到将 system:bootstrappers 用户组与 approve-node-client-csr ClusterRole 绑定实现自动批准(1.8 事先你这俩 ClusterRole 前要手动创建,1.8 后 apiserver 自动创建,并更名为system:certificates.k8s.io:certificatesigningrequests:nodeclient)

创建自动批准相关 CSR 请求的 ClusterRole,相对于 1.7 版本,1.8 的 apiserver 自动创建了前两条 ClusterRole,也不我 只前要创建一根就行了

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

apiserver 预先放置 token.csv,内容样类事下

Kubernetes 在 1.4 版本(我记着是)推出了 TLS bootstrapping 功能;你这俩 功能主要处里了以下大问题:

默认否认的的证书不到 1 年有效期,将会随后 调整证书有效期能不到通过设置 kube-controller-manager 的 --experimental-cluster-signing-duration 参数实现,该参数默认值为 871000h0m0s

单独把这累积甩掉来写,是将会你这俩人我我觉得顶端将会一阵一阵乱了;这累积实际上更繁杂,只好单独写一下了,将会这累积涉及的东西比较多,也不我 也不我 我想草率的几笔带过

创建自动批准相关 CSR 请求的 ClusterRole

也不我 ,将会随后 kubelet 并能自动续期,这麼就应当将适当的 ClusterRole 绑定到 kubelet 自动续期时所所采用的用户将会用户组身上

当集群开启了 TLS 认证后,每个节点的 kubelet 组件总要使用由 apiserver 使用的 CA 签发的有效证书并能与 apiserver 通讯;此时将会节点多起来,为每个节点单独否认证书将是一件非常繁琐的事情;TLS bootstrapping 功能也不我 我让 kubelet 先使用另有三个白 预定的低权限用户连接到 apiserver,也不我 我向 apiserver 申请证书,kubelet 的证书由 apiserver 动态否认;在配合 RBAC 授权模型下的工作流程大致如下所示(不删改,下面细说)

注意,1.7 版本设置自动续期参数后,新的 renew 请求不用立即现在结速,也不我 我在证书总有效期的70%~90% 的时间时发起;也不我 我经测试 1.7 版本即使自动签发了证书,kubelet 在不重启的情况汇报下不用重新应用新证书;在 1.8 后 kubelet 组件在增加另有三个白  --rotate-certificates 参数后,kubelet 才会自动重载新证书

从以上两点能不到不到总结出两点: 第一,随后 与 apiserver 通讯就前要采用由 apiserver CA 签发的证书,原来并能形成信任关系,建立 TLS 连接;第二,能不到通过证书的 CN、O 字段来提供 RBAC 所需的用户与用户组

允许 kubelet-bootstrap 用户创建首次启动的 CSR 请求

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

当 TLS 处里了通讯大问题后,这麼权限大问题就应由 RBAC 处里(能不到使用你这俩权限模型,如 ABAC);RBAC 中规定了另有三个白 用户将会用户组(subject)具有请求那此 api 的权限;在配合 TLS 加密的事先,实际上 apiserver 读取客户端证书的 CN 字段作为用户名,读取 O 字段作为用户组

从以上流程亲们 能不到看出,亲们 将会要创建 RBAC 规则,则共要能满足有并不是情况汇报:

在 1.7 后,kubelet 启动时增加 --feature-gates=RotateKubeletClientCertificate=true,RotateKubeletServerCertificate=true 选项,则 kubelet 在证书即将到期总要自动发起另有三个白 renew 你这俩人证书的 CSR 请求;共同 controller manager 前要在启动时增加 --feature-gates=RotateKubeletServerCertificate=true 参数,再配合顶端创建好的 ClusterRoleBinding,kubelet client 和 kubelet server 证才书会被自动否认;

冒出 CSR 请求后,能不到使用 kubectl 手动签发(允许) kubelet 的证书

配置 kubelet 自动续期,RotateKubeletClientCertificate 用于自动续期 kubelet 连接 apiserver 所用的证书(kubelet-client-xxxx.pem),RotateKubeletServerCertificate 用于自动续期 kubelet 1021000 api 端口所使用的证书(kubelet-server-xxxx.pem),--rotate-certificates 选项使得 kubelet 并能自动重载新证书

配置 controller manager 自动批准相关 CSR 请求,将会不配置 --feature-gates=RotateKubeletServerCertificate=true 参数,则即使配置了相关的 RBAC 规则,也只会自动批准 kubelet client 的 renew 请求

将 ClusterRole 绑定到适当的用户组,以完成自动批准相关 CSR 请求

将 ClusterRole 绑定到适当的用户组,以完成自动批准相关 CSR 请求

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

看过顶端的介绍,告诉我有这麼人想过,既然 TLS bootstrapping 功能是让 kubelet 组件去 apiserver 申请证书,也不我 我用于连接 apiserver;这麼第一次启动时这麼证书何如连接 apiserver ?

apiserver 预先放置 token.csv,内容样类事下

众所周知 TLS 的作用也不我 我对通讯加密,处里顶端人窃听;共同将会证书不信任语录根本就无法与 apiserver 建立连接,更不用提有这麼权限向 apiserver 请求指定内容

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

在官方 TLS bootstrapping 文档中多次提到过 kubelet server 你这俩 东西;在经过翻阅小量文档以及 TLS bootstrapping 设计文档后得出,kubelet server 指的应该是 kubelet 的 1021000 端口;

在你这俩用户首次启动时,将会与遇到 kubelet 报 401 无权访问 apiserver 的错误;这是将会在默认情况汇报下,kubelet 通过 bootstrap.kubeconfig 中的预设用户 Token 声明了你这俩人的身份,也不我 我创建 CSR 请求;也不我 我未必忘记你这俩 用户在亲们 不处里的情况汇报下他没任何权限的,包括创建 CSR 请求;也不我 前要如下命令创建另有三个白 ClusterRoleBinding,将预设用户 kubelet-bootstrap 与内置的 ClusterRole system:node-bootstrapper 绑定到共同,使其并能发起 CSR 请求

配置 controller manager 自动批准相关 CSR 请求,将会不配置 --feature-gates=RotateKubeletServerCertificate=true 参数,则即使配置了相关的 RBAC 规则,也只会自动批准 kubelet client 的 renew 请求

kubelet 组件在工作时,采用主动的查询机制,即定期请求 apiserver 获取你这俩人所应当处里的任务,如那此 pod 分配到了你这俩人身上,从而去处里那此任务;共同 kubelet 你这俩人总要暴露出另有三个白 有并不是 api 的端口,用于将你这俩人有并不是的私有 api 暴露出去,这另有三个白 端口分别是 1021000 与 10255;对于 1021000 端口,kubelet 会在其上采用 TLS 加密以提供适当的鉴权功能;对于 10255 端口,kubelet 会以只读形式暴露组件有并不是的私有 api,也不我 我不做鉴权处里

该文件为另有三个白 用户的描述文件,基本格式为 Token,用户名,UID,用户组;你这俩 文件在 apiserver 启动时被 apiserver 加载,也不我 我就共要在集群内创建了另有三个白 你这俩 用户;接下来就能不到用 RBAC 给他授权;持有你这俩 用户 Token 的组件访问 apiserver 的事先,apiserver 根据 RBAC 定义的该用户应当具有的权限来处里相应请求

在自动续期下引导过程与单纯的手动批准 CSR 一阵一阵差异,具体的引导流程地址如下

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

基于以上有并不是情况汇报,亲们 前要创建 3 个 ClusterRoleBinding,创建如下

前要重复强调另有三个白 大问题是: TLS bootstrapping 时的证书实际是由 kube-controller-manager 组件来否认的,也也不我 我说证书有效期是 kube-controller-manager 组件控制的;也不我 在 1.7 版本事先(我查文档发现的从1.7现在结速有) kube-controller-manager 组件提供了另有三个白  --experimental-cluster-signing-duration 参数来设置否认的证书有效时间;默认为 871000h0m0s,将其改为 8710000h0m0s 即 10 年后再进行 TLS bootstrapping 否认证书即可。

该文件在 kubelet 完成 TLS bootstrapping 后也不我 我配置了 --feature-gates=RotateKubeletServerCertificate=true 时才会生成;你这俩 情况汇报下该证书由 apiserver CA 否认,默认有效期同样是 1 年,被用作 kubelet 1021000 api 端口鉴权

总结一下,也不我 我说 kubelet 上实际上有另有三个白 地方用到证书,另有三个白 是用于与 API server 通讯所用到的证书,原来是 kubelet 的 1021000 私有 api 端口前要用到的证书

kubelet 发起的 CSR 请求总要由 controller manager 来做实际否认的,对于 controller manager 来说,TLS bootstrapping 下 kubelet 发起的 CSR 请求大致分为以下有并不是

你这俩 大问题实际能不到不到去查看一下 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 首次启动后,将会用户 Token 没大问题,也不我 我 RBAC 也做了相应的设置,这麼此时在集群内应该能看过 kubelet 发起的 CSR 请求

大白话加你这俩人测试得出的结果: nodeclient 类型的 CSR 仅在第一次启动总要产生,selfnodeclient 类型的 CSR 请求实际上也不我 我 kubelet renew 你这俩人作为 client 跟 apiserver 通讯时使用的证书产生的,selfnodeserver 类型的 CSR 请求则是 kubelet 首次申请或后续 renew 你这俩人的 1021000 api 端口证书时产生的

首先…首先好几个 了…嗯,也不我 我说 kubelet 所发起的 CSR 请求是由 controller manager 否认的;将会想也不我 我实现自动续期,就前要让 controller manager 并能在 kubelet 发起证书请求的事先自动帮助其否认证书;这麼 controller manager 不将会对所有的 CSR 证书申请都自动否认,这事先就前要配置 RBAC 规则,保证 controller manager 只对 kubelet 发起的特定 CSR 请求自动批准即可;在 TLS bootstrapping 官方文档中,针对顶端 2.2 章节提出的 3 种 CSR 请求分别给出了 3 种对应的 ClusterRole,如下所示

在说具体的引导过程事先先谈一下 TLS 和 RBAC,将会这另有三个白 事不整明白下面的总要用谈;

该文件在 kubelet 完成 TLS bootstrapping 后也不我 我这麼配置 --feature-gates=RotateKubeletServerCertificate=true 时才会生成;你这俩 情况汇报下该文件为另有三个白 独立于 apiserver CA 的自签 CA 证书,有效期为 1 年;被用作 kubelet 1021000 api 端口

一切就绪后启动 kubelet 组件即可,不过前要注意的是 1.7 版本 kubelet 不用自动重载 renew 的证书,前要你这俩人手动重启

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