当前位置: 首页 > news >正文

十一、K8s细粒度权限管理RBAC

十一、K8s细粒度权限管理RBAC

文章目录

  • 十一、K8s细粒度权限管理RBAC
    • 1、权限管理定义
      • 1.1 常用权限需求分析
      • 1.2 K8s服务账户-ServiceAccount
      • 1.3 K8s基于角色的权限管理-RBAC
      • 1.4 Roles和Bindings组件分类
    • 2、服务账户 ServiceAccount
      • 2.1 ServiceAccount 增删改查
      • 2.2 使用 Secret 存储 ServiceAccount Token
      • 2.3 基于 ServiceAccount 生成 Kubeconfig
    • 3、细粒度权限配置
      • 3.1 使用 Kubectl 管理 RBAC
      • 3.2 通用权限管理
      • 3.3 K8s 多用户管理
      • 3.4 不同用户授权管理
        • 3.4.1 授权测试环境可以查看日志和执行命令
        • 3.4.2 授权生产环境只查看日志
        • 3.4.3 授权开发人员可以修改非生产环境部分资源
        • 3.4.4 授权多租户场景受限管理员的权限
        • 3.4.5 授权应用程序可以访问集群资源

1、权限管理定义

1.1 常用权限需求分析

  • Namespace列表查看权限
  • 日志查看权限
  • 执行命令权限
  • Pod删除权限
  • 资源编辑权限
  • 其他权限

1.2 K8s服务账户-ServiceAccount

ServiceAccount是K8s中的一种资源,主要用于身份验证和授权,可以让应用或用户以特定的身份访问集群内部的其他资源和服务。

ServiceAccount主要用于以下场景:

  • 授权给应用程序指定的权限,让其可以访问集群中的资源
  • 生成受限的kubeconfig,供不同的用户使用
  • 生成临时或永久token,可以登陆K8s的Dashboard

1.3 K8s基于角色的权限管理-RBAC

RBAC:Role-Based Access Control,是一种基于角色的访问控制机制,用于管理用户和应用程序对K8s资源的访问权限。通过RBAC,管理员可以细粒度地控制哪些用户或服务账户可以执行哪些操作,从而确保集群地安全性和资源的合理利用。

注意:RBAC只具备添加权限,不具备拒绝权限

RBAC授权模式分为 Roles 和 Bindings 两种组件:

  • Roles:用于定义相关权限
  • Bindings:用于把权限绑定至相关主体,比如用户和组

1.4 Roles和Bindings组件分类

  • Role:命名空间级别的权限,权限规则仅限于命名空间内
  • ClusterRole:集群级别的权限,权限规则覆盖整个集群,同时可以绑定到某个空间内
  • RoleBindings:将 Role 或者 ClusterRole 的权限绑定到用户、组或服务账户,并指定到某个空间内,绑定后用户只具备该空间的相关权限
  • ClusterRoleBindings:将 ClusterRole 绑定到用户、组或服务账户,绑定后用户具备集群的相关权限

  • roleRef:指定需要绑定的权限
    • kind:指定权限来源,可以是 Role 或 ClusterRole
    • name:Role 或 ClusterRole 的名字
    • apiGroup:API组名
  • subjects:配置被绑定对象,可以配置多个
    • kind:绑定对象的类别,当前为User,还可以是Group、ServiceAccount
    • name:绑定对象名称

2、服务账户 ServiceAccount

2.1 ServiceAccount 增删改查

# 创建 ServiceAccount:
[root@k8s-master01 ~]# kubectl create sa yunwei# 查看 ServiceAccount:
[root@k8s-master01 ~]# kubectl get sa yunwei
NAME     SECRETS   AGE
yunwei   0         39s# 为某个 ServiceAccount 创建 Token:
[root@k8s-master01 ~]# kubectl create token yunwei
eyJhbGciOiJSUzI1NiIsImtpZC....# 创建一个指定过期时间的 Token:
[root@k8s-master01 ~]# kubectl create token yunwei --duration=99999h
eyJhbGciOiJSUzI1NiIsImtpZCI6ImFFSjE5cktFc1hr....

