这是本系列文章中的第三篇,前两篇文章分别介绍了Kubernetes访问控制以及身份认证。本文将经过上手实践的方式,带你理解Kubernetes受权这一律念。node
在文章正式开始以前,咱们先快速回顾一下咱们实操过程当中的环境和场景。咱们正在处理生产环境中的集群,其中每一个部分都与命名空间相关联。如今,组里新来了一位同事叫Bob,咱们在上篇教程中帮助Bob以engineering命名空间管理员的身份加入集群。而且他已经得到私钥以及签名证书来访问集群。api
若是你尚未完成上述操做,请查看上篇教程,运行其中的命令以完成环境设置以及为Bob配置证书。app
好,咱们正式开始本篇教程。this
如今咱们要给Bob受权,以控制属于engineering命名空间的资源。spa
首先,咱们要为kubectl建立一个上下文(context),方便它在不一样的环境之间切换。code
kubectl config set-context eng-context \ --cluster=minikube \ --namespace=engineering \ --user=bob Context "eng-context" created.
上面的命令使用Bob在minikube集群中的凭据建立了一个指向engineering命名空间的新上下文。这会致使在〜/ .kube / config文件中添加一个新的部分。server
咱们如今在engineering命名空间中建立一个简单的pod:blog
apiVersion: v1 kind: Pod metadata: name: myapp namespace: engineering labels: app: myapp spec: containers: - name: myapp image: busybox command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]
kubectl create -f myapp.yaml pod/myapp created
kubectl get pods -n=engineering NAME READY STATUS RESTARTS AGE myapp 1/1 Running 0 89s
虽然您能够做为集群管理员在工程命名空间中建立和操做pod,但Bob甚至没法在同一名称空间中列出pod。教程
kubectl get pods --namespace engineering --as bob Error from server (Forbidden): pods is forbidden: User "bob" cannot list resource "pods" in API group
为了使得Bob能够在engineering命名空间中访问资源,咱们须要给他受权。这能够经过建立具备适当权限的角色而后将其绑定到用户Bob来完成。实质上,咱们使用的是基于角色访问控制(RBAC)来容许Bob对engineering命名空间中的某些Kubernetes资源执行特定操做。资源
建立一个名为eng-reader的Kubernetes角色,容许其在engineering命名空间中列出pod。
kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: namespace: engineering name: eng-reader rules: - apiGroups: [""] # "" indicates the core API group resources: ["pods", "services", "nodes"] verbs: ["get", "watch", "list"]
kubectl create -f role.yaml role.rbac.authorization.k8s.io/eng-reader created
kubectl get roles --namespace=engineering NAME AGE eng-reader 58s
注意,这一角色目前和Bob毫无关联。咱们须要经过角色绑定将角色中指定的权限应用于Bob。
kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: eng-read-access namespace: engineering subjects: - kind: User name: bob # Name is case sensitive apiGroup: rbac.authorization.k8s.io roleRef: kind: Role #this must be Role or ClusterRole name: eng-reader # this must match the name of the Role or ClusterRole you wish to bind to apiGroup: rbac.authorization.k8s.io
kubectl create -f role-binding.yaml rolebinding.rbac.authorization.k8s.io/eng-read-access created
kubectl get rolebindings --namespace=engineering NAME AGE eng-read-access 31s
让咱们来检查一下Bob如今是否能够访问pod。
kubectl get pods --namespace engineering --as bob NAME READY STATUS RESTARTS AGE myapp 1/1 Running 0 11m
既然他如今已经关联了eng-reader角色,那么他就得到了pod列表的权限。
此时,Bob在集群中的访问权限依旧十分有限。他所能作的只是在engineering 命名空间中列出pod。这对Bob帮助不大。他想要检查集群中的节点数量,可是令他失望的是,他遇到了 forbidden error。
kubectl get nodes --as bob Error from server (Forbidden): nodes is forbidden: User "bob" cannot list resource "nodes" in API group
在Kubernetes中角色和角色绑定既能够应用在命名空间层面也能够应用在集群层面。咱们如今建立一个集群角色以及一个与Bob关联的角色绑定,以使他可以列出节点。
kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: # "namespace" omitted since ClusterRoles are not namespaced name: cluster-node-reader rules: - apiGroups: [""] resources: ["nodes"] verbs: ["get", "watch", "list"]
kubectl create -f cluster-role.yaml clusterrole.rbac.authorization.k8s.io/cluster-node-reader created
kubectl get clusterroles cluster-node-reader NAME AGE cluster-node-reader 49s
kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: read-cluster-nodes subjects: - kind: User name: bob # Name is case sensitive apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: cluster-node-reader apiGroup: rbac.authorization.k8s.io
kubectl create -f cluster-role-binding.yaml clusterrolebinding.rbac.authorization.k8s.io/read-cluster-nodes created
kubectl get clusterrolebindings read-cluster-nodes NAME AGE read-cluster-nodes 35s
如今,Bob已经设置为能够在集群中列出节点。
kubectl get nodes --as bob NAME STATUS ROLES AGE VERSION minikube Ready master 52m v1.15.2
本篇教程的目的是为了帮助你理解角色以及角色绑定如何在Kubernetes中工做的。在本系列下一篇文章中,咱们未来看看service account,保持关注哟~