《蹲坑學K8S》之22-2:Kubernetes授權機制

2020-12-05 DoDo在線

Kubernetes授權主要是用於對集群資源的訪問控制,通過檢查請求包含的相關屬性值,與相對應的訪問策略相比較,API請求必須滿足某些策略才能被處理。跟認證類似,Kubernetes 也支持多種授權機制,並支持同時開啟多個授權插件(只要有一個驗證通過即可)。如果授權成功,則用戶的請求會發送到準入控制模塊做進一步的請求驗證,反之,授權失敗的請求則返回HTTP 403。

Kubernetes授權後,僅處理以下請求屬性:

user, group, extra;API、請求方法(如get、post、update、patch和delete)和請求路徑(如 /api);請求資源和子資源;Namespace;API Group;Kubernetes的授權是基於插件形式的,其常用的授權插件有以下幾種:

Node(節點認證)ABAC(基於屬性的訪問控制)RBAC(基於角色的訪問控制)Webhook(基於http回調機制的訪問控制)本章節中主要學習RBAC授權

一、RBAC

RBAC是指基於角色的訪問控制(Role-based Access Control,RBAC)的授權模式。主要是引入了角色(Role)和角色綁定(RoleBinding)的抽象概念。在ABAC中,K8s集群中的訪問策略只能跟用戶直接關聯;而在RBAC中,訪問策略可以跟某個角色關聯,具體的用戶在跟一個或多個角色相關聯。顯然,RBAC像其他新功能一樣,每次引入新功能,都會引入新的API對象,從而引入新的概念抽象,而這一新的概念抽象一定會使集群服務管理和使用更容易擴展和重用。

在使用 RBAC 時,只需要在啟動 kube-apiserver 時配置 --authorization-mode=RBAC 即可。

RBAC讓一個用戶(Users)扮演一個角色(Role),角色擁有權限,從而讓用戶擁有這樣的權限,隨後在授權機制當中,只需要將權限授予某個角色,此時用戶將獲取對應角色的權限,從而實現角色的訪問控制。

RBAC引入了4個新的頂級資源對象:Role、ClusterRole、RoleBinding、ClusterRoleBinding。同其他API資源對象一樣,用戶可以使用kubectl或者API調用等方式操作這些資源對象。

1、角色(Role)

角色就是指一組權限的集合,這裡的權限都是許可形式的,不存在拒絕的規則。在一個命名空間中,可以用角色來定義一個角色,如果是集群級別的,就需要使用ClusterRole了。

2、集群角色(ClusterRole)

對多namespace和集群級的資源或者是非資源類的 API(如 /healthz)使用群角色ClusterRole。其級別是集群級別範圍的。

3、角色綁定(RoleBinding)

RoleBinding(角色綁定)把角色Role的權限映射到用戶或者用戶組,從而讓用戶繼承角色Role在namespace中的權限。RoleBinding也可以引用ClusterRole,對屬於同一命名空間內ClusterRole定義的資源主體進行授權。

4、集群角色綁定(ClusterRoleBinding)

ClusterRoleBinding讓用戶繼承ClusterRole在整個集群中的權限。ClusterRoleBinding為集群範圍內授權。

5、工作流程

基於資源申明和管理方法申明組成rule規則列表,和Role(角色)或ClusterRole(集群角色)對象進行綁定,Role類的對象將擁有所申明資源及的指定方法的權限。將Role權限落到實際用戶或程序上,即RoleBinding(角色綁定)或CLusterRoleBinding(集群角色綁定)。

Role角色應用有兩種方式:1、User account是為人設計的:則將Role與User(或Group)綁定(需要創建User/Group);過程如下:

2、Service account是為程序使用:將Role與ServiceAccount指定(這需要創建ServiceAccount並且在deployment(或者應用程式)中指定ServiceAccount)。而service account則是僅局限它所在的namespace,其特點如下:

(1)每個namespace都會自動創建一個default service account

(2)Token controller檢測service account的創建,並為它們創建secret;

(3)開啟ServiceAccount Admission Controller後 ;

(4)每個Pod在創建後都會自動設置spec.serviceAccount為default(除非指定了其他ServiceAccout);

(5)驗證Pod引用的service account已經存在,否則拒絕創建;

(6)如果Pod沒有指定ImagePullSecrets,則把service account的ImagePullSecrets加到Pod中;

(7)每個container啟動後都會掛載該service account的token和ca.crt到container的/var/run/secrets/kubernetes.io/serviceaccount/目錄中。

關於service account在上一章節已經講過了,這裡就不再重複贅述。

二、RBAC操作演示

(一)Role和Rolebinding

1、創建角色

注意:一個Role對象只能用於授予對某一單一命名空間中資源的訪問權限

(1)查看role幫助

[root@k8s-master ~]# kubectl create role -h

(2)使用命令創建role

[root@k8s-master ~]# kubectl create role test-role --verb=get,list,watch --resource=pods指定role名稱--verb:指定權限--resource:指定資源或者資源組--dry-run:單跑模式並不會創建

[root@k8s-master ~]# kubectl get role test-rule

