奈學百萬雲原生架構師

愛共享 愛生活 加油 2021

百度網盤css

提取碼:qhhv nginx

 

簡介

本文將介紹Kubernetes基於角色的訪問控制(RBAC)API對象,以及兩個常見的用例(建立具備受限訪問權限的用戶、POD內經過service account訪問api)。在本文的最後,您應該具備足夠的知識來在集羣中使用RBAC策略。api

從Kubernetes 1.6版本起,系統默認啓用RBAC策略。 RBAC策略對於正確管理羣集相當重要,由於它們使您能夠根據用戶及其在組織中的角色來指定容許的操做類型。包括:服務器

  • 經過僅向管理員用戶授予特權操做(例如訪問機密)來保護集羣。
    在集羣中強制用戶認證。
  • 將資源建立(例如pod,持久卷,部署)限制爲特定的名稱空間。您還可使用配額來確保資源使用受到限制並受到控制。
  • 讓用戶僅在其受權的名稱空間中查看資源。這使您能夠隔離組織內的資源(例如,部門之間)。
  • 因爲默認啓用了RBAC,所以在配置網絡(例如flanneld)或使Helm時,您可能會看到相似這樣的錯誤:
the server does not allow access to the requested resource

本文將向您展現如何使用RBAC,以便您能夠正確處理此類問題。網絡

準備工做

爲了充分的瞭解本文,建議您有一套完整的Kubernetes環境,並能按咱們的步驟完成整個過程,環境要求以下:app

  • Kubernetes 1.6以上版本,1.6前的版本,須要手動啓用RBAC,若是您是在本機用minikube安裝kubernetes,命令行以下:
minikube start --extra-config=apiserver.Authorization.Mode=RBAC
  • 安裝kubectl命令行工具。
  • 安裝了OpenSSL。

RBAC API 對象

Kubernetes的一項基本功能是其全部資源都是模型化的API對象,該對象容許進行CRUD(建立,讀取,更新,刪除)操做。 資源包括:ide

  • Pods.
  • PersistentVolumes.
  • ConfigMaps.
  • Deployments.
  • Nodes.
  • Secrets.
  • Namespaces.

這些資源上可能的操做示例以下:工具

  • create
  • get
  • delete
  • list
  • update
  • edit
  • watch
  • exec

在更高級別上,資源與API Group(API組)相關聯(例如,Pod屬於核心API group,而Deployment屬於apps API group)。 有關全部可用資源,操做和API組的更多信息。測試

爲了在Kubernetes中管理RBAC,除了資源和操做外,咱們還須要理解如下概念:spa

  • Rules:規則是能夠對屬於不一樣API組的一組資源執行的一組操做。
  • Roles 和 ClusterRoles: 二者都是規則。 Role和ClusterRole之間的區別在於範圍:在Role中,規則只適用於單個命名空間(namespace),而ClusterRole則適用於整個羣集,所以Role適用於多個命名空間。 ClusterRoles還可爲集羣範圍內的資源(例如節點)定義規則。 Role和ClusterRoles都映射爲集羣內的API資源。
  • Subjects:這些對應於嘗試在集羣中進行操做的實體。共有三種類型的主題:
  • User Accounts(用戶賬戶):這些是全局賬戶,用於集羣外部的用戶或程序。 Kubernetes集羣中沒有關聯的資源API對象。
  • Service Accounts(服務賬戶):此賬戶是和命名空間相關的,適用於在Pod內部運行的進程,這些進程須要調用API時進行身份驗證。
  • Groups(組):用於引用多個賬戶,默認狀況下會建立一些組,例如cluster-admin(在後面的部分中進行說明)。
  • RoleBindings 和 ClusterRoleBindings: 就像名稱的意思,這些將Subjects綁定到角色(即給定用戶能夠執行的操做)。RoleBinding將使規則在命名空間內有效,而ClusterRoleBinding將使規則在全部命名空間內有效。

您能夠在Kubernetes官方文檔中找到每一個API元素的示例。

示例1: 建立一個新的用戶,從遠程訪問kubernetes集羣

在此示例中,咱們將爲「開發組(development)」的"cjzhao"用戶建立一個獨享的命名空間(cjns),並從遠程服務器訪問集羣,主要包括如下對象:

  • Username: cjzhao
  • Group: development
  • Namespace: cjns

咱們將添加必要的RBAC策略,以便用戶cjzhao僅在cjns命名空間內便可徹底管理deployment(即便用kubectl run命令)。 最後,咱們將測試這些策略以確保它們按預期工做。

建立namespace

執行kubectl create命令建立命名空間(以admin用戶身份):

kubectl create namespace cjns

建立用戶憑證(User Credentials)

Kubernetes沒有用於用戶賬戶的API。 這裏咱們使用OpenSSL證書(更多的認證方式請參見Kubernetes官方文檔)來管理身份驗證,具體步驟以下:

在kubernetes管控節點(或管理員機器)上執行下面操做

  • 爲您的用戶建立一個私鑰。在此示例中,咱們將文件命名爲cjzhao.key:
openssl genrsa -out cjzhao.key 2048
  • 使用您剛建立的私鑰(cjzhao.key)建立證書籤名請求cjzhao.csr。 確保在-subj部分中指定用戶名和組(CN表示用戶名,O表示用戶組)。 如前所述,咱們將使用cjzhao做爲名稱,使用development做爲用戶組:
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
  • 將cjzhao.crt、cjzhao.key、ca.crt幾個文件打包拷貝到新的機器。

在新的機器上執行下面操做

  • 在安裝了kubectl命令行工具的新的機器上解壓上一步中打包的文件,執行以下命令,配置kubernetes集羣、用戶憑據等信息:
//配置集羣
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"

建立用戶角色來管理Deployments

  • 使用如下內容建立一個role-deployment-manager.yaml文件。 在此yaml文件中,咱們建立規則容許用戶在Deployments,Pods和ReplicaSets對象(建立Deployment所必需)上執行多個操做,這些操做屬於核心(在yaml文件中用「」表示),應用apps和擴展extensions API組:
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

將用戶cjzhao和角色綁定

使用如下內容建立一個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

測試RBAC規則

在新的機器上執行下面的命令建立一個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"

說明相關的用戶權限配置成功。

相關文章
相關標籤/搜索