Token可以用来登陆我们K8s界面

在这里插入图片描述

2.2 使用 Secret 存储 ServiceAccount Token

[root@k8s-master01 ~]# vim yunwei-token-secret.yaml
[root@k8s-master01 ~]# cat yunwei-token-secret.yaml
apiVersion: v1
kind: Secret
metadata:name: yunwei-token-secretannotations:kubernetes.io/service-account.name: yunwei
type: kubernetes.io/service-account-token# 创建该 Secret:
[root@k8s-master01 ~]# kubectl create -f yunwei-token-secret.yaml # 查看生成的 Token:
[root@k8s-master01 ~]# kubectl get secret yunwei-token-secret
NAME                  TYPE                                  DATA   AGE
yunwei-token-secret   kubernetes.io/service-account-token   3      80s
# 查看生成的 Token 详情:
[root@k8s-master01 ~]# kubectl describe secret yunwei-token-secret
Name:         yunwei-token-secret
Namespace:    default
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: yunweikubernetes.io/service-account.uid: a42d2efd-fc1c-4cec-b825-184d67cd7494Type:  kubernetes.io/service-account-tokenData
====
ca.crt:     1107 bytes
namespace:  7 bytes
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6ImFFSjE5cktFc1hrSk00QXB6MjFIWFZOc0ZnUVoxQTVPeWgycm1OdGszZTQifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6Inl1bndlaS10b2tlbi1zZWNyZXQiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoieXVud2VpIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiYTQyZDJlZmQtZmMxYy00Y2VjLWI4MjUtMTg0ZDY3Y2Q3NDk0Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmRlZmF1bHQ6eXVud2VpIn0.xeLNEJwPDSv4w88kge5ADSbJ-ckMtyr6EOCGlBCQIls_WMQQ0417P__04rUAX69HTXkPy0X9XgXLAZKgPpbi962OODDJ-KKrGhnS2JWQVs1mKyBkB49oDKhpuiP9LwyWLbyFnRuDHUEbDTjKCpBO6jpPypxDwLXuy3CmOt1rXcSAg0qLgqkZ2u4rWwZP41KHXbQt92p9LLP5VuniFlvFQwaoOvzbfkWUTR0FIajCqohkCzNZB0zv4GHSFvHEas4k8BNnMmORY_h3Tu2r3_ClTL-xRnOsH2czJguXJBjZlsxL-r-ySJNG4k3mprMKABTYosM7GytBXDy5k8-EZMvXzw

2.3 基于 ServiceAccount 生成 Kubeconfig

基于 ServiceAccount 生成 Kubeconfig,需要先为 ServiceAccount 生成一个 Token,可以使用保存在 Secret 中的 Token。

