百度网盘css
提取码:qhhv nginx
本文将介绍Kubernetes基于角色的访问控制(RBAC)API对象,以及两个常见的用例(建立具备受限访问权限的用户、POD内经过service account访问api)。在本文的最后,您应该具备足够的知识来在集群中使用RBAC策略。api
从Kubernetes 1.6版本起,系统默认启用RBAC策略。 RBAC策略对于正确管理群集相当重要,由于它们使您能够根据用户及其在组织中的角色来指定容许的操做类型。包括:服务器
the server does not allow access to the requested resource
本文将向您展现如何使用RBAC,以便您能够正确处理此类问题。网络
为了充分的了解本文,建议您有一套完整的Kubernetes环境,并能按咱们的步骤完成整个过程,环境要求以下:app
minikube start --extra-config=apiserver.Authorization.Mode=RBAC
Kubernetes的一项基本功能是其全部资源都是模型化的API对象,该对象容许进行CRUD(建立,读取,更新,删除)操做。 资源包括:ide
这些资源上可能的操做示例以下:工具
在更高级别上,资源与API Group(API组)相关联(例如,Pod属于核心API group,而Deployment属于apps API group)。 有关全部可用资源,操做和API组的更多信息。测试
为了在Kubernetes中管理RBAC,除了资源和操做外,咱们还须要理解如下概念:spa
您能够在Kubernetes官方文档中找到每一个API元素的示例。
在此示例中,咱们将为“开发组(development)”的"cjzhao"用户建立一个独享的命名空间(cjns),并从远程服务器访问集群,主要包括如下对象:
咱们将添加必要的RBAC策略,以便用户cjzhao
仅在cjns
命名空间内便可彻底管理deployment
(即便用kubectl run命令)。 最后,咱们将测试这些策略以确保它们按预期工做。
namespace
执行kubectl create
命令建立命名空间(以admin用户身份):
kubectl create namespace cjns
Kubernetes没有用于用户账户的API。 这里咱们使用OpenSSL证书(更多的认证方式请参见Kubernetes官方文档)来管理身份验证,具体步骤以下:
openssl genrsa -out cjzhao.key 2048
openssl req -new -key cjzhao.key -out cjzhao.csr -subj "/CN=cjzhao/O=development"
找到您的Kubernetes群集证书颁发机构(CA)文件。 这将负责批准请求并生成访问群集API所需的证书。 它的位置一般在/etc/kubernetes/pki /
目录下。 对于Minikube,它在〜/.minikube/
。 检查目录下是否存在ca.crt和ca.key文件,并将它们拷贝到当前目录。
经过批准您以前提出的证书签名请求cjzhao.csr来生成最终的证书cjzhao.crt,设置证书有效期为500天,执行以下命令:
openssl x509 -req -in cjzhao.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out cjzhao.crt -days 500
//配置集群 kubectl config set-cluster MyK8sCluster --server=https://your_server_ip:6443 --certificate-authority=./ca.crt //配置用户信息 kubectl config set-credentials cjzhao --client-certificate=./cjzhao.crt --client-key=./cjzhao.key //配置上文(将用户和集群绑定) kubectl config set-context cjzhao-context --cluster=yourcluster --namespace=cjns --user=cjzhao
配置完成后执行以下命令:
kubectl config use-context cjzhao-context kubectl get pods
您将看到会报下面的错:
Error from server (Forbidden): pods is forbidden: User "cjzhao" cannot list resource "pods" in API group "" in the namespace "cjns"
kind: Role apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: namespace: cjns name: deployment-manager rules: - apiGroups: \["", "extensions", "apps"\] resources: \["deployments", "replicasets", "pods"\] verbs: \["get", "list", "watch", "create", "update", "patch", "delete"\] \# You can also use \["\*"\]
使用kubectl create
命令在集群中建立Role:
kubectl create -f role-deployment-manager.yaml
使用如下内容建立一个rolebinding-deployment-manager.yaml文件。 在此文件中,咱们将角色绑定到cjns命名空间内的用户cjzhao:
kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1beta1 metadata: name: deployment-manager-binding namespace: cjns subjects: - kind: User name: cjzhao apiGroup: "" roleRef: kind: Role name: deployment-manager apiGroup: ""
经过运行kubectl create
命令部署RoleBinding:
kubectl create -f rolebinding-deployment-manager.yaml
在新的机器上执行下面的命令建立一个deployment:
kubectl create deployment --image nginx myng
执行下面的命令查看建立结果:
kubectl get pods
能够看到正在运行的pod。
为了验证cjzhao的权限是不是限定在cjns命名空间,咱们执行下面的命令:
kubectl get pods -n default
结果以下:
Error from server (Forbidden): pods is forbidden: User "cjzhao" cannot list resource "pods" in API group "" in the namespace "default"
说明相关的用户权限配置成功。