前置核心概念(必看!)
K8s 没有内置的 用户名 、 密码 数据库,权限体系分两层:
- 认证 :你是谁?(用
ServiceAccount服务账号 / 证书 / Token 证明身份) - 授权 :你能干嘛?(用 RBAC 规则控制权限)
RBAC 4 大核心资源(权限的基石)
| 资源名 | 级别 | 作用 |
|---|---|---|
| Role | 命名空间级 | 定义单个命名空间内的权限(如:只能操作 test 空间的 Pod) |
| ClusterRole | 集群级 | 定义整个集群的权限(如:查看所有命名空间的节点) |
| RoleBinding | 命名空间级 | 把 Role 绑定给账号,生效权限 |
| ClusterRoleBinding | 集群级 | 把 ClusterRole 绑定给账号,生效权限 |
两个关键账号
- 超级管理员 :拥有集群所有权限(集群安装时自动生成)
- 普通账号 :仅拥有限定权限(我们手动创建)
一、超级管理员(集群管理员)
1. 超级管理员从哪来?
你用 kubeadm 搭建的 K8s 集群,安装完成后自动生成超级管理员
配置文件路径:/etc/kubernetes/admin.conf
✅ 这个 文件 就是超级管理员的唯一凭证,拥有集群最高权限。
2. 本机配置超级管理员 kubectl(必做)
在主节点(master) 执行,让当前用户直接用超级管理员权限操作集群:
bash
# 1. 创建kubectl配置目录(默认存放权限凭证)
mkdir -p $HOME/.kube
# 2. 复制系统超级管理员配置到当前用户目录
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# 3. 修改文件权限,让当前用户可读写
sudo chown $(id -u):$(id -g) $HOME/.kube/config
3. 验证超级管理员权限
bash
# 查看集群所有节点(只有超级管理员能看全集群资源)
kubectl get nodes
# 查看集群所有命名空间
kubectl get ns
# 查看集群所有权限规则
kubectl get clusterrole
✅ 能执行所有命令 = 超级管理员配置成功
4. 远程电脑用超级管理员连接集群
把主节点的 /etc/kubernetes/admin.conf 下载到本地电脑,改名 config,放到:
- Windows:
C:\Users\你的用户名\.kube\config - Mac/Linux:
~/.kube/config
本地电脑安装 kubectl 后,直接拥有 超级管理员 权限。
二、普通账号权限管理(生产标准用法)
K8s 普通账号统一用 ServiceAccount(SA 服务账号) 创建,这是最简单、最常用的方式。
我们创建两种最常用的普通账号:
- 命名空间管理员 :仅能操作
特定的命名空间(增删改查 Pod/Deployment) - 集群只读账号:能看全集群所有资源,但不能修改/删除
前提:创建测试命名空间
bash
kubectl create namespace test
场景 1:创建「test 命名空间普通管理员」
步骤 1:创建 ServiceAccount(账号本体)
bash
# 在 test 命名空间,创建账号:test-admin
kubectl create sa test-admin -n test
步骤 2:创建 Role(定义权限规则)
创建 test-role.yaml:
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"]
执行创建:
bash
kubectl apply -f test-role.yaml
步骤 3:创建 RoleBinding(绑定账号 + 权限)
创建 test-rolebinding.yaml:
yaml
# 1. 固定API版本:RBAC权限体系专用,必须写这个
apiVersion: rbac.authorization.k8s.io/v1
# 2. 资源类型:RoleBinding = 命名空间级权限绑定
# 作用:只给【指定单个命名空间】做授权(对应 Role)
# 如果是集群级授权 → 用 ClusterRoleBinding
kind: RoleBinding
# 3. 元数据:绑定的基本信息
metadata:
# 🔥 关键:绑定生效范围 = test 命名空间
# 必须和 Role、ServiceAccount 的命名空间 完全一致!
namespace: test
# 绑定规则的名字:test-rolebinding(自定义,方便识别)
name: test-rolebinding
# 4. subjects:被授权的"人/账号"是谁?
subjects:
# 绑定的目标账号
- kind: ServiceAccount # 账号类型:K8s 服务账号(最常用的普通账号)
name: test-admin # 账号名字:test-admin
namespace: test # 账号所在命名空间:test
# 5. roleRef:给这个账号绑定"什么权限"?
roleRef:
kind: Role # 权限类型:命名空间级角色(对应上面的 Role)
name: test-role # 绑定的权限角色名字:test-role(你上一步创建的)
apiGroup: rbac.authorization.k8s.io # 固定值,不用改
执行创建:
bash
kubectl apply -f test-rolebinding.yaml
场景 2:创建「集群只读普通账号」
步骤 1:创建集群级账号
bash
# 在 default 空间创建集群只读账号
kubectl create sa cluster-readonly -n default
步骤 2:绑定系统内置只读权限(K8s 自带,不用手动写)
K8s 内置了 view 集群只读角色,直接用!
创建 cluster-readonly-binding.yaml:
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 # 固定值
执行创建:
bash
kubectl apply -f cluster-readonly-binding.yaml
三、生成普通账号的 kubectl 连接配置(kubeconfig)
这是核心:让普通账号在本地电脑用 kubectl 连接集群,仅拥有限定权限。
通用脚本(复制即可用)
创建脚本 create-kubeconfig.sh,作用:生成账号的 kubeconfig 文件
bash
#!/bin/bash
# 参数1:命名空间
# 参数2:ServiceAccount账号名
# 参数3:输出的kubeconfig文件名
NAMESPACE=$1
SA=$2
OUTPUT=$3
# 获取集群API地址(主节点IP:6443)
APISERVER=https://1.1.1.1:6443
# 获取账号Token
SECRET=$(kubectl get sa $SA -n $NAMESPACE -o jsonpath={.secrets[0].name})
TOKEN=$(kubectl get secret $SECRET -n $NAMESPACE -o jsonpath={.data.token} | base64 -d)
# 生成kubeconfig
kubectl config set-cluster k8s-cluster --server=$APISERVER --insecure-skip-tls-verify=true --kubeconfig=$OUTPUT
kubectl config set-credentials $SA --token=$TOKEN --kubeconfig=$OUTPUT
kubectl config set-context default --cluster=k8s-cluster --user=$SA --kubeconfig=$OUTPUT
kubectl config use-context default --kubeconfig=$OUTPUT
授权并执行:
bash
chmod +x create-kubeconfig.sh
1. 生成 test 命名空间管理员 kubeconfig
bash
./create-kubeconfig.sh test test-admin test-admin-config
2. 生成集群只读账号 kubeconfig
bash
./create-kubeconfig.sh default cluster-readonly cluster-readonly-config
四、普通账号 kubectl 远程连接使用
方法:把生成的 xxx-config 文件放到本地电脑
bash
# 本地电脑执行,用普通账号连接集群
kubectl get pods --kubeconfig=./test-admin-config -n test
五、账号 / 权限 增删改查 命令大全
1. 查看 ServiceAccount(普通账号)
bash
# 查看所有SA
kubectl get sa -A
# 查看 test 空间的 SA
kubectl get sa -n test
2. 查看权限规则
bash
# 查看命名空间Role
kubectl get role -n test
# 查看集群ClusterRole
kubectl get clusterrole
3. 查看绑定关系
bash
kubectl get rolebinding -n test
kubectl get clusterrolebinding
4. 删除普通账号
bash
# 删除SA账号
kubectl delete sa test-admin -n test
# 删除权限规则
kubectl delete role test-role -n test
# 删除绑定关系
kubectl delete rolebinding test-rolebinding -n test
5. 修改权限
bash
# 直接编辑权限规则
kubectl edit role test-role -n test
六、权限验证(必测!)
1. test 管理员账号测试
✅ 允许:操作 test 命名空间
bash
kubectl run nginx --image=nginx --kubeconfig=test-admin-config -n test
❌ 禁止:操作 default 命名空间
bash
kubectl get pods -n default --kubeconfig=test-admin-config
# 报错:无权限
2. 集群只读账号测试
✅ 允许:查看全集群资源
bash
kubectl get nodes --kubeconfig=cluster-readonly-config
❌ 禁止:创建/删除资源
bash
kubectl run nginx --image=nginx --kubeconfig=cluster-readonly-config
# 报错:无权限
七、核心汇总表
| 账号类型 | 权限范围 | 资源组合 | 适用场景 |
|---|---|---|---|
| 超级管理员 | 全集群所有权限 | admin.conf | 集群运维、初始化 |
| 命名空间管理员 | 仅单个命名空间 | SA + Role + RoleBinding | 项目开发、测试人员 |
| 集群只读账号 | 全集群查看,无修改 | SA + ClusterRole(view) + ClusterRoleBinding | 运维监控、访客查看 |
- 超级管理员 :集群安装自动生成,
admin.conf是唯一凭证,权限无上限 - 普通账号 :用
ServiceAccount创建,通过 RBAC 绑定权限 - 权限隔离:Role 管单个空间,ClusterRole 管全集群
- kubectl 连接 :靠
kubeconfig文件识别身份和权限 - 生产规范:绝对禁止所有人用超级管理员,普通账号按需分配权限