# 编写脚本
[root@k8s-master01 ~]# vim kubeconfig.sh 
[root@k8s-master01 ~]# cat kubeconfig.sh 
#!/bin/bash
serviceaccountName="yunwei"
secretName="yunwei-token-secret"serverAddr=`kubectl cluster-info | grep --color=never \-Eo -m 1 "https://.*" | \sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"`
ca=$(kubectl get secret/$secretName -o jsonpath='{.data.ca\.crt}')
token=$(kubectl get secret/$secretName -o jsonpath='{.data.token}' | base64 --decode)cat <<EOF > ${serviceaccountName}-kubeconfig.yaml
apiVersion: v1
kind: Config
clusters:
- name: default-clustercluster:server: ${serverAddr}certificate-authority-data: ${ca}
users:
- name: ${serviceaccountName}user:token: ${token}
contexts:
- name: ${serviceaccountName}-contextcontext:cluster: default-clusteruser: ${serviceaccountName}namespace: default
current-context: ${serviceaccountName}-context
EOF
# 基于 ServiceAccount 生成 Kubeconfig
[root@k8s-master01 ~]# bash kubeconfig.sh [root@k8s-master01 ~]# cat yunwei-kubeconfig.yaml 
apiVersion: v1
kind: Config
clusters:
- name: default-clustercluster:server: https://192.168.200.50:6443certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURCVENDQWUyZ0F3SUJBZ0lJS2xDSVh2RCtodjh3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TlRBMk1UQXdOek15TXpWYUZ3MHpOVEEyTURnd056TTNNelZhTUJVeApFekFSQmdOVkJBTVRDbXQxWW1WeWJtVjBaWE13Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLCkFvSUJBUUMwRkZBbjFlcDRNRW82REZSdXc3VS9ENllXV3pvQmptaC9lRUtjd284c3htTjMyT3dabW5QVzAwSncKRGVma0RIN0RZVXAwVG91eVFLSHdHS08yRWs2Tnhubklqb0hXdjN3QWN6OWJFWkh6cmd3aW5Qa0o3R2RjU3pHdApSWm1ocm5IcGVISGU0OVFOVDhXeDB5c0ZVVjY5ais3RzgvN0I0eUc5N3hHRlNHZGtkcmVqUUgzOExFTTZRblNQCkt3RVJ4dFV5RTFSQkV6QW5sRXhMcGNBaTlqa2Y2c25yNk9pODNPL3BzQzNOaitXU2lPREE4K0lndkFlVmdDRkMKNnlBQjg3ZS9vL0Ixd3MzWXB2MXJ2ZkJaaWlzalF3emNmUnJybXVVOWVIUU4xZlFHQXgyc0YyY2dnUWxENk1IWApMYVJldjhUcFBCaFJDVWJjaDVUd3Vmck5qaW9QQWdNQkFBR2pXVEJYTUE0R0ExVWREd0VCL3dRRUF3SUNwREFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJUakl3SmpOWGxSZkNWNWRBOHRDc2NHeWxYblV6QVYKQmdOVkhSRUVEakFNZ2dwcmRXSmxjbTVsZEdWek1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQjFIMTZ3N2J0RQpHZ3M1TVZpOGhKL0M1djB0QVJNV1ZBVGJ5blNaSktjQS9nVWowYVNQMVFFbUlhUnprWWQ1eEM2OTRTdTRpRlBFCktPZlkrdU9XaFdMQmNWYjc5WEs2SEtONXFTTG9vMTA3dlBCaS9ZejNnRGNGS2J6QzNqdjR1Skk4SUFuUTM3UkEKUDN6YlVkRjQydnJ1TWJoc1VWVjJnSytvNHd1Ky9URTJTMlpNSmR0QmMyYzQzcjEzYy9ONCttWWdBZXdGOElHbwpBa29LSzJyaXMwaTNvYjdPVFg5RHFHUnAySGxQcTVReWdOZG4rSnhTWk9tL3RldlpQc1NBUnNQQ1dCalFlQlk2CmFXYTArUWh4REtNdXhxdC9GbkNOQ2RyaDA5R0plMHpyZ3ptS2I1Z2hqV09nWHhhTGN3aFhGTENyOWRTdTBwN2UKR1JoUkxuMmRUeEpDCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
users:
- name: yunweiuser:token: eyJhbGciOiJSUzI1NiIsImtpZCI6ImFFSjE5cktFc1hrSk00QXB6MjFIWFZOc0ZnUVoxQTVPeWgycm1OdGszZTQifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6Inl1bndlaS10b2tlbi1zZWNyZXQiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoieXVud2VpIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiYTQyZDJlZmQtZmMxYy00Y2VjLWI4MjUtMTg0ZDY3Y2Q3NDk0Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmRlZmF1bHQ6eXVud2VpIn0.xeLNEJwPDSv4w88kge5ADSbJ-ckMtyr6EOCGlBCQIls_WMQQ0417P__04rUAX69HTXkPy0X9XgXLAZKgPpbi962OODDJ-KKrGhnS2JWQVs1mKyBkB49oDKhpuiP9LwyWLbyFnRuDHUEbDTjKCpBO6jpPypxDwLXuy3CmOt1rXcSAg0qLgqkZ2u4rWwZP41KHXbQt92p9LLP5VuniFlvFQwaoOvzbfkWUTR0FIajCqohkCzNZB0zv4GHSFvHEas4k8BNnMmORY_h3Tu2r3_ClTL-xRnOsH2czJguXJBjZlsxL-r-ySJNG4k3mprMKABTYosM7GytBXDy5k8-EZMvXzw
contexts:
- name: yunwei-contextcontext:cluster: default-clusteruser: yunweinamespace: default
current-context: yunwei-context
# 测试以生成的这个kubeconfig文件访问咱们的资源(发现报错)
[root@k8s-master01 ~]# kubectl get po --kubeconfig yunwei-kubeconfig.yaml 
Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:default:yunwei" cannot list resource "pods" in API group "" in the namespace "default"# 给sa加上读权限
[root@k8s-master01 ~]# kubectl create rolebinding yunwei-view --clusterrole=view --serviceaccount=default:yunwei[root@k8s-master01 ~]# kubectl get rolebinding
NAME          ROLE               AGE
yunwei-view   ClusterRole/view   42s# 已经可以正常访问
[root@k8s-master01 ~]# kubectl get po --kubeconfig yunwei-kubeconfig.yaml 
NAME                       READY   STATUS    RESTARTS      AGE
counter-6c77464d64-2sb45   1/1     Running   2 (17d ago)   17d

