概述
在RABC API中,通过如下的步骤进行授权:
1)定义角色:在定义角色时会指定此角色对于资源的访问控制的规则;
2)绑定角色:将主体与角色进行绑定,对用户进行访问授权。
Authentication(认证)
认证方式现共有8种,可以启用一种或多种认证方式,只要有一种认证方式通过,就不再进行其它方式的认证。通常启用X509 Client Certs和Service Accout Tokens两种认证方式。
UserAccount(用户账户)
用户账户。给用户使用,全局唯一,不受 namespace 命名空间的限制。这种类型的账户由外部应用进行管理。
使用kubectl命令时用的就是UserAccount帐户;查看~/.kube/config用户账户信息
cat ~/.kube/config
....
users:
- name: docker-desktop
user:
ServiceAccount(服务账户)
给应用程序使用即:运行在集群中的程序访问 API Service 时使用。通常就是 Pod(准确说是运行在 Pod 中的应用)。这种类型的账户由 Kubernetes 进行管理
与UserAccount区别
区别 | ServiceAccount | UserAccount |
---|---|---|
集群 | 存在集群内部的资源对象 | 存在于集群外部 |
namespace | 属于某个 namespace 下,不是全局的 | 不属于某个 namespace 所有,全局唯一的, |
使用者 | 一般被 Pod 使用,与 API Server 交互 | 一般被 kubectl 或 REST 请求使用 |
kubectl get serviceaccounts
NAME SECRETS AGE
default 1 107m
创建账户
kubectl create serviceaccount test
serviceaccount/test created
查看详细信息
kubectl describe serviceaccount test
Name: test
Namespace: default
Labels: <none>
Annotations: <none>
Image pull secrets: <none>
Mountable secrets: test-token-5xf7v
Tokens: test-token-5xf7v
Events: <none>
会创建自定义的token秘钥
kubectl describe secret test-token-5xf7v
Name: test-token-5xf7v
Namespace: default
Labels: <none>
Annotations: kubernetes.io/service-account.name: test
kubernetes.io/service-account.uid: 65b86028-c7e3-490a-a5dd-08cc9848d751
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1025 bytes
namespace: 7 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IjNoUnBfU2xrbTZjYndTTWFKNmo4RWRlbFdkamtLQTcxQXh0Nzk2b0s3X00ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6InRlc3QtdG9rZW4tNXhmN3YiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoidGVzdCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjY1Yjg2MDI4LWM3ZTMtNDkwYS1hNWRkLTA4Y2M5ODQ4ZDc1MSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OnRlc3QifQ.Xk9Rw8-6W8Jw2-3TNQibSuXMSj3YScYjuF5MGGL7vGgxCA6M24t8FPlmGlVoevkw88-IVJFdrN2Gu564vn4eZJGNpRcvcx-fN0CMPNpjCrR3zcT4xXOEpKJmwHnnNqDNiuL9Uv8LHQ0BBZORe52uUr8NjfLKJwUAhXotGnUStYfWxOhG7eZJDoUzhH-XcwlRcSj43aA-D_y0orDbHl-B3N0GjBFv_CLgPnQlA302K0a8CzzIKGtZFk9YrDkEdHdxSjz0digDjZnOq9dl9m3-YK7mo2pUNRrJD60qtRnFRGy7P-aNPmGOL_JTJF6WWUyln-PW9rBNL9MTiVt3yUoEYw
token 中有 3 个条目,分别为:ca.crt、namespace、token,这 3 个条目和默认的 ServiceAccount 的条目相同,但是对应的值肯定是不同的。
Authorization(授权)
角色/Role
K8S 中的角色从类别上主要有两类,Role 和 ClusterRole。
- role:命名空间(Namespace)访问权限。
- ClusterRole:所以命名空间Namespace访问权限,并且还有一些非资源类的访问权限。
查看roles
kubectl get roles --all-namespaces=true
NAMESPACE NAME CREATED AT
kube-public kubeadm:bootstrap-signer-clusterinfo 2020-07-11T13:38:28Z
kube-public system:controller:bootstrap-signer 2020-07-11T13:38:27Z
查看clusterrole
✗ kubectl get clusterroles
NAME CREATED AT
admin 2020-07-11T13:38:26Z
cluster-admin 2020-07-11T13:38:26Z
compose-service 2020-07-11T13:39:35Z
compose-stack-admin 2020-07-11T13:39:36Z
compose-stack-edit 2020-07-11T13:39:35Z
创建集群角色cluster role
kubectl create clusterrole pv-reader --verb=get,list --resource=persistentvolumes
创建集群角色绑定cluster role binding
kubectl create clusterrolebinding pv-test --clusterrole=pv-reader --serviceaccount=web:default
准入控制/AdmissionControl
判断请求的操作是否符合集群的要求。可以设置“准入控制器列表”。获得授权的请求都需要通过准入控制器的检查,如果检查不通过,请求依然会被拒绝。
Admission Control 在改变资源持久化之前(资源的创建、修改、删除)的机制。
HelloWorld
创建命名空间
$ kubectl create ns role-ctl
namespace/role-ctl created
创建pod
$ kubectl run nginx --image=nginx -n role-ctl
pod/nginx created
$ kubectl get pods -n role-ctl
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 51s
创建角色
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: role-ctl
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
执行角色创建命令
$ kubectl create -f pod-role.yaml
role.rbac.authorization.k8s.io/pod-reader created
$ kubectl get role -n role-ctl
NAME CREATED AT
pod-reader 2020-10-04T12:44:18Z
创建角色绑定
参考
https://kubernetes.io/zh/docs/reference/access-authn-authz/rbac/
https://blog.csdn.net/songxi_bo/article/details/105269225