k8s rbac授权详解

rbac是什么

用户使用普通用户管理k8s集群,有什么的权限

pod访问k8s权限,如何呢,就是靠这个service account

角色role 给每个空间设置权限,如果有多个空间的话,就比较的麻烦

因此的话就需要这个集群角色,不是名称空间级别的,设置一个集群角色后,在绑定的时候,就能应用在多个空间下了

身份认证

目前在k8s集群环境下,只能在master上执行命令,在node节点上执行就会报错

[root@node1 ~]# kubectl get pod 
The connection to the server localhost:8080 was refused - did you specify the right host or port?

为什么会报错呢?原因就是node节点上没有认证文件,master节点上有认证文件

[root@master kubernetes]# ls
admin.conf  controller-manager.conf  kubelet.conf  manifests  pki  scheduler.conf

# 这个admin.conf和/root/.kube/config内容是一致的

这个文件就是一个管理员账户文件

node节点操作

将管理员文件拷贝到node节点上

[root@master kubernetes]# scp admin.conf  192.168.50.21:/root

# 指定--kubeconfig就能执行命令了
[root@node1 ~]# kubectl get pod --kubeconfig=admin.conf
NAME                                      READY   STATUS    RESTARTS   AGE
nfs-client-provisioner-5cf5744c5f-fzjh8   1/1     Running   4          9d


# 直接写入到环境变量里面去
echo "export KUBECONFIG=/root/admin.conf" >> /etc/profile

# 就只能不带上kubeconfig就能操作k8s集群了

但是了存在一个问题,这个账号是管理员的权限,对这个集群有所有的权限,那不能有一个部分权限的用户呢,就是只有创建的权限,没有删除的权限这种呢?下面会讲

普通用户授权

现在创建一个普通用户zhangsan并授权

1、生成私钥

# 生成一个rsa类型的私钥,文件名为client.key
[root@master ca]# openssl genrsa --out client.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
.........................................................................................+++++
..........+++++
e is 65537 (0x010001)
[root@master ca]# ls
client.key

2、生成zhangsan用户证书请求文件

# 基于client.key生成证书请求文件client.csr
[root@master ca]# openssl req --new --key client.key --subj "/CN=zhangsan" --out client.csr
[root@master ca]# ls
client.csr  client.key

3、为zhangsan用户颁发证书

zhangsan用户如何将请求发送给k8s的ca进行证书颁发呢?使用k8s自带的ca颁发证书

[root@master ca]# openssl x509 -req -in  client.csr -CA /etc/kubernetes/pki/ca.crt --CAkey /etc/kubernetes/pki/ca.key --CAcreateserial -out client.crt -days 3650
Signature ok
subject=CN = zhangsan
Getting CA Private Key

# 拷贝ca到当前目录
[root@master ca]# cp /etc/kubernetes/pki/ca.crt .
[root@master ca]# ls
ca.crt  client.crt  client.csr  client.key

4、创建命名空间和pod

[root@master ca]# kubectl create ns zhangsan
namespace/zhangsan created

[root@master ca]# kubectl run b1 --image=nginx:1.25 --image-pull-policy IfNotPresent  --namespace zhangsan --dry-run=client -o yaml > n1.yml
[root@master ca]# kubectl apply -f n1.yml 
pod/b1 created

[root@master ca]# kubectl get pod  -n zhangsan 
NAME   READY   STATUS    RESTARTS   AGE
b1     1/1     Running   0          24s

5、创建角色

角色就是一个权限,给这个用户添加什么样的权限

起初zhangsan只有查看的权限,一个一个的添加权限

多个角色

  • 开发角色,有增改差权限

  • 普通用户角色,只有查的权限

  • 管理员角色

角色具有命名空间级别的
集群角色没有命名空间,是集群的,所有空间都能看到

为什么会有集群角色呢?

  • 因为角色是一个命名空间级别的,多个空间,就需要创建多个角色,比较的麻烦

  • 因此的话,有多个空间的时候且需要的角色的权限是一致的时候,创建集群角色的话,就比较的方便,多个空间可以使用这个集群角色

# 查看角色api
[root@master ca]# kubectl api-resources | grep role 
clusterrolebindings                            rbac.authorization.k8s.io/v1           false        ClusterRoleBinding
clusterroles                                   rbac.authorization.k8s.io/v1           false        ClusterRole
rolebindings                                   rbac.authorization.k8s.io/v1           true         RoleBinding
roles                                          rbac.authorization.k8s.io/v1           true         Role

