1. 概述
在 Kubernetes 环境中,保障并控制对集群的访问是实现高效和安全运维的关键。用户管理是其中的核心环节。和任何结构良好的系统一样,认证(Authentication)是所有请求到达 API Server 后的第一步。无论是普通用户、Pod 中的应用程序,还是 kubelet,它们与集群交互时都需要经过认证和授权流程。
本文将从 Kubernetes 中的认证机制和证书管理讲起,接着介绍如何使用 RBAC(基于角色的访问控制)来管理权限,并通过 kubectl 向 Kubernetes 集群添加用户。
2. 理解 Kubernetes 中的认证机制
当请求到达 API Server 时,第一步是进行认证,确认请求发起者的身份。认证通过后,请求进入授权(Authorization)阶段,判断该用户是否允许执行所请求的操作,最后可能被准入控制器(Admission Controllers)拦截处理。
2.1. 用户类型
Kubernetes 集群中存在两种用户类型:
- Service Account:由 Kubernetes API 管理的用户,用于 Pod 中的进程与 API 通信。
- 普通用户(Normal User):通常是真实用户,通过 kubectl 等工具访问集群。这类用户的身份信息由外部系统管理,Kubernetes 本身没有用户对象(User API Object)。
普通用户的用户名通常来源于证书、Token、密码文件或外部目录服务(如 LDAP)。
2.2. 证书认证
Kubernetes 提供了可配置的认证机制,其中最常用的是基于证书的认证方式。
Kubernetes 使用证书中的 Common Name(CN)字段作为用户名。例如 /CN=baeldung
,代表用户名为 baeldung
。
kubectl 默认使用 $HOME/.kube/config
文件中保存的证书信息进行认证。我们可以通过以下命令查看当前配置:
$ kubectl config view
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://192.168.121.130:6443
name: kubernetes
contexts:
- context:
cluster: kubernetes
user: kubernetes-admin
name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data: DATA+OMITTED
client-key-data: DATA+OMITTED
上述输出中 users
字段展示了当前用户 kubernetes-admin
的证书信息。
3. 创建基于证书的用户
3.1. 生成 CSR
要创建一个名为 baeldung
的用户,我们需要先生成私钥和证书签名请求(CSR):
$ openssl genrsa -out baeldung.key 2048
$ openssl req -new -key baeldung.key -out baeldung.csr -subj "/CN=baeldung"
然后将其 Base64 编码以提交给 Kubernetes API:
$ cat baeldung.csr | base64 | tr -d "\n" > baeldung-base64.csr
3.2. 提交 CSR 到 API Server
创建并提交 CSR 对象:
$ cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: baeldung
spec:
groups:
- system:authenticated
request: $(cat baeldung-base64.csr)
signerName: kubernetes.io/kube-apiserver-client
expirationSeconds: 864000 # ten days
usages:
- client auth
EOF
查看 CSR 状态:
$ kubectl get certificatesigningrequests
NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION
baeldung 34s kubernetes.io/kube-apiserver-client kubernetes-admin 10d Pending
手动批准 CSR:
$ kubectl certificate approve baeldung
批准后状态变为 Approved,Issued
:
$ kubectl get certificatesigningrequests baeldung
NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION
baeldung 22m kubernetes.io/kube-apiserver-client kubernetes-admin 10d Approved,Issued
⚠️ 注意:批准后证书需在一小时内导出,否则可能被 Kubernetes 自动清理。
3.3. 导出证书
执行以下命令导出证书:
$ kubectl get certificatesigningrequests baeldung -o jsonpath='{ .status.certificate }' | base64 --decode > baeldung.crt
此时我们拥有了 baeldung.key
和 baeldung.crt
两个文件,可用于构建 kubeconfig 文件。
3.4. 创建 kubeconfig 文件
设置集群信息:
$ kubectl config set-cluster kubernetes-baeldung --server=https://192.168.121.130:6443 --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true --kubeconfig=baeldung.conf
设置用户认证信息:
$ kubectl config set-credentials baeldung --client-key=baeldung.key --client-certificate=baeldung.crt --embed-certs=true --kubeconfig=baeldung.conf
设置上下文(Context):
$ kubectl config set-context baeldung@kubernetes-baeldung --cluster=kubernetes-baeldung --user=baeldung --kubeconfig=baeldung.conf
设置当前上下文:
$ kubectl config use-context baeldung@kubernetes-baeldung --kubeconfig=baeldung.conf
4. 使用 RBAC 控制访问权限
认证之后是授权(Authorization),RBAC 是 Kubernetes 中最常用的授权方式。
4.1. 创建 Role
例如,创建一个只允许在 default
命名空间中操作 Pod 的角色:
$ kubectl create role baeldung-role --verb=create,get,list --resource=pods --namespace default
4.2. 绑定 Role 到用户
使用 RoleBinding 将用户绑定到该角色:
$ kubectl create rolebinding baeldung-rolebinding --role=baeldung-role --user=baeldung --namespace default
5. 测试配置
使用 kubectl auth can-i
命令验证权限是否配置正确。
✅ 可以创建 Pod:
$ kubectl auth can-i create pods --namespace=default --kubeconfig=baeldung.conf
yes
❌ 不能创建 Deployment:
$ kubectl auth can-i create deployments --namespace=default --kubeconfig=baeldung.conf
no
你也可以将 baeldung.conf
放入 $HOME/.kube
目录,这样 kubectl 会自动加载,无需每次指定 --kubeconfig
。
6. 总结
本文详细介绍了如何通过 kubectl 在 Kubernetes 集群中添加用户,包括:
- 使用证书进行用户认证
- 创建和配置 kubeconfig 文件
- 使用 RBAC 进行权限控制
✅ 良好的用户管理和访问控制是 Kubernetes 安全性的基础。通过合理配置证书、kubeconfig 和 RBAC 角色,可以有效保障集群安全,防止未授权访问。