3、细粒度权限配置

3.1 使用 Kubectl 管理 RBAC

# 创建一个可以查询 Pod 的 Role:
[root@k8s-master01 ~]# kubectl create role pod-reader --verb=get --verb=list --verb=watch --resource=pods# 指定非核心组:
[root@k8s-master01 ~]# kubectl create role foo --verb=get,list,watch --resource=replicasets.apps# 查看创建的role
[root@k8s-master01 ~]# kubectl get role
NAME         CREATED AT
foo          2025-06-27T09:11:17Z
pod-reader   2025-06-27T09:11:03Z
# 创建一个可以查询 Pod 的 ClusterRole:
[root@k8s-master01 ~]# kubectl create clusterrole pod-reader --verb=get,list,watch --resource=pods# 查看创建的clusterrole
[root@k8s-master01 ~]# kubectl get clusterrole pod-reader
NAME         CREATED AT
pod-reader   2025-06-27T09:18:20Z# 创建一个 RoleBinding,把 pod-reader 绑定至 default 空间下的 yunwei02 用户:
[root@k8s-master01 ~]# kubectl create rolebinding yunwei02-pod-reader --clusterrole=pod-reader --serviceaccount=default:yunwei02# 查看创建的rolebinding
[root@k8s-master01 ~]# kubectl get rolebinding
NAME                  ROLE                     AGE
....
yunwei02-pod-reader   ClusterRole/pod-reader   22s# 验证某个用户是否具有某个权限:
[root@k8s-master01 ~]# kubectl auth can-i get pods -n default --as=system:serviceaccount:default:yunwei02
yes

3.2 通用权限管理

  • kind:定义资源类型为 Role 或 ClusterRole
  • rules:定义具体的权限规则,切片类型,可以匹配多个
    • API Groups:包含该资源的组名称,比如apps,为空则为核心组
    • resources:定义对哪些资源进行授权,切片类型,可以定义多个,比如podsservice*
    • verbs:定义可以执行等操作,切片类型,可以定义多个,比如createdeletelistgetwatchupdatepods/log(子资源)等
    • resourcesName:指定授权具体的对象,切片类型,可以定义多个,比如my-deployment

  • roleRef:指定需要绑定的权限
    • kind:指定权限来源,可以是 Role 或 ClusterRole
    • name:Role 或 ClusterRole 的名字
    • apiGroup:API组名
  • subjects:配置被绑定对象,可以配置多个
    • kind:绑定对象的类别,当前为User,还可以是Group、ServiceAccount
    • name:绑定对象名称