(3)使用yaml文件創建role

[root@k8s-master ~]# kubectl create role test-rule --verb=get,list,watch --resource=pods --dry-run -o yaml > test-role.yaml[root@k8s-master ~]# vim test-role.yamlapiVersion: rbac.authorization.k8s.io/v1kind: Role ##資源類型metadata: creationTimestamp: null name: test-rulenamespace: defaultrules:- apiGroups: ##對API內的資源進行操作 - "" ##空字符串:使用core API group resources: ##定義資源對象 - pods verbs: ##定義權限 - get - list - watch

[root@k8s-master ~]# kubectl apply -f test-role.yaml

[root@k8s-master ~]# kubectl get role test-rule

[root@k8s-master ~]# kubectl describe role test-rule

2、角色綁定

(1)查看rolebinding幫助

(2)使用命令創建rolebinding

[root@k8s-master ~]# kubectl create rolebinding test-rolebinding --role=test-role --user=dodo--role:指定綁定的角色--user:指定哪個用戶

[root@k8s-master ~]# kubectl get rolebinding

(3)使用yaml文件創建rolebinding

[root@k8s-master ~]# kubectl create rolebinding test-rolebinding --role=test-role --dry-run -o yaml > test-rolebinding.yaml[root@k8s-master ~]# vim test-rolebinding.yamlapiVersion: rbac.authorization.k8s.io/v1kind: RoleBindingmetadata: creationTimestamp: null name: test-rolebindingroleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: test-rulesubjects:- apiGroup: rbac.authorization.k8s.io kind: User name: dodo

[root@k8s-master ~]# kubectl apply -f test-rolebinding.yaml

[root@k8s-master ~]# kubectl get rolebinding

[root@k8s-master ~]# kubectl describe rolebinding test-rolebinding

[root@k8s-master ~]# kubectl config use-context dodo@kubernetes

(二)Clusterrole和Clusterrolebinding

1、創建clusterrole

[root@k8s-master ~]# vim test-clusterrole.yaml添加:apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata: name: test-clusterrolerules:- apiGroups: - "" resources: - pods verbs: - get - list - watch

[root@k8s-master ~]# kubectl apply -f test-clusterrole.yaml

[root@k8s-master ~]# kubectl get clusterrole test-clusterrole

[root@k8s-master ~]# kubectl describe clusterrole test-clusterrole

2、創建clusterrolebinding

[root@k8s-master ~]# vim test-clusterrolebinding.yaml添加:apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata: creationTimestamp: null name: test-clusterrolebindroleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: test-clusterrolesubjects:- apiGroup: rbac.authorization.k8s.io kind: User name: dodo

[root@k8s-master ~]# kubectl apply -f test-clusterrolebinding.yaml

[root@k8s-master ~]# kubectl get clusterrolebindings test-clusterrolebind

[root@k8s-master ~]# kubectl describe clusterrolebindings test-clusterrolebind

3、驗證:

(1)查看資源

[root@k8s-master ~]# kubectl get pods

(2)切換用戶

[root@k8s-master ~]# kubectl config use-context dodo@kubernetes(2)查看資源

[root@k8s-master ~]# kubectl get pods

[root@k8s-master ~]# kubectl get pods -n kube-system

結論:沒有出現forbidden,因為用戶dodo已被授予get權限。

(3)刪除資源

[root@k8s-master ~]# kubectl delete -f test-web.yaml

結論:出現forbidden,無法刪除。原因是用戶dodo沒有delete(刪除)資源deployment的權限。

