在此部落格中,你將學習如何為服務帳戶建立 Kubernetes 角色,並將其與 pod、部署和 cronjobs 一起使用。
註意: 僅提供對名稱空間中存在的資源的 API 存取。對於集群範圍的 API 存取,你應該使用roleClusterRole
為服務帳戶建立 Kubernetes 角色
讓我們考慮以下場景
你在名為webapps 的名稱空間中有 deployments/pod
deployment/pod 需要 Kubernetes API 存取許可權來管理名稱空間中的資源。
上述場景的解決方案是擁有一個具有特定 API 存取許可權的角色的服務帳戶。
建立繫結到名稱空間 webapps 名稱空間的服務帳戶
使用對 Kubernetes 資源所需的 API 存取許可權列表建立角色。
建立 Rolebinding 以將角色繫結到服務帳戶。
使用 pod/deployment 或 Kubernetes Cronjobs 中的服務帳戶
讓我們實作它。
建立 webapps Namespace
為了進行演示,我們將建立一個名為webapps
kubectl create namespace webapps
建立 Kubernetes 服務帳戶
讓我們建立一個名為app-service-account的服務帳戶,並且繫結名稱空間webapps
復制以下內容並直接在終端上執行。
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
name: app-service-account
namespace: webapps
EOF
為 API 存取建立角色
在 kubernetes 角色中,我們指定 Kubernetes 資源所需的 API 存取列表。
註意:以下角色有權存取大多數 Kubernetes 資源,並具有所有讀取、寫入、列出、更新、修補和刪除許可權。在實際計畫中實施它時,你應該只向角色添加所需的資源和操作。
讓我們建立一個名為 app-role 的角色
復制以下內容並直接在終端上執行。
cat <<EOF | kubectl apply -f -
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: app-role
namespace: webapps
rules:
- apiGroups:
- ""
- apps
- autoscaling
- batch
- extensions
- policy
- rbac.authorization.k8s.io
resources:
- pods
- componentstatuses
- configmaps
- daemonsets
- deployments
- events
- endpoints
- horizontalpodautoscalers
- ingress
- jobs
- limitranges
- namespaces
- nodes
- pods
- persistentvolumes
- persistentvolumeclaims
- resourcequotas
- replicasets
- replicationcontrollers
- serviceaccounts
- services
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
EOF
讓我們列出角色。
kubectl get roles -n webapps
建立角色繫結 [ 將角色附加到 ServiceAccount]
現在我們有一個服務帳戶和一個沒有關系的角色。
使用 Rolebinding,我們將角色附加到服務帳戶。因此,使用 namespace 中的服務帳戶的 Pod 將擁有webappsapp-role
復制以下內容並直接在終端上執行。
cat <<EOF | kubectl apply -f -
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: app-rolebinding
namespace: webapps
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: app-role
subjects:
- namespace: webapps
kind: ServiceAccount
name: app-service-account
EOF
驗證 Kubernetes 角色許可權
我們將使用我透過 kubectl 實用程式建立的 Docker 映像。bibinwilson/docker-kubectl
讓我們部署一個名為debug的pod,使用 bibinwilson/docker-kubectl 映像和我們的服務帳戶app-service-account
cat <<EOF | kubectl apply -f -
---
apiVersion: v1
kind: Pod
metadata:
name: debug
namespace: webapps
spec:
containers:
- image: bibinwilson/docker-kubectl:latest
name: kubectl
serviceAccountName: app-service-account
EOF
讓我們進入 pod 並檢視是否具有我們在角色中提到的許可權。
kubectl exec -it debug /bin/bash -n webapps
現在,你應該能夠在 namespace 中列出 pod 和其他資源。你無法列出其他名稱空間中的 Pod,因為此角色特定於 namespace。
如果你在沒有服務帳戶的情況下部署 Pod 並列出 Pod,你將收到以下錯誤。
Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:webapps:default" cannot list resource "pods"in API group ""in the namespace "webapps"
附加到 Pod 的預設服務帳戶對資源沒有任何 API 存取許可權。
將服務帳戶與 Kubernetes Cronjob 結合使用
以下是使用服務帳戶的 Kubernetes Cronjob 範例。
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: kubernetes-cron-job
spec:
schedule: "0,15,30,45 * * * *"
jobTemplate:
spec:
template:
metadata:
labels:
app: cron-batch-job
spec:
restartPolicy: OnFailure
serviceAccountName: app-service-account
containers:
- name: kube-cron-job
image: devopscube/kubernetes-job-demo:latest
args: ["100"]
在 Kubernetes 部署中使用服務帳戶
以下是使用服務帳戶的 Kubernetes 部署範例。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
serviceAccountName: app-service-account
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
結論
在這篇博文中,我添加了建立 Kubernetes 角色並將其與 pod、部署和 Cronjonbs 一起使用所需的所有步驟。
需要特定於名稱空間的角色的使用案例尤其不多。
一個主要用途是建立存取許可權僅限於名稱空間的使用者。此外,建立服務帳戶以從外部應用程式對名稱空間進行 API 存取。