# 创建zhangsan空间下一个角色为pod-reader,权限为对于pod这个资源只有查看的权限
[root@master ca]# kubectl create role pod-reader --verb=get,list,watch --resource=pods --namespace zhangsan
role.rbac.authorization.k8s.io/pod-reader created

[root@master ca]# kubectl get role -n zhangsan 
NAME         CREATED AT
pod-reader   2026-05-02T08:43:27Z
[root@master ca]# kubectl describe role -n zhangsan pod-reader 
Name:         pod-reader
Labels:       <none>
Annotations:  <none>
PolicyRule:
  Resources  Non-Resource URLs  Resource Names  Verbs
  ---------  -----------------  --------------  -----
  pods       []                 []              [get list watch]


6、绑定角色给用户

角色绑定和集群角色绑定

这个的话就是非常重要的

# 将角色绑定到zhangsan这个用户上了
[root@master ca]# kubectl create rolebinding zhangsan  --namespace zhangsan --role pod-reader --user zhangsan
rolebinding.rbac.authorization.k8s.io/zhangsan created
[root@master ca]# kubectl get rolebindings.rbac.authorization.k8s.io  -n zhangsan 
NAME       ROLE              AGE
zhangsan   Role/pod-reader   6s
[root@master ca]# kubectl describe rolebindings.rbac.authorization.k8s.io -n zhangsan zhangsan Name:         zhangsan
Labels:       <none>
Annotations:  <none>
Role:
  Kind:  Role
  Name:  pod-reader
Subjects:
  Kind  Name      Namespace
  ----  ----      ---------
  User  zhangsan  


上面的操作实现了zhangsan对zhangsan空间下的pod具有查看的权限

7、编辑kubeconfig文件

编写一个zhangsan的kubeconfig文件

后面会将密钥文件嵌入到kubeconfig文件里面

[root@master ca]# cat kube-zhangsan
apiVersion: v1
kind: Config
 
clusters:
- cluster:
  name: cluster-zs  # 集群名字可以自定义
 
users:
- name: zhangsan  # 用户是zhangsan
 
contexts:
- context:
  name: context-zs
  namespace: zhangsan  # 命名空间是zhangsan
current-context: "context-zs"


将之前的密钥文件嵌入到kuubeconfig文件中去

8、嵌入密钥文件

[root@master ca]# ls
ca.crt  client.crt  client.csr  client.key  kube-zhangsan  n1.yml

# 嵌入ca文件,就是修改kubeconfig这个文件
[root@master ca]# kubectl config --kubeconfig=kube-zhangsan set-cluster cluster-zs --server=https://192.168.50.20:6443 --certificate-authority=ca.crt --embed-certs=true
Cluster "cluster-zs" set.


# 嵌入client
[root@master ca]# kubectl config --kubeconfig=kube-zhangsan set-credentials zhangsan --client-certificate=client.crt --client-key=client.key  --embed-certs=true
User "zhangsan" set.

# 此时看这个kube-zhangsan文件的信息就非常的多了

# 设置上下文信息
[root@master ca]# kubectl config --kubeconfig=kube-zhangsan set-context context-zs --cluster=cluster-zs --namespace=zhangsan --user=zhangsan
Context "context-zs" modified.

9、验证权限

# 只有查看zhangsan空间下pod的权限
# 每次操作的时候都需要带上--kubec-config,不想带的话,就添加到环境变量中
[root@master ca]# kubectl get pod  --kubeconfig=kube-zhangsan 
NAME   READY   STATUS    RESTARTS   AGE
b1     1/1     Running   0          122m

# 查看ns,发现没有权限
[root@master ca]# kubectl get ns --kubeconfig=kube-zhangsan 
Error from server (Forbidden): namespaces is forbidden: User "zhangsan" cannot list resource "namespaces" in API group "" at the cluster scope

# 以后就可以发布这个文件给别人,这样就不会使用admin账号

这样的话,就是一个创建用户并授权的过程

注意的点

[root@master ca]# kubectl config get-contexts 
CURRENT   NAME                          CLUSTER      AUTHINFO           NAMESPACE
*         kubernetes-admin@kubernetes   kubernetes   kubernetes-admin   

# 默认读取的文件是/root/.kube/config文件

静态token登录

使用账号和密码登录

静态的方式就是创建一个csv文件,csv的格式是token,user,id

1、生成token