[root@k8s-master01 ~]# vim clusterrole.yaml 
[root@k8s-master01 ~]# cat clusterrole.yaml 
apiVersion: rbac.authorization.k8s.io/v1    # 创建一个可以查询命名空间的权限
kind: ClusterRole
metadata:name: namespace-readonly
rules:- apiGroups:- ""resources:- namespacesverbs:- get- list- watch- apiGroups:- metrics.k8s.ioresources:- podsverbs:- get- list- watch
---
apiVersion: rbac.authorization.k8s.io/v1    # 创建一个可以删除 Pod 的权限
kind: ClusterRole
metadata:name: pod-delete
rules:- apiGroups:- ""resources:- pods- pods/statusverbs:- get- list- delete
---
apiVersion: rbac.authorization.k8s.io/v1    # 创建一个可以执行命令的权限
kind: ClusterRole
metadata:name: pod-exec
rules:- apiGroups:- ""resources:- pods- pods/statusverbs:- get- list- apiGroups:- ""resources:- pods/execverbs:- create
---
apiVersion: rbac.authorization.k8s.io/v1    # 创建一个可以查看日志的权限
kind: ClusterRole
metadata:name: pod-log
rules:- apiGroups:- ""resources:- pods- pods/log- pods/statusverbs:- get- list- watch
---
apiVersion: rbac.authorization.k8s.io/v1    # 创建一个可以针对指定资源进行编辑的权限
kind: ClusterRole
metadata:name: configmap-deployment-manager
rules:- apiGroups: [""]resources: ["configmaps"]verbs: ["get", "list", "watch", "create", "update", "patch"]- apiGroups: ["apps"]resources: ["deployments"]verbs: ["get", "list", "watch", "create", "update", "patch"]
# 创建clusterrole
[root@k8s-master01 ~]# kubectl create -f clusterrole.yaml # 查看clusterrole
[root@k8s-master01 ~]# kubectl get clusterrole | egrep "namespace-readonly|pod-delete|pod-exec|pod-log|configmap-deployment-manager"
configmap-deployment-manager                            2025-06-27T16:26:19Z
namespace-readonly                                      2025-06-27T16:26:19Z
pod-delete                                              2025-06-27T16:26:19Z
pod-exec                                                2025-06-27T16:26:19Z
pod-log                                                 2025-06-27T16:26:19Z

3.3 K8s 多用户管理

# 创建一个专用于存储用户的 Namespace:
[root@k8s-master01 ~]# kubectl create ns kube-users# 授权 kube-users 空间下的用户都有查看 Namespace 的权限:
[root@k8s-master01 ~]# kubectl create clusterrolebinding namespace-readonly --clusterrole=namespace-readonly --group=system:serviceaccounts:kube-users# 创建多个用户模拟不同的场景:
[root@k8s-master01 ~]# kubectl create sa project-a-develop -n kube-users
[root@k8s-master01 ~]# kubectl create sa project-a-opselop -n kube-users# 创建 Namespace 模拟不同的环境:
[root@k8s-master01 ~]# kubectl create ns project-a-dev
[root@k8s-master01 ~]# kubectl create ns project-a-test
[root@k8s-master01 ~]# kubectl create ns project-a-prod# 在每个环境下创建一个服务:
[root@k8s-master01 ~]# kubectl create deploy redis --image=crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/redis:7.2.5 -n project-a-dev[root@k8s-master01 ~]# kubectl create deploy redis --image=crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/redis:7.2.5 -n project-a-test[root@k8s-master01 ~]# kubectl create deploy redis --image=crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/redis:7.2.5 -n project-a-prod

