K8S-kubelet启动过程

官方文档

kubelet 引导身份认证方式

  • bootstrap token (secret)
  • token file (token.csv)

bootstrap Secret

token格式

必须符合正则表达式 [a-z0-9]{6}\.[a-z0-9]{16}

  • 第一部分是 “Token ID”,它是一种公开信息,用于引用令牌并确保不会泄露认证所使用的秘密信息。
  • 第二部分是“令牌秘密(Token Secret)”,它应该被共享给受信的第三方

启用bootstrap

kube-apiserver 使用--enable-bootstrap-token-auth=true选项启动

image-20210414164413965

  • 令牌认证为用户名 system:bootstrap:<token id> 并且是组 system:bootstrappers 的成员。额外的组信息可以通过 Secret 来设置。
  • 过期的令牌可以通过启用控制器管理器中的 tokencleaner 控制器来删除。

Secret 格式

每个合法的令牌背后对应着 kube-system 名字空间中的某个 Secret 对象。Secret 数据总是采用 Base64 编码来存储

apiVersion: v1
kind: Secret
metadata:
  # name 必须是 "bootstrap-token-<token id>" 格式的
  name: bootstrap-token-07401b
  namespace: kube-system

# type 必须是 'bootstrap.kubernetes.io/token'
type: bootstrap.kubernetes.io/token
stringData:
  # 供人阅读的描述,可选。
  description: "The default bootstrap token generated by 'kubeadm init'."

  # 令牌 ID 和秘密信息,必需。
  token-id: 07401b
  token-secret: base64(f395accd246ae52d)

  # 可选的过期时间字段
  expiration: "2017-03-10T03:22:11Z"
  # 允许的用法
  usage-bootstrap-authentication: "true"
  usage-bootstrap-signing: "true"

  # 令牌要认证为的额外组,必须以 "system:bootstrappers:" 开头
  auth-extra-groups: system:bootstrappers:worker,system:bootstrappers:ingress

Secret 的类型必须是 bootstrap.kubernetes.io/token,而且名字必须是 bootstrap-token-。 令牌必须存在于 kube-system 名字空间中。

usage-bootstrap-* 成员表明这个 Secret 的用途。启用时,值必须设置为 true

  • usage-bootstrap-authentication 表示令牌可以作为持有者令牌用于 API 服务器的身份认证。
  • usage-bootstrap-signing 表示令牌可被用于 cluster-info ConfigMap 的签名, 就像下面描述的那样。

expiration 字段控制令牌的失效期。过期的令牌在用于身份认证时会被拒绝,在用于 ConfigMap 签名时会被忽略。 过期时间值是遵循 RFC3339 进行编码的 UTC 时间。 启用 TokenCleaner 控制器会自动删除过期的令牌

kubeadm管理token

# 显示
kubeadm token list

# 打印并生成规定格式的令牌
[root@k8s-master01 bin]# kubeadm token generate 
nkp60x.mcsn25irqqg9oe2p
[root@k8s-master01 bin]# 

token file内容

cat token.csv
02b50b05283e98dd0fd71db496ef01e8,kubelet-bootstrap,10001,"system:bootstrappers"

# 使用下面的命令生成 token.csv 第一部分的内容: 02b50b05283e98dd0fd71db496ef01e8
head -c 16 /dev/urandom | od -An -t x | tr -d ' '
  • 其中,前面3个列值可以是任意值,分别:令牌、用户名和用户的 UID
  • 用引号括起来的组名称则只能用上面例子中给的值: "system:bootstrappers"

启用token file选项

kube-apiserver 使用 --token-auth-file=FILENAME 选项启动服务

image-20210414164328618

apiserver读取该文件的提取持有者令牌,令牌长期有效,在不重启apiserver的情况下,无法更改令牌列值

kubelet 启动过程

  1. 查找kubeconfig文件(一般文件 /etc/kubernetes/kubelet.kubeconfig)
  2. 从kubeconfig文件中检索API Server的URL和证书(通常是TLS密钥和签名证书)
  3. 然后使用凭证和api server 进行交互通信

TLS Bootstrapping初始化流程

  1. kubelet 启动
  2. kubelet 看到自己 没有 对应的 kubeconfig 文件
  3. kubelet 搜索并发现 bootstrap-kubeconfig 文件
  4. kubelet 读取该bootstrap-kubeconfig启动引导文件,从中获得 API Server的 URL 和用途有限的 一个“令牌(Token)”
  5. kubelet 使用上述令牌与 API Server 建立连接,并使用该token进行身份认证
    • apiserver识别tokenid, apiserver查看该tokenid对应的bootstrap
  6. kubelet 现在拥有受限制的凭据来创建和取回证书签名请求(CSR)
  7. kubelet 为自己创建一个 CSR,并将其 signerName 设置为 kubernetes.io/kube-apiserver-client-kubelet
  8. CSR 被以如下两种方式之一批复:
    • 如果配置了,kube-controller-manager 会自动批复该 CSR
    • 如果配置了,一个外部进程,或者是人,使用 Kubernetes API 或者使用 kubectl 来批复该 CSR
  9. kubelet 所需要的证书被创建
  10. 证书被发放给 kubelet
  11. kubelet 取回该证书
  12. kubelet 创建一个合适的 kubeconfig,其中包含密钥和已签名的证书
  13. kubelet 开始正常操作
  14. 可选地,如果配置了,kubelet 在证书接近于过期时自动请求更新证书
  15. 更新的证书被批复并发放;取决于配置,这一过程可能是自动的或者手动完成
posted @ 2021-06-06 19:27  KuBee  阅读(660)  评论(0编辑  收藏  举报