相關焦點

  • k8s存儲系統介紹
    在k8s集群中,運行服務離不開持久化地將數據保存起來,這就涉及到k8s的存儲系統了。k8s的存儲系統在運行機制上基於docker原生的volume機制,本質上都是先將存儲掛在到主機上,經過處理後,通過docker的volume機制掛載到容器中。
  • Kubernetes ELK 日誌收集
    >傳統架構圖 本次使用stdout的方式獲取日誌Kubernetes 1.18Elasticsearch 7.6.2Fluend 3.0.1Kibana 7.6.2本次環境項目地址: https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/fluentd-elasticsearch
  • 使用Kubeadm安裝Kubernetes
    不過由於之前部署的k8s 1.3.7集群運行良好,這給了我們在k8s這條路上繼續走下去並走好的信心。但k8s在部署和管理方面的體驗的確是太繁瑣了,於是我們準備試驗一下kubeadm是否能帶給我們超出預期的體驗。之前在aliyun ubuntu 14.04上安裝kubernetes 1.3.7的經驗和教訓,讓我略微有那麼一丟丟底氣,但實際安裝過程依舊是一波三折。
  • 「每日github」6:restful接口mock工具:json-server|K8s上榜等
    2,moment / momentmoment.js是一個JavaScript的時間日期處理類庫。這個庫還是相當好用的,各種時間日期顯示操作功能齊全,且有多語言支持。這個庫建議大家收藏,你必然會用到的,到時候不需要自己重複造輪子。這也是我寫這一些列文章的初衷,避免重複造輪子。
  • 手把手教你用 Jenkins+K8S 打造流水線環境
    集群之外,所以我們準備以下文件才能從外面連接到 kubernetes 集群。 K8S pod template 配置 Jenkins 的 kubernetes-plugin 在執行構建時會在 kubernetes 集群中自動創建一個 Pod,並在 Pod 內部創建一個名為 jnlp 的容器,該容器會連接 Jenkins 並運行 Agent 程序,形成一個 Jenkins
  • 百度PaddlePaddle聯手Kubernetes,助力開發者高效訓練深度學習模型
    圖片 2:運行在 2 個節點上的 3 個 pod 的 Job A 和 1 個 pod 的 Job B每個 pod 的入口是 start.sh。它從一個存儲服務下載數據,所以訓練器可以從 pod 本地的磁碟空間快速讀取。
  • 管理Kubernetes集群的50個開源實用工具
    Link: https://github.com/kubernetes-incubator/kubesprayCost: Free2Link: https://github.com/mrahbar/k8s-testsuiteCost: Free20.
  • 如何在 Kubernetes 上配置 Jenkins?
    https://kubernetes.io/docs/tasks/tools/install-minikube/?ref=hackernoon.com2. 安裝kubectl:請參照下方「Install and Set Up kubectl 」頁面中的步驟進行安裝。
  • 擁抱雲原生,如何將開源項目用k8s部署?
    為了充分利用物理資源、快速擴容同步節點、擁抱雲原生,決定使用k8s部署otter。otter的項目整體上自成一體,出於改造成本考慮,儘量在項目已有基礎上,做一些適配,不改動原始碼。本文將重點分享對於otter適配k8s部署的改造過程,有不當之處,還請多多指教。
  • kubernetes 的Health Check策略詳解
    Health Check健康檢查,直白點說就是防微杜漸,k8s是一個編排引擎我們通過k8s部署容器集群,如果說集群容器沒有健康檢查這個過程,我們無法預知我們生產環境會不會部署上錯誤的容器導致服務崩潰。好在k8s 幫我們考慮到了這個問題,健康檢查是k8s重要特性之一,默認有健康檢查,還可以主動設置一些健康檢查。
  • 如何在Kubernetes容器環境下部署Spinnaker?
    本文重點介紹spinnaker的概念、安裝與踩過的坑,spinnaker在kubernetes的持續部署,以及線上容器服務的選擇與多區容災。 1、關於Spinnaker Spinnaker 是什麼?我們先來了解下它的概念。 Spinnaker 是 Netflix 的開源項目,是一個持續交付平臺,它定位於將產品快速且持續的部署到多種雲平臺上。Spinnaker 有兩個核心的功能集群管理和部署管理。
  • Kubernetes K8S之CPU和內存資源限制詳解
    -cpus 「2」參數告訴容器嘗試使用 2 個 CPU。 內存資源限制示例配置文件的 args 部分提供了容器啟動時的參數。 "--vm-bytes", "150M"參數告知容器嘗試分配 150 MiB 內存。不允許args中的啟動內存大於limits限制內存。
  • CNN記者「蹲坑」,目睹鮑威爾再進白宮,誰是左媒洩密者?
    本期熱點:CNN記者蹲坑,目睹鮑威爾再進白宮,誰是左媒洩密者?只要想正視,就都能看到真相,但是左流媒體不幹這些,心思都用歪了。比如CNN,專門有記者在白宮外蹲坑,看都有哪些人進出白宮,他們好發獨家報導,黑川普。12月20日周日晚,CNN蹲坑記者真的守到了一些信息。
  • 「蹲坑」第23天:英語一2014S1、Text1/英語二2013
    bias ground retreat mute differentiate 點擊回顧「蹲坑」第22天:英語一2013PartB、C/英語二2013hit 達到(某事物);至acquaintance 熟人;泛泛之交occurrence 事件;事情;發生的事innocent 無害的
  • Apache DolphinScheduler 1.3.2 發布,性能提升 2~3 倍
    DolphinScheduler-1.3.2 有超過 30 名貢獻者參與開發,性能較 1.2 版本有 2 ~ 3 倍的提升,相對 1.2 版本,1.3.x 增加了諸如 K8s支持、多目錄管理等重要的新特性和新的任務類型。
  • 蹲坑對抽水馬桶的重大勝利
    好,我知道各位看官家裡都是價值上萬的抽水馬桶,接下來我會手把手教你如何用抽水馬桶享受蹲坑的樂趣。最簡單的方法,你可以這樣:
  • K8s單controller多集群監測總結——client-go
    https://godoc.org/admiralty.io/multicluster-controllerhttps://godoc.org/k8s.io
  • Traefik v2.0.0-rc1 發布,HTTP 反向代理、負載均衡軟體
    2.0.0-rc1已經發布,更新如下: [acme] 改進 acme 日誌 [docker,k8s,k8s/crd,k8s/ingress] chore:更新  docker 和 k8s [k8s,k8s/ingress] 添加 TSL 脫機路由器 [middleware,provider] 添加 Feature-Policy 頭文件支持 [middleware] 添加速率限制器,將 maxConn