3.4 不同用户授权管理

3.4.1 授权测试环境可以查看日志和执行命令

在非生产环境,可以针对开发和测试人员开放查看日志和执行命令的权限,方便排查问题等。

授权 project-a-develop 用户对 project-a-devproject-a-test 两个空间可以有查看日志和执行命令的权限

[root@k8s-master01 ~]# kubectl create rolebinding develop-pod-log --clusterrole=pod-log --serviceaccount=kube-users:project-a-develop -n project-a-dev[root@k8s-master01 ~]# kubectl create rolebinding develop-pod-exec --clusterrole=pod-exec --serviceaccount=kube-users:project-a-develop -n project-a-dev[root@k8s-master01 ~]# kubectl create rolebinding develop-pod-log --clusterrole=pod-log --serviceaccount=kube-users:project-a-develop -n project-a-test[root@k8s-master01 ~]# kubectl create rolebinding develop-pod-exec --clusterrole=pod-exec --serviceaccount=kube-users:project-a-develop -n project-a-test
# 创建 Token 测试:
[root@k8s-master01 ~]# kubectl create token project-a-develop -n kube-users
eyJhbGciOiJSUzI1NiIsImtpZCI6ImtiTm05eWxpaVR2WEFPM25hblMyX09SdXZndVZBN3lxWElwMjhvVjdudW8ifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzUxMDQ0MTk3LCJpYXQiOjE3NTEwNDA1OTcsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwianRpIjoiOGM0MzljYjItYzE5MC00OTUzLWE4YjctYjZhMGFjNWQzZjMwIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJrdWJlLXVzZXJzIiwic2VydmljZWFjY291bnQiOnsibmFtZSI6InByb2plY3QtYS1kZXZlbG9wIiwidWlkIjoiMmYxMDQzZDMtM2EyZS00ODEyLTk2NTEtNzQ4ZGRmN2Y3YTUzIn19LCJuYmYiOjE3NTEwNDA1OTcsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXVzZXJzOnByb2plY3QtYS1kZXZlbG9wIn0.WZ9qBYd17_lz35DYC6PbV0Jf940SF3wsMUNsgxyfrFp_R2dKIoj-Uze7VrZvWIWB_cQd85ErySBQs-hr_p2ldJbVfSHNRZFG7lI9OkPthdvftbzC5Pc7RhjZNe5mPE8QMAE5waGeDS2_RLwRPixtZ_XM4eSBvwU4QsTYSBIoxKHfnwfynQxjYvUA3xlHDHWquCvrkb6ZAnATJObHBjU8Dpa_DI4jcyqIukaQxhTAb4SF0MYYbiST_CS7DdbbBx3RiCqrEf-3_z_8FLPipMBsg7d9rvFeT8MEYX3i-19PZaoOCyEDtdKSIzPjFlOFoXK_vbNuz3E42SkY6U5fKhhLjA

之后可以登录到 Kubernetes 的 Dashboard 测试权限

目前只能查看pod这块

在这里插入图片描述

日志可以正常查询

在这里插入图片描述

也可以正常执行命令

在这里插入图片描述

3.4.2 授权生产环境只查看日志

在生产环境,通常不允许其他用户有特别大的权限,此时可以限制只能查看日志。

授权之前

在这里插入图片描述

# 授权开发人员只能查看生产环境的日志权限:
[root@k8s-master01 ~]# kubectl create rolebinding develop-pod-log --clusterrole=pod-log --serviceaccount=kube-users:project-a-develop -n project-a-prod

授权之后可以正常查看

在这里插入图片描述

在这里插入图片描述

但无法执行命令

在这里插入图片描述

3.4.3 授权开发人员可以修改非生产环境部分资源