# 尽量将文件存放在/etc/kubernetes/pki下,k8s默认对这个目录有权限操作
[root@master pki]# openssl rand -hex 10 > jerry.csv
[root@master pki]# cat jerry.csv 
bfd16b92c578aaa14594
[root@master pki]# vim jerry.csv 

# 编辑文件内容,添加用户名和id
[root@master pki]# cat jerry.csv 
bfd16b92c578aaa14594,jerry,2000

2、在apiserver加入参数

[root@master pki]# vim /etc/kubernetes/manifests/kube-apiserver.yaml 

spec:
  containers:
  - command:
    - kube-apiserver
    # 添加下面的--token-auth-file
    - --token-auth-file=/etc/kubernetes/pki/jerry.csv

# 重启kubelet
[root@master pki]# systemctl restart kubelet.service 

3、尝试登录集群

[root@node1 ~]# kubectl --server="https://192.168.50.20:6443" --token="bfd16b92c578aaa14594" get pod 
Unable to connect to the server: x509: certificate signed by unknown authority

# 报了一个x509错误,需要跳过安全认证

# 现在就登录了,发现没有权限,只是看不到信息而已
[root@node1 ~]# kubectl --server="https://192.168.50.20:6443" --token="bfd16b92c578aaa14594" --insecure-skip-tls-verify=true get pod 
Error from server (Forbidden): pods is forbidden: User "jerry" cannot list resource "pods" in API group "" in the namespace "default"

后面为这个用户添加权限就能看到一些资源了

角色授权

上面我们提到了用户登录的2种方式,有一点点授权的操作,下面会详解的介绍授权的细节

默认情况下k8s采用的是node和RBAC的鉴权模式

# 可以在kube-apiserver文件里面看到,定义的配置

spec:
  containers:
  - command:
    - kube-apiserver
    - --token-auth-file=/etc/kubernetes/pki/jerry.csv
    - --advertise-address=192.168.50.20
    - --allow-privileged=true
    # 下面这一行,node访问的时候,鉴权使用的是rbac模式
    - --authorization-mode=Node,RBAC

上面我们使用jerry用户登录但是没有任何的权限,现在我们将这一行的参数改掉

[root@node1 ~]# kubectl --server="https://192.168.50.20:6443" --token="bfd16b92c578aaa14594" get pod --insecure-skip-tls-verify=true  -n zhangsan
Error from server (Forbidden): pods is forbidden: User "jerry" cannot list resource "pods" in API group "" in the namespace "zhangsan"



spec:
  containers:
  - command:
    - kube-apiserver
    - --token-auth-file=/etc/kubernetes/pki/jerry.csv
    - --advertise-address=192.168.50.20
    - --allow-privileged=true
      # - --authorization-mode=Node,RBAC
    - --authorization-mode=AlwaysAllow  # 这个就是允许访问,全部放行,用于测试用的

# 重启kubelet
[root@master manifests]# systemctl restart kubelet

在node节点尝试使用jerry用户

[root@node1 ~]# kubectl --server="https://192.168.50.20:6443" --token="bfd16b92c578aaa14594" get pod --insecure-skip-tls-verify=true  -n zhangsan
No resources found in zhangsan namespace.

# 发现可以访问了

将这个测试改回之前的

二、role和rolebinding

首先角色和角色绑定都具有命名空间,也就是说在A空间创建了角色,绑定了角色,那么在其他空间下,就不能使用了,除非在其他空间创建相应的角色

img

就是将权限给这个角色,角色绑定将这个角色和用户进行绑定,这样的话,这个用户就有了对应的角色,有了在这个命名空间下对应的操作了

回到我们上面的实验,jerry用户没有权限,我们创建一个角色,角色绑定

1、role创建

[root@master rbac]# kubectl create role jerry --verb="get,list,watch" --resource=pods --dry-run=client -o yaml > jerry-role.yml

# 默认在default空间下创建的role,只对role空间有作用
[root@master rbac]# cat jerry.yml 
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  creationTimestamp: null
  name: jerry
rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
  - list
  - watch

[root@master rbac]# kubectl apply -f jerry.yml 
[root@master rbac]# kubectl get role
NAME                                    CREATED AT
jerry                                   2026-05-07T10:38:41Z
leader-locking-nfs-client-provisioner   2026-04-18T10:45:47Z

2、rolebinding创建

将用户jerry和role进行绑定,这样的话,用户就有这个角色

新版本的话,需要指定用户的token,老版本不会有这个问题,新版本不指定的话,是没有权限的

