User & Group

k8s 的用户体系比较奇特,它内部不存储任何用户信息,一切的身份校验都是围绕以 kube-ca 这个根 CA 为核心的证书签发来实现的。

通过 CSR 创建 username 和 group。通过 RoleBinding 将 Role 绑定到 username 或 group。

k8s 本身不存储用户,当请求到达 apiserver 时,从证书或 token 中获取 username,然后根据 username 查询相关联的 ClusterRole 和 Role,再根据这些 roles 获取用户的全部权限。可以通过 kubectl 查询当前用户是否有某个权限 kubectl auth can-i xxx

创建用户和组

创建一个用户:

# 生成用户私钥
openssl genrsa -out admin.key 2048

# 创建用户的 CSR,指定用户名和 group(不建议用 group)
openssl req -new -key admin.key -out admin.csr -subj "/CN=admin/O=app1/O=app2"

# 用 kube-ca 这个集群根 CA 签发用户证书
openssl x509 -req -in admin.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out admin.crt -days 3650

# 为 kubectl 设置用户
kubectl config set-credentials admin --client-certificate=admin.crt  --client-key=admin.key

# 上述方法是在 kubectl 中指定 crt 和 key 的路径,
# 可以用 base64 将其转换为字符串
kubectl config set users.admin.client-certificate-data "$(cat admin.crt| base64 -i)"
kubectl config set users.admin.client-key-data "$(cat admin.key| base64 -i)"

上述 CSR 就是申请创建一个名为 hello,用户组为 app1 和 app2 的用户。

(需要创建 RBAC 后才能具有权限)

吊销用户

如果是基于 k8s 默认的证书的形式创建的用户,那么 k8s 未提供吊销机制。只能删除与之相关的 RoleBiding 来解除相关用户的权限。

要想实现吊销用户,只能依赖外部的用户体系,如 OICD