K8s RBAC实战干货|从用户创建到权限绑定,手把手落地(建议收藏)
在 Kubernetes 集群管理中,权限控制是运维工作的关键环节,而基于角色的访问控制(RBAC)则是日常操作中最常用的权限管理方式。
许多运维人员在配置 RBAC 时,常常在用户创建、证书生成和权限绑定等环节遇到问题,要么命令执行出错,要么权限设置不生效。这篇文章将从单个用户配置到用户组批量授权,一步步带你完成实际操作,建议保存备用,避免后续踩坑。
用 cfssl 生成证书
要配置 RBAC,首先需要创建 Kubernetes 集群能够识别的用户。用户身份的核心是 SSL 证书,这里使用 cfssl 工具快速生成证书,步骤简单实用。
1. 安装并配置 cfssl 工具
从 GitHub 下载 cfssl 工具:
https://github.com/cloudflare/cfssl/releases
下载完成后,为了方便使用,将文件重命名并复制到系统命令目录,同时赋予执行权限:
# 去掉版本号(示例:将cfssl-1.6.5-linux-amd64改为cfssl)
# 拷贝到全局命令
mv cfssl* /usr/local/bin/
# 赋予执行权限
chmod +x /usr/local/bin/cfssl*
2. 生成用户 SSL 证书
生成证书需要两个配置文件:根证书配置(ca-config.json)和客户端签名配置(csr.json)。直接复制下面的内容,根据需要修改即可。
首先是根证书配置文件(ca-config.json),用于定义证书的有效期和使用场景:
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "87600h"
}
}
}
}
然后是客户端签名配置(csr.json),这里的 CN 字段是用户名(这个很重要,不能出错),names 字段可以根据需要修改:
{
"CN": "laoluliaoyunwei",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
配置文件准备好后,执行以下命令生成证书(使用 Kubernetes 自带的 CA 证书签发,路径保持默认不变):
cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config=ca-config.json -profile=kubernetes csr.json | cfssljson -bare laoluliaoyunwei
执行完成后,会生成三个文件(证书、私钥、请求文件),可以通过以下命令查看确认:
ll
# 会看到 laoluliaoyunwei.csr(请求文件)、laoluliaoyunwei-key.pem(私钥)、laoluliaoyunwei.pem(证书)
3. 生成用户 kubeconfig 文件
kubeconfig 是用户访问 Kubernetes 集群的配置文件,包含集群地址和认证信息。使用脚本快速生成,避免手动配置出错。
创建脚本文件 kubeconfig.sh,复制以下内容(注意修改 server 地址为你的 Kubernetes APIServer 地址):
#!/bin/bash
# 配置集群信息
kubectl config set-cluster laoluliaoyunwei-cluster \
--certificate-authority=/etc/kubernetes/pki/ca.crt \
--embed-certs=true \
--server=https://10.0.0.231:6443 \
--kubeconfig=laoluliaoyunwei.kubeconfig
# 配置客户端认证(绑定生成的证书和私钥)
kubectl config set-credentials laoluliaoyunwei-client \
--client-key=laoluliaoyunwei-key.pem \
--client-certificate=laoluliaoyunwei.pem \
--embed-certs=true \
--kubeconfig=laoluliaoyunwei.kubeconfig
# 绑定集群和客户端,创建上下文
kubectl config set-context laoluliaoyunwei \
--cluster=laoluliaoyunwei-cluster \
--user=laoluliaoyunwei-client \
--kubeconfig=laoluliaoyunwei.kubeconfig
# 生效上下文
kubectl config use-context laoluliaoyunwei --kubeconfig=laoluliaoyunwei.kubeconfig
执行脚本生成 kubeconfig 文件:
bash kubeconfig.sh
此时用户已经创建,但使用该用户查看集群资源时(如下命令)会提示无权限,因为还没有为用户分配角色和权限。
kubectl get pods --kubeconfig=laoluliaoyunwei.kubeconfig
为用户分配具体权限
用户创建完成后,接下来需要创建角色(定义权限),并将用户与角色绑定,让用户拥有相应的操作权限。
Kubernetes 中的角色分为两种:局部角色(Role,仅作用于单个命名空间)和全局角色(ClusterRole,作用于整个集群)。这里先介绍最常用的局部角色操作。
1. 创建局部角色(Role)
创建角色资源清单 role.yaml,定义用户可以操作的资源和权限(根据需要修改 resources 和 verbs 字段):
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: laoluliaoyunwei-role
namespace: default # 仅作用于default命名空间
rules:
- apiGroup: ["","apps"] # ""代表v1版本,apps代表apps/v1版本
resources: ["pods","deployments","services"] # 可操作的资源(不能简写)
verbs: ["get","list","delete"] # 可执行的操作(查、列、删)
执行命令创建角色:
kubectl apply -f role.yaml
2. 绑定用户与角色(RoleBinding)
角色创建完成后,需要通过 RoleBinding 将用户和角色绑定,让用户拥有角色定义的权限。创建绑定资源清单 bind.yaml:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: laoluliaoyunwei-bind
namespace: default
subjects: # 绑定的用户
- kind: User
name: laoluliaoyunwei # 对应证书中的CN字段(用户名)
apiGroup: rbac.authorization.k8s.io
roleRef: # 绑定的角色
kind: Role
name: laoluliaoyunwei-role # 上面创建的角色名称
apiGroup: rbac.authorization.k8s.io
执行命令创建绑定:
kubectl apply -f bind.yaml
至此,该用户在 default 命名空间下,就拥有了查看、列出、删除 pod、deployment、service 的权限。再次执行查看命令就能正常显示结果。
kubectl get pods --kubeconfig=laoluliaoyunwei.kubeconfig
用户组批量授权实战
如果集群中有多个用户需要相同的权限,逐个创建用户、绑定角色会非常繁琐。这时可以使用用户组(Group),统一为用户组授权,再将用户加入组,所有用户就能自动拥有组的权限,既高效又便捷。
1. 核心概念
很多运维人员分不清用户和用户组的区别,这里需要注意:
• Kubernetes 中的用户和用户组,都是从 SSL 证书的签名字段中提取的,不需要在集群中单独创建;• 证书中的 CN 字段是用户名,O 字段是用户组名;• APIServer 会优先校验用户名权限,如果没有权限,再校验用户组权限。
2. 创建用户组及证书
首先创建用户组的证书配置文件(和单个用户类似,关键是 O 字段设为用户组名)。这里直接复用根证书配置,创建客户端签名文件 laoluliaoyunwei-csr.json:
{
"CN": "laoluliaoyunwei", # 用户名(可任意,核心是O字段)
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "laoluliaoyunwei-group", # 用户组名(核心)
"OU": "System"
}
]
}
生成用户组相关证书(命令和单个用户一致,仅输出文件名区分):
cfssl gencert -ca=/etc/kubernetes/pki/ca.crt -ca-key=/etc/kubernetes/pki/ca.key -config=ca-group.json -profile=kubernetes laoluliaoyunwei-csr.json | cfssljson -bare laoluliaoyunwei-group
3. 生成用户组 kubeconfig 文件
创建脚本 kubeconfig.sh(和单个用户脚本类似,修改 kubeconfig 文件名即可),执行脚本生成用户组的配置文件:
#!/bin/bash
kubectl config set-cluster laoluliaoyunwei-cluster \
--certificate-authority=/etc/kubernetes/pki/ca.crt \
--embed-certs=true \
--server=https://10.0.0.231:6443 \
--kubeconfig=laoluliaoyunwei-group.kubeconfig
kubectl config set-credentials xinjizhiw-client \
--client-key=laoluliaoyunwei-group-key.pem \
--client-certificate=laoluliaoyunwei-group.pem \
--embed-certs=true \
--kubeconfig=laoluliaoyunwei-group.kubeconfig
kubectl config set-context laoluliaoyunwei-group \
--cluster=laoluliaoyunwei-cluster \
--user=xinjizhiw-client \
--kubeconfig=laoluliaoyunwei-group.kubeconfig
kubectl config use-context laoluliaoyunwei-group --kubeconfig=laoluliaoyunwei-group.kubeconfig
bash kubeconfig.sh
4. 创建角色并绑定用户组
创建资源清单 rbac.yaml,同时定义角色和角色绑定(绑定对象改为用户组):
# 创建角色(定义用户组的权限)
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: default
name: role-group
rules:
- apiGroups: ["","apps"]
resources: ["pods","nodes","services","deployments"]
verbs: ["get", "watch", "list","create"] # 可执行的操作
---
# 绑定用户组与角色
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: group-rolebinding
namespace: default
subjects:
- kind: Group # 主体类型改为Group
name: laoluliaoyunwei-group # 对应证书中的O字段(用户组名)
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: role-group # 上面创建的角色名称
apiGroup: rbac.authorization.k8s.io
执行命令创建资源:
kubectl apply -f rbac.yaml
5. 创建用户并加入用户组
只需要在创建用户时,将证书的 O 字段设为用户组名(laoluliaoyunwei-group),该用户就会自动加入该用户组,继承组的权限。
创建用户证书配置文件 group-user-laolu.json(关键是 O 字段和用户组一致):
{
"CN": "laolu", # 新用户名
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "BeiJing",
"L": "BeiJing",
"O": "laoluliaoyunwei-group", # 加入的用户组名
"OU": "System"
}
]
}
生成用户证书并创建 kubeconfig 文件(步骤和单个用户一致)。执行完成后,该用户就拥有了用户组的所有权限,不需要再单独绑定角色。
总结
通过以上实际操作,我们涵盖了 RBAC 最核心的两个场景:单个用户授权和用户组批量授权,从证书生成、kubeconfig 配置,到角色创建、权限绑定,每一步都有具体命令和配置文件,可以直接复制使用。
RBAC 是 Kubernetes 权限管理的基础,也是运维必备技能。建议收藏本文,下次配置权限时可以直接对照操作,避免重复踩坑。如果在实际操作中遇到问题,欢迎在评论区交流。
更多推荐




所有评论(0)