k8s最常使用角色管理集群权限rbac,Role Base Access Control
k8s配置了这样几个资源对象。
执行:
kubectl api-resources |grep rbac
clusterrolebindings rbac.authorization.k8s.io/v1 false ClusterRoleBindingclusterroles rbac.authorization.k8s.io/v1 false ClusterRolerolebindings rbac.authorization.k8s.io/v1 true RoleBindingroles rbac.authorization.k8s.io/v1 true Role
我们可以看到分为两组,角色,绑定,集群角色,集群绑定。集群和非集群的区别就在于:
- 集群类资源不需要配置命名空间,权限自动对所有命名空间生效
- 非集群则必须指定命名空间,相应权限只对命名空间生效
Role
一个样例Role pod-reader,只有pod的读权限 ```yaml apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: |
creationTimestamp: “2022-04-10T16:52:51Z” name: pod-reader namespace: default resourceVersion: “447047” uid: 64ebbdb4-d801-4f10-b8d6-71b52b80b5b9 rules:{"apiVersion":"rbac.authorization.k8s.io/v1","kind":"Role","metadata":{"annotations":{},"name":"pod-reader","namespace":"default"},"rules":[{"apiGroups":[""],"resources":["pods"],"verbs":["get","watch","list"]}]} - apiGroups:
- “” resources:
- pods verbs:
- get
- watch
- list ```
ServiceAccount
创建sa:
kubectl create sa pod-reader-sa
最后绑定sa和Role
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"rbac.authorization.k8s.io/v1","kind":"RoleBinding","metadata":{"annotations":{},"name":"read-secrets","namespace":"default"},"roleRef":{"apiGroup":"rbac.authorization.k8s.io","kind":"Role","name":"pod-reader"},"subjects":[{"kind":"ServiceAccount","name":"pod-reader-sa"}]}
creationTimestamp: "2022-04-10T16:59:48Z"
name: pod-reader-binding
namespace: default
resourceVersion: "448476"
uid: 6f01deab-346b-48be-992f-7d8a6e7e75db
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: pod-reader
subjects:
- kind: ServiceAccount
name: pod-reader-sa
关联角色只能有一个,关联对象可以有多个。
最后就能试试这个sa什么效果了
kubectl get sa pod-reader-sa -oyaml
apiVersion: v1
kind: ServiceAccount
metadata:
creationTimestamp: "2022-04-10T16:54:32Z"
name: pod-reader-sa
namespace: default
resourceVersion: "447377"
uid: fdff489f-b8d2-43dd-96c9-92c9d05e357b
secrets:
- name: pod-reader-sa-token-n58xd
describe这个secret
kubectl describe secret pod-reader-sa-token-n58xd
Name: pod-reader-sa-token-n58xd
Namespace: default
Labels: <none>
Annotations: kubernetes.io/service-account.name: pod-reader-sa
kubernetes.io/service-account.uid: fdff489f-b8d2-43dd-96c9-92c9d05e357b
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1070 bytes
namespace: 7 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6InBxT19YY25IU2dhYkdyVDhGbkNVSFdoSkZfb1lOZUV2TEVNam04YzZkRk0ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6InBvZC1yZWFkZXItc2EtdG9rZW4tbjU4eGQiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoicG9kLXJlYWRlci1zYSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImZkZmY0ODlmLWI4ZDItNDNkZC05NmM5LTkyYzlkMDVlMzU3YiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OnBvZC1yZWFkZXItc2EifQ.kq0h-zhrQO5E251ALlp2-MCSO-fVjpzqh_JGOcWn5qzL0oVyr4iNG_HR4hywa3Qo4QBeanEvO147aTfr5LB3fUWUXZjbnmFRS_cUrIiMThB8lGK2zXkQaQRE_RtDnoC-ZD_l5d9DGrILYrPfQcIyQDJ1DoKOaop6S6DiOL0yUBV3CNHc9n_GgwvuTPVKGtlfYwwVRPrIAvqEg5U_y_KcBITD4zBVoXDy7GPXaPY54yyKRZGZc61Mqz5WmGLXHvhl1VejGprUTvcOK6ackZzuC8-Tf_1PgdKVw08kyZ1uSY0tTXEZ1-2K6U5aAnuhl7OanOvHxH-P7ngkD0TcELybsg
将咱的token加到kubeconfig中
加个用户
- name: pod-reader
user:
token: eyJhbGciOiJSUzI1NiIsImtpZCI6InBxT19YY25IU2dhYkdyVDhGbkNVSFdoSkZfb1lOZUV2TEVNam04YzZkRk0ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6InBvZC1yZWFkZXItc2EtdG9rZW4tbjU4eGQiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoicG9kLXJlYWRlci1zYSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImZkZmY0ODlmLWI4ZDItNDNkZC05NmM5LTkyYzlkMDVlMzU3YiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OnBvZC1yZWFkZXItc2EifQ.kq0h-zhrQO5E251ALlp2-MCSO-fVjpzqh_JGOcWn5qzL0oVyr4iNG_HR4hywa3Qo4QBeanEvO147aTfr5LB3fUWUXZjbnmFRS_cUrIiMThB8lGK2zXkQaQRE_RtDnoC-ZD_l5d9DGrILYrPfQcIyQDJ1DoKOaop6S6DiOL0yUBV3CNHc9n_GgwvuTPVKGtlfYwwVRPrIAvqEg5U_y_KcBITD4zBVoXDy7GPXaPY54yyKRZGZc61Mqz5WmGLXHvhl1VejGprUTvcOK6ackZzuC8-Tf_1PgdKVw08kyZ1uSY0tTXEZ1-2K6U5aAnuhl7OanOvHxH-P7ngkD0TcELybsg
加个context
- context:
cluster: kubernetes
user: pod-reader
namespace: default
name: pod-reader
最后执行kubectl get 试试
[root@master rbac]# kubectl get pod --kubeconfig=config
NAME READY STATUS RESTARTS AGE
details-v1-74686db7b4-qz9qw 2/2 Running 0 8d
nginx-01-7fd84d946-qlcff 2/2 Running 0 8d
productpage-v1-57d665985b-7w8gt 2/2 Running 0 8d
ratings-v1-6cb88b8fbd-kws6r 2/2 Running 0 8d
reviews-v1-c8b9888cb-mm9tr 2/2 Running 0 8d
reviews-v2-585bdb58fb-tn5n4 2/2 Running 0 8d
reviews-v3-76c85f5c5b-hnb6m 2/2 Running 0 8d
试试其他资源呢?
[root@master rbac]# kubectl get svc --kubeconfig=config
Error from server (Forbidden): services is forbidden: User "system:serviceaccount:default:pod-reader-sa" cannot list resource "services" in API group "" in the namespace "default"
报无权限了。