[root@master rbac]# kubectl create rolebinding jerry --role=jerry --user=jerry --token="bfd16b92c578aaa14594" --dry-run=client -o yaml > jerry-rolebinding.yml

[root@master rbac]# kubectl apply -f jerry-rolebinding.yml 
rolebinding.rbac.authorization.k8s.io/jerry created
[root@master rbac]# kubectl get rolebindings.rbac.authorization.k8s.io 
NAME                                    ROLE                                         AGE
jerry                                   Role/jerry                                   4s
leader-locking-nfs-client-provisioner   Role/leader-locking-nfs-client-provisioner   19d

3、验证jerry权限

# 在node节点上,发现jerry有对default空间的查看权限
[root@node1 ~]# kubectl --server="https://192.168.50.20:6443" --token="bfd16b92c578aaa14594" --insecure-skip-tls-verify=true get pod
NAME                                      READY   STATUS    RESTARTS   AGE
nfs-client-provisioner-5cf5744c5f-fzjh8   1/1     Running   10         15d

# 但是查看不了kube-system空间下的权限
[root@node1 ~]# kubectl --server="https://192.168.50.20:6443" --token="bfd16b92c578aaa14594" --insecure-skip-tls-verify=true get pod -n kube-system
Error from server (Forbidden): pods is forbidden: User "jerry" cannot list resource "pods" in API group "" in the namespace "kube-system"

发现jerry是可以看到default空间下的pod的详细信息的,但是没有创建,删除等权限,因此我们需要添加jerry用户有创建,删除的权限,给角色添加一个权限就行了

4、修改role权限

有创建,删除pod的权限

[root@master rbac]# cat jerry-role.yml 
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  creationTimestamp: null
  name: jerry
rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
  - list
  - watch
  - create
  - delete

# 添加create和delete即可

[root@master rbac]# kubectl apply -f jerry-role.yml 
role.rbac.authorization.k8s.io/jerry configured

5、验证增加的权限是否成功

# 发现有创建pod的权限
[root@node1 ~]# kubectl --server="https://192.168.50.20:6443" --token="bfd16b92c578aaa14594" --insecure-skip-tls-verify=true run test01  --image nginx
pod/test01 created

# 删除pod

[root@node1 ~]# kubectl --server="https://192.168.50.20:6443" --token="bfd16b92c578aaa14594" --insecure-skip-tls-verify=true delete pod test01
pod "test01" deleted


6、增加对deploy资源的操作

上面是对pod有查询,创建,删除的操作,那么对deployment资源呢?

# jerry用户查看deploy,发现没有权限操作
[root@node1 ~]# kubectl --server="https://192.168.50.20:6443" --token="bfd16b92c578aaa14594" --insecure-skip-tls-verify=true get deploy
Error from server (Forbidden): deployments.apps is forbidden: User "jerry" cannot list resource "deployments" in API group "apps" in the namespace "default"


修改权限,增加对deploy资源的操作

[root@master rbac]# cat jerry-role.yml 
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  creationTimestamp: null
  name: jerry
rules:
- apiGroups:
  - ""  # 这个为空默认是 v1,是pod的权限
  - "apps"  # 这个是deploy的api,完整的名是apps/v1,只需要写父级别即可
  resources:
  - pods
  - deployments  # 对deploy资源的操作
  verbs:
  - get
  - list
  - watch
  - create
  - delete

[root@master rbac]# kubectl apply -f jerry-role.yml 
role.rbac.authorization.k8s.io/jerry configured

这样我们就有查看deploy的权限了

[root@node1 ~]# kubectl --server="https://192.168.50.20:6443" --token="bfd16b92c578aaa14594" --insecure-skip-tls-verify=true get deploy
NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
nfs-client-provisioner   1/1     1            1           19d

# 也可以创建deploy资源
[root@node1 ~]# kubectl --server="https://192.168.50.20:6443" --token="bfd16b92c578aaa14594" --insecure-skip-tls-verify=true create deploy web1 --image nginx 
deployment.apps/web1 created


# 但是了修改副本数量的话,还需要再role里面添加一个path操作才行
# 发现不能修改副本数量,还需要添加patch操作和一个api
[root@node1 ~]# kubectl --server="https://192.168.50.20:6443" --token="bfd16b92c578aaa14594" --insecure-skip-tls-verify=true scale deploy web1 --replicas 2
Error from server (Forbidden): deployments.apps "web1" is forbidden: User "jerry" cannot patch resource "deployments/scale" in API group "apps" in the namespace "default"


