Bootstrap token 是一种简单的 bearer token,用于创建新集群或将新节点连接到现有集群。它被用来支持 kubeadm,但是对于那些希望在没有 kubeadm
的情况下创建集群的用户,也可以在其他环境中使用。它也可以通过 RBAC 策略用于 Kubelet TLS
Bootstrapping 系统。
Bootstrap Token 在 kube-system
命名空间中使用特定类型 (bootstrap.kubernetes.io/token
) 的 secret 来定义。
然后,这些 Secret 被 API Server 中的 Bootstrap Authenticator 读取。过期的 token 被 Controller Manager 中的 TokenCleaner 控制器移除。
这些 Token 也被 BootstrapSigner 控制器在一个”发现”的过程中用来为特定的 ConfigMap 创建签名。
Kubernetes v1.14
beta
Bootstrap Token 采用 abcdef.0123456789abcdef
的形式。为了更加正式,它们必须匹配正则表达式 [a-z0-9]{6}\.[a-z0-9]{16}
。
Token 的第一部分是 “Token ID” 并且被认为是公共信息。这部分会在引用一个 token 但是不想泄露那些用于鉴权的私密部分时被用到。第二部分则是 “Token Secret”,应该仅与受信任方共享。
Bootstrap Token authenticator 可以通过在 API server 上添加下列标志来启用。
--enable-bootstrap-token-auth
被启用时,Bootstrap Token 可以被用来作为针对 API server 鉴权请求的 bearer token 凭据。
Authorization: Bearer 07401b.f395accd246ae52d
Token 鉴权信息为:用户名 system:bootstrap:<token id>
且在 system:bootstrappers
组内。我们也可以在 token 的 Secret 中指定其它组信息。
过期的 token 可以通过启用 controller manager 中的 tokencleaner
控制器来自动删除。
--controllers=*,tokencleaner
每个有效的 token 都对应着 kube-system
命名空间中的一个 secret。您可以从 这里 获得整个的设计文档。
Secret 样例如下所示。
apiVersion: v1
kind: Secret
metadata:
# Name MUST be of form "bootstrap-token-<token id>"
name: bootstrap-token-07401b
namespace: kube-system
# Type MUST be 'bootstrap.kubernetes.io/token'
type: bootstrap.kubernetes.io/token
stringData:
# Human readable description. Optional.
description: "The default bootstrap token generated by 'kubeadm init'."
# Token ID and secret. Required.
token-id: 07401b
token-secret: f395accd246ae52d
# Expiration. Optional.
expiration: 2017-03-10T03:22:11Z
# Allowed usages.
usage-bootstrap-authentication: "true"
usage-bootstrap-signing: "true"
# Extra groups to authenticate the token as. Must start with "system:bootstrappers:"
auth-extra-groups: system:bootstrappers:worker,system:bootstrappers:ingress
Secret 的类型必须是 bootstrap.kubernetes.io/token
并且名字的格式必须是 bootstrap-token-<token id>
。它必须被放在 kube-system
命名空间中。
usage-bootstrap-*
的成员指出了这个 secret 的作用。值被设定为 true
时才会启用。
usage-bootstrap-authentication
表示这个 token 可以被用来作为针对 API server 鉴权请求的 bearer token 凭据。
usage-bootstrap-signing
表示这个 token 可以被用来对 cluster-info
ConfigMap 通过下述方式来签名。expiration
字段控制 token 的到期。过期的 token 会在用于身份验证时被拒绝,在 ConfigMap 签名时被忽略。
使用 RFC3339 将过期时间编码为绝对 UTC 时间。启用 tokencleaner
控制器来自动删除过期的 token。
您可以在集群中使用 kubeadm
工具来管理 token。查阅 kubeadm token 文档 获取更多信息。
除了身份验证之外,token 还可用于对 ConfigMap 进行签名。 这个用于在客户端和 API Server 互信之前,在集群引导过程的前期使用。 签名的 ConfigMap 可以通过共享 token 进行身份鉴权。
通过启用 Controller Manager 中的 bootstrapsigner
控制器来启用 ConfigMap 签名选项。
--controllers=*,bootstrapsigner
被签名的 ConfigMap 作为 kube-public
命名空间中的 cluster-info
存在。
典型的流程是客户端在未经身份验证和忽略 TLS 错误时读取此 ConfigMap。
然后通过嵌入 ConfigMap 中的签名来校验 ConfigMap。
ConfigMap 样例如下所示:
apiVersion: v1
kind: ConfigMap
metadata:
name: cluster-info
namespace: kube-public
data:
jws-kubeconfig-07401b: eyJhbGciOiJIUzI1NiIsImtpZCI6IjA3NDAxYiJ9..tYEfbo6zDNo40MQE07aZcQX2m3EB2rO3NuXtxVMYm9U
kubeconfig: |
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: <really long certificate data>
server: https://10.138.0.2:6443
name: ""
contexts: []
current-context: ""
kind: Config
preferences: {}
users: []
ConfigMap 的 kubeconfig
成员是一个配置文件,里面只填写了集群信息。
在通信过程中的关键是 certificate-authority-data
。这部分可能在将来会扩展。
签名是使用“分离”模式的 JWS 签名。
为了验证签名,用户应该根据 JWS 规则加密 kubeconfig
的信息(base64 编码,同时丢弃任何的 =
)。
然后将使用该编码的信息插入 2 个点之间来形成整个 JWS。
您可以使用 HS256
方案(HMAC-SHA256)验证 JWS,并使用完整令牌(例如 07401b.f395accd246ae52d
)作为共享密钥。 用户 必须 验证 HS256 是否被使用。
Warning:注意: 拥有 bootstrapping token 任何一方都可以为该 token 创建有效签名。 当使用 ConfigMap 签名时,不建议许多客户端共享相同的 token,因为受入侵的客户端可能会作为中间人为其它客户端来引导 TLS 信任。
参阅 kubeadm 安全模型 获取更多信息。
此页是否对您有帮助?
Thanks for the feedback. If you have a specific, answerable question about how to use Kubernetes, ask it on Stack Overflow. Open an issue in the GitHub repo if you want to report a problem or suggest an improvement.