Kubernetes 中提供了良好的多租戶認證管理機制,如 RBAC、ServiceAccount 還有各種策略等。
通過該文件可以看到已經配置了 RBAC 訪問控制
/usr/lib/systemd/system/kube-apiserver.service
1.1 認證
所有 Kubernetes 集群有兩類用戶:由 Kubernetes 管理的Service Accounts (服務賬戶)和(Users Accounts) 普通賬戶。普通賬戶是假定被外部或獨立服務管理的,由管理員分配 keys,用戶像使用 Keystone 或 google 賬號一樣,被存儲在包含 usernames 和 passwords 的 list 的文件里。需要注意:在 Kubernetes 中不能通過 API 調用將普通用戶添加到集群中。
普通帳戶是針對(人)用戶的,服務賬戶針對 Pod 進程。
普通帳戶是全局性。在集群所有namespaces中,名稱具有唯一性。
通常,群集的普通帳戶可以與企業數據庫同步,新的普通帳戶創建需要特殊權限。服務賬戶創建目的是更輕量化,允許集群用戶為特定任務創建服務賬戶。
普通帳戶和服務賬戶的審核注意事項不同。
對于復雜系統的配置包,可以包括對該系統的各種組件的服務賬戶的定義。
1.1.1 Service Account 自動化
1.1.1.1?Service Account Admission Controller
通過 Admission Controller 插件來實現對 pod 修改,它是 apiserver 的一部分。創建或更新 pod 時會同步進行修改 pod。
當插件處于激活狀態(在大多數發行版中都默認情況)創建或修改 pod 時,會按以下操作執行:如果 pod 沒有設置 ServiceAccount,則將 ServiceAccount 設置為 default。
確保 pod 引用的 ServiceAccount 存在,否則將會拒絕請求。
如果 pod 不包含任何 ImagePullSecrets,則將ServiceAccount 的 ImagePullSecrets 會添加到 pod 中。
為包含 API 訪問的 Token 的 pod 添加了一個 volume。把 volumeSource 添加到安裝在 pod 的每個容器中,掛載在 /var/run/secrets/kubernetes.io/serviceaccount。
1.1.1.2?Token Controller
TokenController 作為 controller-manager 的一部分運行。異步行為:觀察 serviceAccount 的創建,并創建一個相應的 Secret 來允許 API 訪問。
觀察 serviceAccount 的刪除,并刪除所有相應的ServiceAccountToken Secret
觀察 secret 添加,并確保關聯的 ServiceAccount 存在,并在需要時向 secret 中添加一個 Token。
觀察 secret 刪除,并在需要時對應 ServiceAccount 的關聯
1.1.1.3?Service Account Controller
Service Account Controller 在 namespaces 里管理ServiceAccount
并確保每個有效的 namespaces 中都存在一個名為 “default” 的 ServiceAccount。
2??授權(RBAC)
2.1?Role
代表一個角色,會包含一組權限,沒有拒絕規則,只是附加允許。它是 Namespace 級別的資源,只能作用與 Namespace 之內。# 查看已有的角色信息
kubectl get role -n ingress-nginx -oyamlyaml配置文件:apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:labels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginxname: nginx-ingressnamespace: ingress-nginx
roles:
- apiGroups:- ""resources:- configmaps- pods- secrets- namespacesverbs:- get
- apiGroups:- ""resourceNames:- ingress-controller-label-nginxresources:- configmapsverbs:- get- update
- apiGroups:- ""resources:- configmapsverbs:- create
2.2?ClusterRole
功能與 Role 一樣,區別是資源類型為集群類型,而 Role 只在 Namespace# 查看某個集群角色的信息
kubectl get clusterrole view -oyaml
2.3?RoleBinding
Role 或 ClusterRole 只是用于制定權限集合,具體作用與什么對象上,需要使用 RoleBinding 來進行綁定。作用于 Namespace 內,可以將 Role 或 ClusterRole 綁定到 User、Group、Service Account 上。# 查看 rolebinding 信息
kubectl get rolebinding --all-namespaces# 查看指定 rolebinding 的配置信息
kubectl get rolebinding <role_binding_name> --all-namespaces -oyamlyaml配置文件:apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:......
roleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename nginx-ingress-role
subjects:
- kind: ServiceAccountname: nginx-ingress-serviceaccountnamespace: ingress-nginx
2.4?ClusterRoleBinding
與 RoleBinding 相同,但是作用于集群之上,可以綁定到該集群下的任意 User、Group 或 Service Account