十一、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:定义对哪些资源进行授权,切片类型,可以定义多个,比如
pods
、service
、*
等- verbs:定义可以执行等操作,切片类型,可以定义多个,比如
create
、delete
、list
、get
、watch
、update
、pods/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-dev
和 project-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