当我们安装好 Kubernetes 集群后,如果想要把 kubectl 命令交给普通用户使用,就需要对用户的身份进行认证并对其权限做出限制。本文将以创建一个 devuser 用户并将其绑定到 dev 和 test 两个 namespace 为例,详细说明整个配置过程。
在开始之前,请确保你已经:
cfssl 和 cfssljson 工具创建 devuser-csr.json 文件,定义用户的证书信息:
{
"CN": "devuser",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
在 master 节点的 /etc/kubernetes/ssl 目录下,确保包含以下文件:
ca-key.pem ca.pem ca-config.json devuser-csr.json
执行以下命令生成用户证书:
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes devuser-csr.json | cfssljson -bare devuser
成功执行后将生成:
devuser.csr devuser-key.pem devuser.pem
使用以下命令为 devuser 创建专用的 kubeconfig 文件:
# 设置集群参数
export KUBE_APISERVER="https://172.20.0.113:6443"
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/ssl/ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=devuser.kubeconfig
# 设置客户端认证参数
kubectl config set-credentials devuser \
--client-certificate=/etc/kubernetes/ssl/devuser.pem \
--client-key=/etc/kubernetes/ssl/devuser-key.pem \
--embed-certs=true \
--kubeconfig=devuser.kubeconfig
# 设置上下文参数
kubectl config set-context kubernetes \
--cluster=kubernetes \
--user=devuser \
--namespace=dev \
--kubeconfig=devuser.kubeconfig
# 设置默认上下文
kubectl config use-context kubernetes --kubeconfig=devuser.kubeconfig
将生成的 kubeconfig 文件设置为当前使用的配置:
# 备份原有配置(可选)
cp ~/.kube/config ~/.kube/config.backup
# 应用新配置
cp ./devuser.kubeconfig ~/.kube/config
为了限制 devuser 用户的权限范围,使用 RBAC 将用户绑定到特定的 namespace:
# 为 dev namespace 创建角色绑定
kubectl create rolebinding devuser-admin-binding \
--clusterrole=admin \
--user=devuser \
--namespace=dev
# 为 test namespace 创建角色绑定
kubectl create rolebinding devuser-admin-binding-test \
--clusterrole=admin \
--user=devuser \
--namespace=test
这样配置后,devuser 用户将对 dev 和 test 两个 namespace 具有完全的管理权限。
验证 kubectl 是否使用了正确的用户身份:
kubectl config get-contexts
输出示例:
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* kubernetes kubernetes devuser dev
验证用户权限是否按预期工作:
# 应该能正常访问 dev namespace
kubectl get pods --namespace=dev
# 应该能正常访问 test namespace
kubectl get pods --namespace=test
# 应该被拒绝访问 default namespace
kubectl get pods --namespace=default
预期的错误输出:
Error from server (Forbidden): pods is forbidden: User "devuser" cannot list resource "pods" in API group "" in the namespace "default"
<team>-<role>-user通过以上步骤,你已经成功为 Kubernetes 集群创建了一个具有受限权限的用户,该用户只能在指定的 namespace 中进行操作,有效提升了集群的安全性。