首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
基础
使用 Minikube 创建集群
使用 kubectl 创建 Deployment
查看 pod 和工作节点
使用 Service 暴露你的应用
运行应用程序的多个实例
执行滚动更新
使用 ConfigMap 来配置 Redis
使用 AppArmor 限制容器对资源的访问
在集群级别应用 Pod 安全标准
在名字空间级别应用 Pod 安全标准
使用 seccomp 限制容器的系统调用
公开外部 IP 地址以访问集群中应用程序
使用 Redis 部署 PHP 留言板应用程序
StatefulSet 基础
使用持久卷部署 WordPress 和 MySQL
使用 StatefulSet 部署 Cassandra
运行 ZooKeeper
服务器端应用API
客户端库
用户认证
使用启动引导令牌
证书签名请求
准入控制器
管理服务账号
使用 RBAC 鉴权
当前位置:
首页>>
技术小册>>
Kubernetes中文教程(六)
小册名称:Kubernetes中文教程(六)
启动引导令牌是一种简单的持有者令牌(Bearer Token),这种令牌是在新建集群 或者在现有集群中添加新节点时使用的。 它被设计成能够支持 [`kubeadm`], 但是也可以被用在其他的案例中以便用户在不使用 `kubeadm` 的情况下启动集群。 它也被设计成可以通过 RBAC 策略,结合 [Kubelet TLS 启动引导] 系统进行工作。 启动引导令牌被定义成一个特定类型的 Secret(`bootstrap.kubernetes.io/token`), 并存在于 `kube-system` 名字空间中。 这些 Secret 会被 API 服务器上的启动引导认证组件(Bootstrap Authenticator)读取。 控制器管理器中的控制器 TokenCleaner 能够删除过期的令牌。 这些令牌也被用来在节点发现的过程中会使用的一个特殊的 ConfigMap 对象。 BootstrapSigner 控制器也会使用这一 ConfigMap。 ## 令牌格式 启动引导令牌使用 `abcdef.0123456789abcdef` 的形式。 更加规范地说,它们必须符合正则表达式 `[a-z0-9]{6}\.[a-z0-9]{16}`。 令牌的第一部分是 “Token ID”,它是一种公开信息,用于引用令牌并确保不会 泄露认证所使用的秘密信息。 第二部分是“令牌秘密(Token Secret)”,它应该被共享给受信的第三方。 ## 启用启动引导令牌 ## 启用启动引导令牌身份认证 启动引导令牌认证组件可以通过 API 服务器上的如下标志启用: ``` --enable-bootstrap-token-auth ``` 启动引导令牌被启用后,可以作为持有者令牌的凭据,用于 API 服务器请求的身份认证。 ```http Authorization: Bearer 07401b.f395accd246ae52d ``` 令牌认证为用户名 `system:bootstrap:<token id>` 并且是组 `system:bootstrappers` 的成员。额外的组信息可以通过令牌的 Secret 来设置。 过期的令牌可以通过启用控制器管理器中的 `tokencleaner` 控制器来删除。 ``` --controllers=*,tokencleaner ``` ## 启动引导令牌的 Secret 格式 每个合法的令牌背后对应着 `kube-system` 名字空间中的某个 Secret 对象。 你可以从 [这里] 找到完整设计文档。 这是 Secret 看起来的样子。 ```yaml 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: 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-<token id>`。 令牌必须存在于 `kube-system` 名字空间中。 `usage-bootstrap-*` 成员表明这个 Secret 的用途。启用时,值必须设置为 `true`。 * `usage-bootstrap-authentication` 表示令牌可以作为持有者令牌用于 API 服务器的身份认证。 * `usage-bootstrap-signing` 表示令牌可被用于 `cluster-info` ConfigMap 的签名, 就像下面描述的那样。 `expiration` 字段控制令牌的失效期。过期的令牌在用于身份认证时会被拒绝,在用于 ConfigMap 签名时会被忽略。 过期时间值是遵循 RFC3339 进行编码的 UTC 时间。 启用 TokenCleaner 控制器会自动删除过期的令牌。 ## 使用 `kubeadm` 管理令牌 你可以使用 `kubeadm` 工具管理运行中集群上的令牌。 参见 [kubeadm token 文档] 以了解详细信息。 ### ConfigMap 签名 除了身份认证,令牌还可以用于签名 ConfigMap。 这一用法发生在集群启动过程的早期,在客户端信任 API 服务器之前。 被签名的 ConfigMap 可以被共享令牌完成身份认证。 通过在控制器管理器上启用 `bootstrapsigner` 控制器可以启用 ConfigMap 签名特性。 ``` --controllers=*,bootstrapsigner ``` 被签名的 ConfigMap 是 `kube-public` 名字空间中的 `cluster-info`。 典型的工作流中,客户端在未经认证和忽略 TLS 报错的状态下读取这个 ConfigMap。 通过检查 ConfigMap 中嵌入的签名校验 ConfigMap 的载荷。 ConfigMap 会是这个样子的: ```yaml 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: <非常长的证书数据> server: https://10.138.0.2:6443 name: "" contexts: [] current-context: "" kind: Config preferences: {} users: [] ``` ConfigMap 的 `kubeconfig` 成员是一个填好了集群信息的配置文件。 这里主要交换的信息是 `certificate-authority-data`。在将来可能会有扩展。 签名是一个使用 “detached” 模式生成的 JWS 签名。 为了检验签名,用户应该按照 JWS 规则(base64 编码且丢掉结尾的 `=`)对 `kubeconfig` 的载荷进行编码。完成编码的载荷会被插入到两个句点中间,形成完整的 JWS。你可以使用完整的令牌(比如 `07401b.f395accd246ae52d`)作为共享密钥, 通过 `HS256` 方式 对 JWS 进行校验。 用户**必须**确保使用了 HS256。 任何拥有了启动引导令牌的主体都可以为该令牌生成一个合法的签名。 当使用 ConfigMap 签名时,非常不建议针对很多客户使用相同的令牌,因为某个被攻击的 客户可能对另一个一来签名来开启 TLS 信任的客户发起中间人攻击。 参考 [kubeadm 实现细节] 了解更多信息。
上一篇:
用户认证
下一篇:
证书签名请求
该分类下的相关小册推荐:
Kubernets合辑14-日志收集
Kubernetes中文教程(二)
Kubernets合辑2-部署Ingress
Kubernets合辑10-网络
Kubernetes中文教程(三)
Kubernets合辑4-kubernetes入门
云原生-K8S入门实战
Kubernets合辑8-权限控制
Kubernets合辑11-持续集成
Kubernets合辑9-资源约束
Kubernets合辑6-服务发现
Kubernetes中文教程(四)