當前位置: 妍妍網 > 碼農

【運維幹貨分享】如何為service Account建立kubernetes角色

2024-08-30碼農


在此部落格中,你將學習如何為服務帳戶建立 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 存取。