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.keybaeldung.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 角色,可以有效保障集群安全,防止未授权访问。


原始标题:Adding Users to Kubernetes with kubectl