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
选项启动
- 令牌认证为用户名
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
选项启动服务
apiserver读取该文件的提取持有者令牌,令牌长期有效,在不重启apiserver的情况下,无法更改令牌列值
kubelet 启动过程
- 查找kubeconfig文件(一般文件 /etc/kubernetes/kubelet.kubeconfig)
- 从kubeconfig文件中检索API Server的URL和证书(通常是TLS密钥和签名证书)
- 然后使用凭证和api server 进行交互通信
TLS Bootstrapping初始化流程
- kubelet 启动
- kubelet 看到自己 没有 对应的
kubeconfig
文件 - kubelet 搜索并发现
bootstrap-kubeconfig
文件 - kubelet 读取该
bootstrap-kubeconfig
启动引导文件,从中获得 API Server的 URL 和用途有限的 一个“令牌(Token)” - kubelet 使用上述令牌与 API Server 建立连接,并使用该token进行身份认证
- apiserver识别tokenid, apiserver查看该tokenid对应的bootstrap
- kubelet 现在拥有受限制的凭据来创建和取回证书签名请求(CSR)
- kubelet 为自己创建一个 CSR,并将其 signerName 设置为
kubernetes.io/kube-apiserver-client-kubelet
- CSR 被以如下两种方式之一批复:
- 如果配置了,kube-controller-manager 会自动批复该 CSR
- 如果配置了,一个外部进程,或者是人,使用 Kubernetes API 或者使用
kubectl
来批复该 CSR
- kubelet 所需要的证书被创建
- 证书被发放给 kubelet
- kubelet 取回该证书
- kubelet 创建一个合适的
kubeconfig
,其中包含密钥和已签名的证书 - kubelet 开始正常操作
- 可选地,如果配置了,kubelet 在证书接近于过期时自动请求更新证书
- 更新的证书被批复并发放;取决于配置,这一过程可能是自动的或者手动完成