在 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 权限管理的基础,也是运维必备技能。建议收藏本文,下次配置权限时可以直接对照操作,避免重复踩坑。如果在实际操作中遇到问题,欢迎在评论区交流。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