[root@master rbac]# cat jerry-role.yml 
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  creationTimestamp: null
  name: jerry
rules:
- apiGroups:
  - ""
  - "apps"
  resources:
  - pods
  - deployments
  - deployments/scale  # 修改副本数量的api
  verbs:
  - get
  - list
  - watch
  - create
  - delete
  - patch  # 动态修改资源

[root@master rbac]# kubectl apply -f jerry-role.yml 
role.rbac.authorization.k8s.io/jerry configured

# 就可以修改副本数量了
[root@node1 ~]# kubectl --server="https://192.168.50.20:6443" --token="bfd16b92c578aaa14594" --insecure-skip-tls-verify=true scale deploy web1 --replicas 2
deployment.apps/web1 scaled

7、role的另外一种写法

# 使用列表的写法

[root@master rbac]# cat jerry-role.yml 
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  creationTimestamp: null
  name: jerry
rules:
- apiGroups: ["","apps"]  # 以这种[] 写法
  resources: ["pods","deployments"]
  verbs: ["get","create","delete"]


三、clusterrole和clusterrolebinding

img

role是具有名称空间的,就是属于一个空间下的,如果有多个空间的话,就需要创建多个role,如果空间的权限都差不多的话,就是比较的麻烦,因此就有这个集群角色

集群角色是整个集群都能使用的,不属于任何一个名称空间,所有空间都能看到这个clusterrole,就直接使用集群绑定即可

集群角色可以被角色绑定使用,就是需要角色绑定的时候指定一个命名空间即可,就是这个集群角色相当于是一个没有指定特定命名空间的role

1、创建一个新的用户

[root@master pki]# openssl rand -hex 10 >> jerry.csv 
# 新添加一个tom用户
[root@master pki]# cat jerry.csv 
bfd16b92c578aaa14594,jerry,2000
ec413db6b69b266830b2,tom,2001

2、创建一个clusterrole

[root@master rbac]# kubectl create clusterrole cluster-pod --verb="get,list,watch" --resource=pods --dry-run=client -o yaml > clusterrole.yml
[root@master rbac]# kubectl apply -f clusterrole.yml 
clusterrole.rbac.authorization.k8s.io/cluster-pod created

3、创建集群角色绑定

[root@master rbac]# kubectl create clusterrolebinding cluster-tom --clusterrole=cluster-pod --user=tom --token="ec413db6b69b266830b2" --dry-run=client -o yaml > clusterrolebind.yml
[root@master rbac]# kubectl apply -f clusterrolebind.yml 
clusterrolebinding.rbac.authorization.k8s.io/cluster-tom created

4、验证tom用户权限

# 发现一个问题
[root@node1 ~]# kubectl --server="https://192.168.50.20:6443" --token="ec413db6b69b266830b2" --insecure-skip-tls-verify=true get pod
error: You must be logged in to the server (Unauthorized)


# 有缓存的,可以重启

# 还有一个解决方法就是重启kube-system里面的apiserver这个pod

[root@master rbac]# docker restart 91c6dc0fd3ef
91c6dc0fd3ef

# 所有空间下的pod都能查看到
[root@node1 ~]# kubectl --server="https://192.168.50.20:6443" --token="ec413db6b69b266830b2" --insecure-skip-tls-verify=true get pod -A
NAMESPACE     NAME                                      READY   STATUS    RESTARTS       AGE
default       nfs-client-provisioner-5cf5744c5f-fzjh8   1/1     Running   11 (74s ago)   15d
default       web1-5756d98cd9-2cdz5                     1/1     Running   0              25m
default       web1-5756d98cd9-fp7d8                     1/1     Running   0              21m
kube-system   calico-kube-controllers-578fbf95-zblx7    1/1     Running   5              15d
kube-system   calico-node-47jsz                         1/1     Running   4              14d
kube-system   calico-node-lm6n2                         1/1     Running   4              14d
kube-system   coredns-665d974787-mz8jt                  1/1     Running   5              15d
kube-system   coredns-665d974787-vp99g                  1/1     Running   5              15d
kube-system   etcd-master                               1/1     Running   8              19d
kube-system   kube-apiserver-master                     1/1     Running   1              8h
kube-system   kube-controller-manager-master            1/1     Running   9 (73s ago)    19d
kube-system   kube-proxy-hpzzt                          1/1     Running   9              19d
kube-system   kube-proxy-p2p5k                          1/1     Running   8              19d
kube-system   kube-scheduler-master                     1/1     Running   9 (73s ago)    19d


