云原生学习路线导航页(持续更新中)
- kubernetes学习系列快捷链接
- Kubernetes架构原则和对象设计(一)
- Kubernetes架构原则和对象设计(二)
- Kubernetes架构原则和对象设计(三)
- Kubernetes控制平面组件:etcd(一)
- Kubernetes控制平面组件:etcd(二)
- Kubernetes控制平面组件:etcd常用配置参数
- Kubernetes控制平面组件:etcd高可用集群搭建
- Kubernetes控制平面组件:etcd高可用解决方案
- Kubernetes控制平面组件:Kubernetes如何使用etcd
- kubectl 和 kubeconfig 基本原理
- kubeadm 升级 k8s集群 1.17到1.20
- Kubernetes常见问题解答
- 查看云机器的一些常用配置
本文主要对kubernetes API Server 认证机制中的 引导Token 认证方式进行介绍,包括 引导Token 的设计理念、实现原理、认证流程,以及在 Kubernetes 中的具体应用
1.引导Token的认证方式简介
- Kubernetes 的引导 Token(Bootstrap Token)认证是一种用于简化集群节点加入和初始化的机制。
- 它允许新节点或组件通过临时 Token 加入集群,并在完成初始化后自动失效。
- 这种方式常用于集群的自动化部署和扩展。
2.引导 Token 认证的工作原理
-
引导 Token 是一种短期的、临时的 Token,用于以下场景:
- 节点加入集群:新节点使用引导 Token 向 API Server 认证并加入集群。
- 初始化组件:如 kubeadm 初始化集群时,使用引导 Token 完成初始配置。
-
引导 Token 的特点:
- 短期有效:Token 有明确的过期时间,通常为 24 小时。
- 自动失效:使用后会自动失效,避免长期暴露。
- RBAC 支持:可以为引导 Token 绑定特定的 RBAC 权限,限制其使用范围。
3.引导 Token 的结构
- 引导 Token 是一个由两部分组成的字符串,格式为:
<token-id>.<token-secret>
- 例如:
abcdef.0123456789abcdef
- Token ID:6 个字符的随机字符串,用于标识 Token。
- Token Secret:16 个字符的随机字符串,用于验证 Token。
- 例如:
4.创建引导 Token
4.1.使用 kubeadm
创建引导 Token
kubeadm
提供了创建和管理引导 Token 的工具。
kubeadm token create
输出示例:
abcdef.0123456789abcdef
4.2.查看已创建的 Token
kubeadm token list
输出示例:
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
abcdef.0123456789abcdef 23h 2025-02-19T12:34:56Z authentication,signing <none> system:bootstrappers:kubeadm:default-node-token
4.3.手动创建引导 Token
-
如果需要手动创建引导 Token,可以按照以下步骤操作:
-
生成 Token ID 和 Token Secret:
TOKEN_ID=$(head -c 6 /dev/urandom | base64 | tr -d '/+' | head -c 6) TOKEN_SECRET=$(head -c 16 /dev/urandom | base64 | tr -d '/+' | head -c 16) BOOTSTRAP_TOKEN="${TOKEN_ID}.${TOKEN_SECRET}" echo "Bootstrap Token: ${BOOTSTRAP_TOKEN}"
-
将 Token 写入 Kubernetes Secret:
kubectl create secret generic bootstrap-token-${TOKEN_ID} \--namespace=kube-system \--type=bootstrap.kubernetes.io/token \--from-literal=token-id=${TOKEN_ID} \--from-literal=token-secret=${TOKEN_SECRET} \--from-literal=usage-bootstrap-authentication=true \--from-literal=usage-bootstrap-signing=true \--from-literal=expiration=$(date -d "+24 hours" -u +"%Y-%m-%dT%H:%M:%SZ")
-
5.使用引导 Token 加入集群
5.1.获取集群信息
- 在 Master 节点上运行以下命令,获取集群的 CA 证书哈希和 API Server 地址:
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //' kubectl cluster-info
5.2.在新节点上使用引导 Token 加入集群
-
在新节点上运行以下命令,使用引导 Token 加入集群:
kubeadm join <api-server-address>:<port> \--token <bootstrap-token> \--discovery-token-ca-cert-hash sha256:<ca-cert-hash>
-
例如:
kubeadm join 192.168.1.100:6443 \--token abcdef.0123456789abcdef \--discovery-token-ca-cert-hash sha256:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef
6.引导 Token 的 RBAC 配置
-
引导 Token 默认绑定到
system:bootstrappers:kubeadm:default-node-token
组,可以通过 RBAC 为其分配权限。 -
例如,为新节点分配必要的权限:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata:name: kubeadm:node-autoapprove-bootstrap roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: system:node-bootstrapper subjects: - apiGroup: rbac.authorization.k8s.iokind: Groupname: system:bootstrappers:kubeadm:default-node-token
7.引导 Token 的过期和清理
- 引导 Token 在过期后会自动失效,也可以通过以下命令手动删除:
kubeadm token delete <token-id>
- 例如:
kubeadm token delete abcdef
8.总结
- 引导 Token 认证是 Kubernetes 中一种简单且安全的机制,适用于集群节点的初始化和自动化部署。
- 通过
kubeadm
工具可以轻松创建和管理引导 Token,并结合 RBAC 实现权限控制。 - 在实际操作中,建议:
- 定期清理过期的 Token。
- 结合自动化工具(如 Ansible、Terraform)实现集群的自动化部署。
- 在生产环境中使用更安全的认证方式(如 TLS 证书)替代引导 Token。