有时候开发人员需要修改程序的配置用来测试新功能或者排查故障,此时可以给开发人员授权可以编辑部分的资源,比如 ConfigMap 和 Deployment。

[root@k8s-master01 ~]# kubectl create rolebinding develop-configmap-deployment-manager --clusterrole=configmap-deployment-manager --serviceaccount=kube-users:project-a-develop -n project-a-dev
3.4.4 授权多租户场景受限管理员的权限

如果集群中分配了多个租户和 OPS 用户,此时租户和 OPS 用户应当具备指定空间的所有权限,此时可以直接使用 admin 或者 edit 的 ClusterRole 进行授权:

比如授权 project-a-ops 用户可以操作 project-a-dev、test、prod 空间下的所有资源:

[root@k8s-master01 ~]# kubectl create rolebinding ops-edit --clusterrole=edit --serviceaccount=kube-users:project-a-opselop -n project-a-dev[root@k8s-master01 ~]# kubectl create rolebinding ops-edit --clusterrole=edit --serviceaccount=kube-users:project-a-opselop -n project-a-test[root@k8s-master01 ~]# kubectl create rolebinding ops-edit --clusterrole=edit --serviceaccount=kube-users:project-a-opselop -n project-a-prod
# 此时使用 project-a-ops 用户登录集群,即可操作上述空间的大部分资源
[root@k8s-master01 ~]# kubectl create token project-a-opselop -n kube-users
eyJhbGciOiJSUzI1NiIsImtpZCI6ImtiTm05eWxpaVR2WEFPM25hblMyX09SdXZndVZBN3lxWElwMjhvVjdudW8ifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzUxMDUxNDg3LCJpYXQiOjE3NTEwNDc4ODcsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwianRpIjoiMTc0MzIyY2MtOTIxZC00YzNmLWJkZTQtY2U5NWQ1YzdmZGM5Iiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJrdWJlLXVzZXJzIiwic2VydmljZWFjY291bnQiOnsibmFtZSI6InByb2plY3QtYS1vcHNlbG9wIiwidWlkIjoiY2NmNzBmODgtZTc0ZC00ZTA4LTlmNDctMmMzNWJmMmJiNzE2In19LCJuYmYiOjE3NTEwNDc4ODcsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXVzZXJzOnByb2plY3QtYS1vcHNlbG9wIn0.P45NlthKRMSvWVhtEQ5xV0fWx9JxvNP9OeoY0d6Hs-5i19fd99yTIG0yIFR0CQKvCqsb7BfeIktinpz4wwDSo_MygJF6MRnAa5b1NCDctnAijpzjv3V0cJ1A8ieA5ALnt2yRevfFsxeZtBsUUTyysZwv1NFpqXef80sEgYgVVUEt_i7-K9tHw-7fazQ6D3JjZGL32fPa0GNiu9qlCIlArK2PW6eB2KfG2Bj5G84HvckuOyCRCnf1UTlkRMMii-ZKNZdYfPA5v4IJ4NPZ59cVTugx5LELApS3Wr2C4ZE6JSpddvUzyiOUBY5cV8l_26K4LVB7oQB5ifUMH1yaQWEmvg

在这里插入图片描述

3.4.5 授权应用程序可以访问集群资源

有时候需要对部署在 Kubernetes 集群中的服务进行授权,使其可以访问资源的某些资源,比如获取集群中的 Pod 状态等,此时可以授权给某个 ServiceAccount,然后让 Pod 用该ServiceAccount 创建 Pod,此时该 Pod 内的程序即可具备相关的权限。

比如要实现某个程序具备 view 的权限,可以用如下方式进行授权。

