
前置核心概念必看K8s没有内置的用户名、密码数据库权限体系分两层认证你是谁用ServiceAccount服务账号 / 证书 / Token 证明身份授权你能干嘛用RBAC规则控制权限RBAC 4 大核心资源权限的基石资源名级别作用Role命名空间级定义单个命名空间内的权限如只能操作 test 空间的 PodClusterRole集群级定义整个集群的权限如查看所有命名空间的节点RoleBinding命名空间级把 Role 绑定给账号生效权限ClusterRoleBinding集群级把 ClusterRole 绑定给账号生效权限两个关键账号超级管理员拥有集群所有权限集群安装时自动生成普通账号仅拥有限定权限我们手动创建一、超级管理员集群管理员1. 超级管理员从哪来你用kubeadm搭建的 K8s 集群安装完成后自动生成超级管理员配置文件路径/etc/kubernetes/admin.conf✅ 这个文件就是超级管理员的唯一凭证拥有集群最高权限。2. 本机配置超级管理员 kubectl必做在主节点master执行让当前用户直接用超级管理员权限操作集群# 1. 创建kubectl配置目录默认存放权限凭证mkdir-p$HOME/.kube# 2. 复制系统超级管理员配置到当前用户目录sudocp-i/etc/kubernetes/admin.conf$HOME/.kube/config# 3. 修改文件权限让当前用户可读写sudochown$(id-u):$(id-g)$HOME/.kube/config3. 验证超级管理员权限# 查看集群所有节点只有超级管理员能看全集群资源kubectl get nodes# 查看集群所有命名空间kubectl get ns# 查看集群所有权限规则kubectl get clusterrole✅ 能执行所有命令 超级管理员配置成功4. 远程电脑用超级管理员连接集群把主节点的/etc/kubernetes/admin.conf下载到本地电脑改名config放到WindowsC:\Users\你的用户名\.kube\configMac/Linux~/.kube/config本地电脑安装kubectl后直接拥有 超级管理员 权限。二、普通账号权限管理生产标准用法K8s 普通账号统一用ServiceAccountSA服务账号创建这是最简单、最常用的方式。我们创建两种最常用的普通账号命名空间管理员仅能操作特定的命名空间增删改查 Pod/Deployment集群只读账号能看全集群所有资源但不能修改/删除前提创建测试命名空间kubectl create namespacetest场景 1创建「test 命名空间普通管理员」步骤 1创建 ServiceAccount账号本体# 在 test 命名空间创建账号test-adminkubectl create sa test-admin-ntest步骤 2创建 Role定义权限规则创建test-role.yaml# 1. 固定API版本K8s RBAC权限体系专用版本必须这么写apiVersion:rbac.authorization.k8s.io/v1# 2. 资源类型Role 命名空间级权限只能管指定1个命名空间# 如果是 ClusterRole 就是集群级权限管全集群kind:Role# 3. 元数据角色的基本信息metadata:# 核心中的核心这个权限**只在 test 命名空间生效**# 这就是你说的「仅能操作指定命名空间」的来源namespace:test# 权限角色的名字test-role后面绑定账号时要用name:test-role# 4. 权限规则列表真正定义「能干嘛、能操作什么」rules:# 第一条也是唯一一条权限规则-# API组告诉K8s你要管控哪一类资源# 这是K8s资源的分类新手记死这3个就行# 空字符串 核心基础组Pod、Service、ConfigMap、Secret 都属于它# apps 应用组Deployment、StatefulSet 属于它# core 和空字符串完全一样重复了可删掉apiGroups:[,apps,core]# 允许操作的**具体资源列表**# 只有这里写的资源账号才能动没写的一律不能碰resources:[pods,deployments,services,configmaps,secrets]# 允许执行的**操作动作**增删改查的官方标准动词# 通俗翻译# get/list/watch 查查看、列表、监控# create 增创建# update 改修改# delete 删删除verbs:[get,list,watch,create,update,delete]执行创建kubectl apply-ftest-role.yaml步骤 3创建 RoleBinding绑定账号 权限创建test-rolebinding.yaml# 1. 固定API版本RBAC权限体系专用必须写这个apiVersion:rbac.authorization.k8s.io/v1# 2. 资源类型RoleBinding 命名空间级权限绑定# 作用只给【指定单个命名空间】做授权对应 Role# 如果是集群级授权 → 用 ClusterRoleBindingkind:RoleBinding# 3. 元数据绑定的基本信息metadata:# 关键绑定生效范围 test 命名空间# 必须和 Role、ServiceAccount 的命名空间 完全一致namespace:test# 绑定规则的名字test-rolebinding自定义方便识别name:test-rolebinding# 4. subjects被授权的“人/账号”是谁subjects:# 绑定的目标账号-kind:ServiceAccount# 账号类型K8s 服务账号最常用的普通账号name:test-admin# 账号名字test-adminnamespace:test# 账号所在命名空间test# 5. roleRef给这个账号绑定“什么权限”roleRef:kind:Role# 权限类型命名空间级角色对应上面的 Rolename:test-role# 绑定的权限角色名字test-role你上一步创建的apiGroup:rbac.authorization.k8s.io# 固定值不用改执行创建kubectl apply-ftest-rolebinding.yaml场景 2创建「集群只读普通账号」步骤 1创建集群级账号# 在 default 空间创建集群只读账号kubectl create sa cluster-readonly-ndefault步骤 2绑定系统内置只读权限K8s 自带不用手动写K8s 内置了view集群只读角色直接用创建cluster-readonly-binding.yaml# 1. 固定RBAC权限API版本apiVersion:rbac.authorization.k8s.io/v1# 2. 资源类型ClusterRoleBinding 集群级权限绑定# 关键区别# RoleBinding 仅绑定【单个命名空间】权限# ClusterRoleBinding 绑定【整个集群】全局权限kind:ClusterRoleBinding# 3. 元数据metadata:# 重点集群级资源 没有 namespace 字段# 因为它作用于全集群不属于任何一个命名空间name:cluster-readonly-binding# 绑定名称自定义# 4. subjects要授权的「账号」是谁subjects:-kind:ServiceAccount# 账号类型服务账号普通账号name:cluster-readonly# 账号名字namespace:default# 这个账号在 default 命名空间下# 5. roleRef给账号绑定「什么集群级权限」roleRef:kind:ClusterRole# 权限类型集群级角色全局有效name:view# K8s 系统内置的【集群只读角色】apiGroup:rbac.authorization.k8s.io# 固定值执行创建kubectl apply-fcluster-readonly-binding.yaml三、生成普通账号的 kubectl 连接配置kubeconfig这是核心让普通账号在本地电脑用 kubectl 连接集群仅拥有限定权限。通用脚本复制即可用创建脚本create-kubeconfig.sh作用生成账号的 kubeconfig 文件#!/bin/bash# 参数1命名空间# 参数2ServiceAccount账号名# 参数3输出的kubeconfig文件名NAMESPACE$1SA$2OUTPUT$3# 获取集群API地址主节点IP:6443APISERVERhttps://1.1.1.1:6443# 获取账号TokenSECRET$(kubectl get sa $SA-n$NAMESPACE-ojsonpath{.secrets[0].name})TOKEN$(kubectl get secret $SECRET-n$NAMESPACE-ojsonpath{.data.token}|base64-d)# 生成kubeconfigkubectl config set-cluster k8s-cluster--server$APISERVER--insecure-skip-tls-verifytrue--kubeconfig$OUTPUTkubectl config set-credentials$SA--token$TOKEN--kubeconfig$OUTPUTkubectl config set-context default--clusterk8s-cluster--user$SA--kubeconfig$OUTPUTkubectl config use-context default--kubeconfig$OUTPUT授权并执行chmodx create-kubeconfig.sh1. 生成 test 命名空间管理员 kubeconfig./create-kubeconfig.shtesttest-admin test-admin-config2. 生成集群只读账号 kubeconfig./create-kubeconfig.sh default cluster-readonly cluster-readonly-config四、普通账号 kubectl 远程连接使用方法把生成的xxx-config文件放到本地电脑# 本地电脑执行用普通账号连接集群kubectl get pods--kubeconfig./test-admin-config-ntest五、账号 / 权限 增删改查 命令大全1. 查看 ServiceAccount普通账号# 查看所有SAkubectl get sa-A# 查看 test 空间的 SAkubectl get sa-ntest2. 查看权限规则# 查看命名空间Rolekubectl get role-ntest# 查看集群ClusterRolekubectl get clusterrole3. 查看绑定关系kubectl get rolebinding-ntestkubectl get clusterrolebinding4. 删除普通账号# 删除SA账号kubectl delete sa test-admin-ntest# 删除权限规则kubectl delete role test-role-ntest# 删除绑定关系kubectl delete rolebinding test-rolebinding-ntest5. 修改权限# 直接编辑权限规则kubectl edit role test-role-ntest六、权限验证必测1. test 管理员账号测试✅ 允许操作 test 命名空间kubectl run nginx--imagenginx--kubeconfigtest-admin-config-ntest❌ 禁止操作 default 命名空间kubectl get pods-ndefault--kubeconfigtest-admin-config# 报错无权限2. 集群只读账号测试✅ 允许查看全集群资源kubectl get nodes--kubeconfigcluster-readonly-config❌ 禁止创建/删除资源kubectl run nginx--imagenginx--kubeconfigcluster-readonly-config# 报错无权限七、核心汇总表账号类型权限范围资源组合适用场景超级管理员全集群所有权限admin.conf集群运维、初始化命名空间管理员仅单个命名空间SA Role RoleBinding项目开发、测试人员集群只读账号全集群查看无修改SA ClusterRole(view) ClusterRoleBinding运维监控、访客查看超级管理员集群安装自动生成admin.conf是唯一凭证权限无上限普通账号用ServiceAccount创建通过 RBAC 绑定权限权限隔离Role 管单个空间ClusterRole 管全集群kubectl 连接靠kubeconfig文件识别身份和权限生产规范绝对禁止所有人用超级管理员普通账号按需分配权限