如何在 Amazon EKS 叢集中跨命名空間管理 IAM 使用者的許可?

3 分的閱讀內容
0

我想在 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集中跨命名空間管理 AWS Identity and Access Management (IAM) 使用者的使用者許可。

簡短描述

若要在 Amazon EKS 叢集中跨命名空間管理使用者許可,請完成下列步驟:

  1. 建立供組織成員擔任的 IAM 角色。
  2. 為叢集建立 Kubernetes 角色型的存取控制 (RBAC) 角色 (角色)和角色連結 (RoleBinding)。如需詳細資訊,請參閱 Kubernetes 網站上的使用 RBAC 授權
  3. 使用 aws-auth ConfigMap 將 IAM 角色對映到 RBAC 角色和群組。

**注意事項:**當 IAM 使用者或角色建立叢集時,只有這個 IAM 身分的 ARN 才會新增到 aws-auth ConfigMap 中,並具有 system:masters 許可。這表示只有叢集建立者才可將更多使用者或角色新增至 aws-auth ConfigMap 中。

解決方案

**注意事項:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確認您使用的是最新的 AWS CLI 版本

建立組織成員可以承擔的 IAM 角色

建立 IAM 角色,授予組織成員命名空間的存取權:

  1. 建立角色以將許可委派給 IAM 使用者

  2. 若要驗證使用者是否具備擔任 IAM 角色的許可,請設定 AWS CLI。然後,從該使用者的工作站執行下列命令:

    $ aws sts assume-role --role-arn arn:aws:iam::yourAccountID:role/yourIAMRoleName --role-session-name abcde{
        "Credentials": {
            "AccessKeyId": "yourAccessKeyId",
            "SecretAccessKey": "yourSecretAccessKey",
            "SessionToken": "yourSessionToken",
            "Expiration": "2020-01-30T01:57:17Z"
        },
        "AssumedRoleUser": {
            "AssumedRoleId": "yourAssumedRoleId",
            "Arn": "arn:aws:iam::yourAccountID:role/yourIAMRoleName"
        }
    }

    **注意事項:**將 yourAccessKeyIdyourSecretAccessKeyyourSessionTokenyourAssumedRoleIdyourAccountID,以及 yourIAMRoleName 取代為您的值。

  3. 更新 kubeconfig 檔案,以設定 IAM 使用者的 kubectl 在存取 Kubernetes API 時一律使用該角色:

    $ aws eks update-kubeconfig --name yourClusterName --role-arn arn:aws:iam::yourAccountID:role/yourIAMRoleName

    **注意事項:**將 yourClusterNameyourAccountID,以及 yourIAMRoleName 取代為您的值。

為您的叢集建立 Kubernetes RBAC 角色和角色連結

**重要事項:**您必須從設定為存取 Kubernetes 的工作站完成下列步驟。您必須是叢集建立者或已經透過 aws-auth ConfigMap 具有存取權的 IAM 身分。IAM 角色還沒有叢集的存取權。

將叢集角色 (ClusterRole) 連結到角色連結。RBAC 角色和角色連結是 Kubernetes 命名空間的資源。但是,您無法將角色連結到叢集角色連結 (ClusterRoleBinding)。

  1. 執行下列命令以列出所有內建的叢集角色,並將叢集角色管理員連結到命名空間的角色連結:

    $ kubectl get clusterrole
  2. 執行下列命令以查看與叢集角色管理員相關聯的許可:

    $ kubectl describe clusterrole admin
  3. 建立名為 test 的命名空間,將存取權授予屬於 IAM 群組的 IAM 使用者:
    **注意事項:**如果您選擇不同的名稱,請取代 namespace 參數的值。若要使用現有的命名空間,請繼續步驟 4。

    $ kubectl create namespace test
  4. 若要建立 Kubernetes RBAC 角色,請將下列程式碼複製到新的 YAML 檔案中 (例如 role.yaml):

    kind: Role
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: k8s-test-role
      namespace: test
    rules:
      - apiGroups:
          - ""
          - "apps"
          - "batch"
          - "extensions"
        resources:
          - "configmaps"
          - "cronjobs"
          - "deployments"
          - "events"
          - "ingresses"
          - "jobs"
          - "pods"
          - "pods/attach"
          - "pods/exec"
          - "pods/log"
          - "pods/portforward"
          - "secrets"
          - "services"
        verbs:
          - "create"
          - "delete"
          - "describe"
          - "get"
          - "list"
          - "patch"
          - "update"

    **注意事項:**Kubernetes RBAC 角色允許使用者執行 verbs 區段中的所有動作。

  5. 執行下列命令以建立 RBAC 角色:

    $ kubectl apply -f role.yaml
  6. 建立 Kubernetes 角色連結。將下列程式碼複製到新的 YAML 檔案中 (例如 rolebinding.yaml):

    kind: RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: k8s-test-rolebinding
      namespace: test
    subjects:
    - kind: User
      name: k8s-test-user
    roleRef:
      kind: Role
      name: k8s-test-role
      apiGroup: rbac.authorization.k8s.io

    **注意事項:**角色連結是命名空間資源,可將 roleRef 區段中的 RBAC 角色連結到 subjects 區段中的使用者。您不需要建立 k8s-test-user 使用者,因為 Kubernetes 沒有 user 資源類型。

  7. 執行下列命令以建立 RBAC 角色連結:

    $ kubectl apply -f rolebinding.yaml

使用 aws-auth ConfigMAP 將 IAM 角色對映到 RBAC 角色和群組 

執行下列命令,將 yourIAMRoleName IAM 角色與 k8s-test-user Kubernetes 使用者建立關聯:

$ eksctl create iamidentitymapping --cluster yourClusterName --arn arn:aws:iam::yourAccountID:role/yourIAMRoleName --username k8s-test-user

**注意事項:**將 yourClusterNameyourAccountID,以及 yourIAMRoleName 取代為您的值。

測試命名空間的存取權

  1. 執行下列命令來測試 test 命名空間的存取權:
    $ kubectl create job hello -n test --image=busybox -- echo "Hello World"
    **注意事項:**上面的命令會建立使用您建立的 k8s-test-role RBAC 角色的工作。
  2. 執行下列命令來檢查 test 命名空間中的 Pod 和工作:
    $ kubectl get job -n testNAME    COMPLETIONS   DURATION   AGE
    hello   1/1           4s         15s
    
    $ kubectl get pods -n test
    NAME          READY   STATUS      RESTARTS   AGE
    hello-tpjmf   0/1     Completed   0          2m34s
AWS 官方
AWS 官方已更新 3 個月前