5、注意

集群角色和角色绑定一起使用的时候,这个集群角色就相当于是一个普通的角色,没有带上命名空间的角色,但是由于使用了角色绑定,操作的范围仅限这个命名空间

serviceaccount(sa)

  • sa是服务账号,是pod使用的,就是有些pod需要监听一些资源,需要有权限,就需要这个sa

  • 角色绑定角色和sa,这个sa就有对资源的操作权限,创建pod或者其他资源的时候,指定这个以这个sa运行就可以了

  • 1.24版本之后,创建sa不会自动的创建secret,需要手动创建secret关联sa

1、创建role和sa

[root@master rbac]# kubectl create role sa-role --verb="get,list,watch" --resource=pods --dry-run=client -o yaml > sa-role.yml
[root@master rbac]# kubectl apply -f sa-role.yml 

# 创建sa
# 我的k8s版本是1.23的,所以会自动的创建secret
[root@master rbac]# kubectl create sa sa1
serviceaccount/sa1 created
[root@master rbac]# kubectl get sa 
NAME                     SECRETS   AGE
default                  1         19d
nfs-client-provisioner   1         19d
sa1                      1         3s

# 我们查看这个secret
[root@master rbac]# kubectl get secret
NAME                                 TYPE                                  DATA   AGE
default-token-qj7d5                  kubernetes.io/service-account-token   3      19d
nfs-client-provisioner-token-9prbh   kubernetes.io/service-account-token   3      19d
sa1-token-x8hz5                      kubernetes.io/service-account-token   3      42s

# 有非常多的信息
[root@master rbac]# kubectl get secrets sa1-token-x8hz5 -o yaml

kind: Secret
metadata:
  annotations:  # 下面这个指定了sa
    kubernetes.io/service-account.name: sa1
    kubernetes.io/service-account.uid: 214a3467-4319-47bd-912e-0462ef1f394b
  creationTimestamp: "2026-05-07T12:00:25Z"
  name: sa1-token-x8hz5
  namespace: default
  resourceVersion: "62598"
  uid: 6387ab78-bab8-49fe-89ff-3b0433f5967a
type: kubernetes.io/service-account-token  # 类型必须是这个

2、rolebinding绑定

[root@master rbac]# kubectl create rolebinding sa-rolebinding --role=sa-role --serviceaccount=default:sa1 --dry-run=client -o yaml > sa1-rolebinding.yml

[root@master rbac]# kubectl apply -f sa1-rolebinding.yml 
rolebinding.rbac.authorization.k8s.io/sa-rolebinding created

3、测试sa权限

创建一个pod,指定这个sa账户

[root@master rbac]# cat sa-pod.yml 
apiVersion: v1
kind: Pod
metadata:
  name: test-sa1
spec:
  serviceAccountName: sa1   # 使用sa1账号运行
  containers:
  - name: nginx 
    image: nginx
    imagePullPolicy: IfNotPresent

在pod里面测试看是否具有查看pod列表权限,default空间下的

# 可以看到sa是被挂载进来的
root@test-sa1:/var/run/secrets/kubernetes.io# ls
serviceaccount
# 下面有token内容
root@test-sa1:/var/run/secrets/kubernetes.io# ls serviceaccount/
ca.crt	namespace  token

root@test-sa1:~# TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)

# 测试,有返回结果就是正常的
root@test-sa1:~# curl -H "Authorization: Bearer $TOKEN" https://kubernetes.default/api/v1/namespaces/default/pods --insecure


测试看有没有其他空间列出pod的权限

# 列出kube-system下的pod信息,发现没有权限
root@test-sa1:~# curl -H "Authorization: Bearer $TOKEN" https://kubernetes.default/api/v1/namespaces/kube-system/pods --insecure
{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {},
  "status": "Failure",
  "message": "pods is forbidden: User \"system:serviceaccount:default:sa1\" cannot list resource \"pods\" in API group \"\" in the namespace \"kube-system\"",
  "reason": "Forbidden",
  "details": {
    "kind": "pods"
  },
  "code": 403  # 没有列出default之外的pod权限
}root@test-sa1:~# 

总结

创建角色,将角色和用户进行角色绑定

集群角色也是一样的

sa就是给pod运行的使用的,使用方式也是一样的

posted @ 2026-05-02 19:15  乔的港口  阅读(28)  评论(0)    收藏  举报