# 首先创建一个用于该程序的 ServiceAccount:
[root@k8s-master01 ~]# kubectl create sa app-view -n project-a-dev# 授权该 ServiceAccount:
[root@k8s-master01 ~]# kubectl create rolebinding app-view --clusterrole=view --serviceaccount=project-a-dev:app-view -n project-a-dev
# 创建一个资源,并使用该 ServiceAccount:
[root@k8s-master01 ~]# kubectl create deploy app --image=crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/kubectl -n project-a-dev -- sleep 36000# 添加配置
[root@k8s-master01 ~]# kubectl edit deploy app -n project-a-dev
....spec:serviceAccountName: app-viewcontainers:
....[root@k8s-master01 ~]# kubectl get po -n project-a-dev
NAME                     READY   STATUS    RESTARTS   AGE
app-754479d4cc-lsh9f     1/1     Running   0          3m41s
redis-555d6889cd-dkc5j   1/1     Running   0          37m
# 登录至该容器,即可访问该空间下的所有资源:
[root@k8s-master01 ~]# kubectl exec -it app-754479d4cc-lsh9f -n project-a-dev -- bash
I have no name!@app-754479d4cc-lsh9f:/$ kubectl get po -n project-a-dev
NAME                     READY   STATUS    RESTARTS   AGE
app-754479d4cc-lsh9f     1/1     Running   0          4m56s
redis-555d6889cd-dkc5j   1/1     Running   0          38m其它空间未授权无法访问:
I have no name!@app-754479d4cc-lsh9f:/$ kubectl get pod -n project-atest
Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:project-a-dev:app-view" cannot list resource "pods" in API group "" in the namespace "project-atest"# 如果需要访问其它空间的资源,按需创建 RoleBinding 即可。

此博客来源于:https://edu.51cto.com/lecturer/11062970.html

http://www.dtcms.com/a/270618.html

相关文章:

  • 异步进阶:C#的Task.WhenAll——如何开启多个异步任务
  • ReactNative【实战系列教程】我的小红书 6 -- 购物(含商品搜索、商品分类、商品列表)
  • 编写产品需求文档:黄历日历小程序
  • [Leetcode] 预处理 | 多叉树bfs | 格雷编码 | static_cast | 矩阵对角线
  • React面试高频考点解析
  • LeetCode Hot 100 搜索二维矩阵 II
  • langchain从入门到精通(四十一)——基于ReACT架构的Agent智能体设计与实现
  • [附源码+数据库+毕业论]基于Spring Boot+mysql+vue结合内容推荐算法的学生咨询系统
  • RedisCommandExecutionException: ERR unknown command ‘LPOS‘
  • 树莓派5-系统 Debian 12 开启VNC远程访问踩坑记录
  • vue3面试题(个人笔记)
  • uniapp AndroidiOS 定位权限检查
  • ragflow_多模态文档解析与正文提取策略
  • 《设计模式之禅》笔记摘录 - 5.代理模式
  • Flutter基础(前端教程⑨-图片)
  • Robot之眼CMOS传感器静电防护指南
  • LeetCode热题100—— 32. 最长有效括号 (hard)
  • 零基础上手 Amazon DynamoDB:NoSQL 数据库服务的核心概念与快速搭建指南
  • Android-重学kotlin(协程源码第二阶段)新学习总结
  • 安全管理协议(SMP):配对流程、密钥生成与防中间人攻击——蓝牙面试核心考点精解
  • Qt自定义控件(9)——径向渐变QRadialGradient、圆锥渐变QConicalGradient
  • 华为OD机试_2025 B卷_观看文艺汇演问题(Python,100分)(附详细解题思路)
  • Amazon S3 对象存储服务深度解析:存储原理、应用场景与实战指南
  • Hexo + Butterfly + Vercel 完整个人Blog部署指南
  • 量子化学计算GPU化:ORCA与Gaussian的CUDA加速对比(电子积分计算中的Warpshuffle指令实战应用)
  • 如何给网页增加滚动到顶部的功能
  • 【具身智能】本地实时语音识别kaldi在正点原子RK3588上部署
  • Python标准库:时间与随机数全解析
  • python 异步编程事件循环的共享问题
  • 达梦:指定数据文件还原的路径