天天看點

k8s基于RBAC的權限控制,賦予pod通路k8s API的權限

部署在k8s叢集中的應用,有些需要擁有通路k8s API伺服器的權限,比如說擷取目前命名空間下的pod,svc等資源。k8s通過RBAC規則來賦予使用者、pod、組相應的權限。其中pod使用一種稱為service accounts的機制,下面我們來實踐如何為pod中的應用添權重限。

首先需要在命名空間中建立serviceaccount資

k8s基于RBAC的權限控制,賦予pod通路k8s API的權限

yaml詳細内容如下:

k8s基于RBAC的權限控制,賦予pod通路k8s API的權限

接着建立role(角色),role中包含角色所具有的功能,yaml内容如下:

k8s基于RBAC的權限控制,賦予pod通路k8s API的權限

yaml中定義了角色有擷取default命名空間中pods的權限。

然後定義rolebinding(角色綁定),将角色綁定到上面建立的serviceaccount,

k8s基于RBAC的權限控制,賦予pod通路k8s API的權限

yaml檔案内容如下:

k8s基于RBAC的權限控制,賦予pod通路k8s API的權限

建立一個pod進行測試,yaml檔案如下

k8s基于RBAC的權限控制,賦予pod通路k8s API的權限

檔案中serviceaccountname的值為上述綁定了角色的serviceaccount。

serviceaccount關聯了一個configmap,綁定到pod之後,configmap被挂載到pod中,/var/run/secrets/kubernetes.io/serviceaccount/目錄下包含三個檔案,分别是

k8s基于RBAC的權限控制,賦予pod通路k8s API的權限

pod可以通過使用ca.crt和token來通路API伺服器。

進入容器中,使用curl指令來擷取default命名空間下pod,在get請求中帶上ca.crt和token,如下

k8s基于RBAC的權限控制,賦予pod通路k8s API的權限

傳回結果的部分如下:

k8s基于RBAC的權限控制,賦予pod通路k8s API的權限

API伺服器傳回了pod的詳細資訊。

除了pod,svc等屬于某個命名空間的資源外,還可以擷取非命名空間級别的k8s叢集,包括pv等,需要使用到clusterrole(叢集角色)資源,采用clusterrolebinding(叢集角色綁定)将叢集角色綁定到serviceaccount上。

serviceaccount,role和rolebinding必須屬于某個命名空間下。假如A命名空間下的應用想要通路到B命名空間下的資源,可以将A命名空間下的serviceaccount綁定到B命名空間下的role。也可以将A命名空間下的serviceaccount綁定到clusterrole,讓其可以擷取所有命名空間下的資源。

clusterrole還可以允許通路非資源型的URL,如下圖所示:

k8s基于RBAC的權限控制,賦予pod通路k8s API的權限

為了友善使用,k8s提供了一些clusterrole,部分如下圖所示:

k8s基于RBAC的權限控制,賦予pod通路k8s API的權限

使用者可以直接使用k8s提供的叢集角色,從命名中可以看出,這些叢集角色包括pod,pv,pvc,job,namespace等k8s本身提供的資源,可以根據不同的需求選擇不同的叢集角色,還可以将多個角色綁定到一個serviceaccount上。

上一篇: 2019/11/29
下一篇: k8s配置叢集

繼續閱讀