百度網盤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"
說明相關的用戶權限配置成功。