1. 证书生成前置准备与cfssl工具部署
- 操作位置建议选择master节点的
/etc/kubernetes/pki目录,该目录默认存储集群所有相关证书,避免证书随意存放带来安全风险。 - 第一步生成证书签名请求描述文件:创建名为
devuser.json的文件,写入证书生成规则后保存。 - 第二步部署cfssl证书工具集:cfssl是Kubernetes生态常用的证书签发工具,需要配合
cfssl、cfssljson、cfssl-certinfo三个工具共同使用,官方下载速度较慢,可直接使用课程提供的预置工具包,操作步骤如下:- 将三个工具包上传到服务器家目录
- 移动到
/usr/local/bin目录下 - 为工具添加可执行权限
- 执行
cfssl命令验证工具可用
2. 用户证书生成与kubeconfig文件配置
- 生成dv_user用户证书:执行cfssl签发命令,指定CA证书、CA私钥、证书输出前缀、证书类型为
kubernetes、JSON描述文件路径,执行后生成三类文件:dev_user.csr(证书请求文件)、dv_user.pem(用户证书)、dev_user-key.pem(用户私钥)。 - 生成kubectl配置文件(kubeconfig):该文件用于kubectl连接集群时的身份认证,配置过程分为三步:
- 配置集群参数:指定集群名称为
kubernetes、CA根证书路径、API Server访问地址(如https://192.168.66.11:6443)、配置文件保存路径为devuser.kubeconfig - 配置客户端认证参数:绑定
dev_user用户,关联对应用户证书与私钥,保存到上述kubeconfig文件 - 配置上下文:将集群、用户、默认命名空间
dv关联,上下文命名为kubernetes,保存到配置文件
- 配置集群参数:指定集群名称为
- 完成上述配置后,
devuser.kubeconfig就包含了完整的集群、用户、上下文信息,可直接用于kubectl的集群认证。
3. 权限绑定与鉴权验证
- 权限累加规则说明:Kubernetes权限为累加机制,用户默认无任何操作权限,必须绑定对应的角色(Role)/集群角色(ClusterRole)才能获得操作权限,权限不会自动继承。
- 创建目标命名空间:执行
kubectl create ns dev创建名为dev的命名空间,后续权限绑定均作用于该命名空间。 - 创建角色绑定:将官方预置的集群角色
admin绑定到dev_user用户,绑定范围为dev命名空间,执行命令:
可通过添加kubectl create rolebinding dv-admin-binding --clusterrole=admin --user=dev_user --namespace=dev--dry-run=client -o yaml参数输出对应的YAML资源清单,确认绑定规则:绑定类型为RoleBinding(非ClusterRoleBinding),绑定来源为集群角色admin,绑定用户为dv_user,仅作用于dv命名空间,属于集群角色的“降维绑定”,权限限定在单个命名空间内。 - 切换kubectl上下文:执行
kubectl config use-context kubernetes --kubeconfig=devuser.kubeconfig,加载dev_user的认证配置。 - 权限验证:
- 将
devuser.kubeconfig文件复制到root用户家目录的.kube目录下,重命名为config,替换默认的管理员认证配置 - 执行
kubectl get pod可正常返回(默认查询default命名空间,当前无Pod故返回为空) - 执行
kubectl get pod -n default返回403 Forbidden权限不足,因为dv_user仅拥有dev命名空间的admin权限,无default命名空间的访问权限 - 在
dev命名空间创建Deployment验证:执行kubectl create deployment dv-delaying --image=myapp:v1.0 --namespace=dev,扩容副本数到10,执行kubectl get pod -n dv可看到10个对应Pod,确认dev_user在dev命名空间下的权限符合预期 - 切换回管理员kubeconfig配置后,可正常查询
default命名空间的资源,进一步验证权限隔离的有效性。
- 将
4. Linux系统用户与K8s权限隔离实践
- 为避免手动切换kubeconfig文件的繁琐操作,可结合Linux系统用户实现用户级的K8s权限自动隔离:kubectl默认读取当前登录用户家目录下
.kube目录的config文件,因此为不同K8s用户创建对应的Linux系统用户,将对应kubeconfig文件放在对应用户的家目录下即可实现权限自动匹配。 - 操作步骤:
- 创建Linux系统用户:执行
useradd dev创建用户,执行passwd dev设置密码为123123 - 创建配置目录:在
dev用户的家目录下创建.kube目录 - 复制配置文件:将
devuser.kubeconfig文件复制到/home/dev/.kube/目录下,重命名为config - 配置目录权限:递归修改
/home/dv目录的权限,所有者为dev用户、dev组,确保用户可正常读取配置文件
- 创建Linux系统用户:执行
- 验证:使用
dev用户登录服务器,直接执行kubectl相关命令,默认操作dev命名空间,无需手动切换配置,即可实现用户级的K8s权限隔离。
5. Kubernetes内置常用集群角色说明
Kubernetes官方预置了多种内置集群角色,可直接用于权限绑定,无需手动创建权限规则,常见角色及权限范围如下:
view:只读角色,允许读取指定命名空间中的大多数资源(如Deployment、ConfigMap等),禁止读取Role、RoleBinding、Secret资源,避免权限溢出(Secret关联ServiceAccount,读取后可能获取API Server访问权限)edit:读写角色,允许读取和修改指定命名空间中的大多数资源,禁止查看或修改Role、RoleBinding,防止权限扩散admin:命名空间管理员角色,拥有指定命名空间内除资源配额、命名空间本身外的所有资源的完全控制权限,可读写命名空间内的Role、RoleBinding;与edit角色的核心区别是admin可管理命名空间的权限配置cluster-admin:集群管理员角色,拥有整个Kubernetes集群的完全控制权,是集群内最高权限角色,相当于集群的“root用户”- 补充说明:
system:开头的集群角色均为系统组件专用预设角色,如system:node用于节点管理、system:kubernetes-scheduler用于调度器、system:coredns用于CoreDNS插件,是系统运行的基础权限配置,不建议手动修改。
AI 总结
本小节完成了Kubernetes RBAC鉴权机制的全流程实践:从用户证书生成、kubeconfig配置、角色绑定到权限验证,同时结合Linux系统用户实现了用户级的权限自动隔离,最后介绍了官方预置的4类常用内置集群角色的权限范围。核心要点包括:K8s权限为累加制,用户默认无权限需绑定角色才能获得操作权;集群角色可通过RoleBinding实现“降维绑定”,权限限定在单个命名空间内;可通过系统用户与kubeconfig路径的绑定实现便捷的权限隔离,大幅降低多用户管理的配置成本。