K8s 认证、授权 系统

前置核心概念(必看!)

K8s 没有内置的 用户名密码 数据库,权限体系分两层:

  1. 认证 :你是谁?(用 ServiceAccount 服务账号 / 证书 / Token 证明身份)
  2. 授权 :你能干嘛?(用 RBAC 规则控制权限)

RBAC 4 大核心资源(权限的基石)

资源名 级别 作用
Role 命名空间级 定义单个命名空间内的权限(如:只能操作 test 空间的 Pod)
ClusterRole 集群级 定义整个集群的权限(如:查看所有命名空间的节点)
RoleBinding 命名空间级 把 Role 绑定给账号,生效权限
ClusterRoleBinding 集群级 把 ClusterRole 绑定给账号,生效权限

两个关键账号

  1. 超级管理员 :拥有集群所有权限(集群安装时自动生成)
  2. 普通账号 :仅拥有限定权限(我们手动创建)

一、超级管理员(集群管理员)

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 服务账号) 创建,这是最简单、最常用的方式。

我们创建两种最常用的普通账号

  1. 命名空间管理员 :仅能操作 特定的 命名空间(增删改查 Pod/Deployment)
  2. 集群只读账号:能看全集群所有资源,但不能修改/删除

前提:创建测试命名空间

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 运维监控、访客查看
  1. 超级管理员 :集群安装自动生成,admin.conf 是唯一凭证,权限无上限
  2. 普通账号 :用 ServiceAccount 创建,通过 RBAC 绑定权限
  3. 权限隔离:Role 管单个空间,ClusterRole 管全集群
  4. kubectl 连接 :靠 kubeconfig 文件识别身份和权限
  5. 生产规范:绝对禁止所有人用超级管理员,普通账号按需分配权限
相关推荐
云游牧者2 小时前
K8S存储体系全解-从PV-PVC-SC到StatefulSet持久化实战
云原生·容器·kubernetes·pvc·pv·sc·进阶存储卷
姚不倒3 小时前
Go语言实战:多态文件存储系统(接口、错误处理、panic/recover)
云原生·golang
木雷坞3 小时前
csdn-enterpriseGitLab Runner docker pull 慢:并行流水线镜像拉取排查
运维·docker·容器·gitlab
sbjdhjd3 小时前
02 下 | Kubernetes Pod 实战实验完全解析
linux·运维·云原生·kubernetes·podman·kubelet·kubeless
切糕师学AI3 小时前
Envoy 详解:云原生时代的高性能网络代理
网络·云原生·istio·网络代理·envoy·sidecar·网格服务
酷道4 小时前
获取Docker阿里云专属镜像加速地址
阿里云·docker·容器·云计算
古城小栈4 小时前
K8s 存储组件 通俗精讲
云原生·容器·kubernetes
千匠网络4 小时前
千匠网络制造行业渠道分销B2B解决方案:AI驱动,重构产业分销模式
网络·云原生·架构·制造业·b2b·电商解决方案