啟用 IAM 主體的叢集存取權 - Amazon EKS

協助改善此頁面

想要為此使用者指南做出貢獻嗎? 捲動至此頁面底部,然後選取 [編輯此頁面於] GitHub。您的貢獻將有助於使我們的用戶指南更適合所有人。

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

啟用 IAM 主體的叢集存取權

Kubernetes 專用AWS IAM 驗證器在 Amazon EKS 控制平面上執行,可以使用 IAM 主體啟用對叢集的存取權。驗證器會從 aws-auth ConfigMap 獲得其組態資訊。如需所有 aws-auth ConfigMap 設定的詳細資訊,請參閱 GitHub 上的完整組態格式

將 IAM 主體新增至 Amazon EKS 叢集

當您建立 Amazon EKS 叢集時,建立該叢集的 IAM 主體會由 Amazon EKS 控制平面中叢集的角色型存取控制 (RBAC) 組態來自動授予 system:masters 許可。此主體不會出現在任何可見的組態中,因此請務必記下最初建立叢集的主體。若要賦予其他 IAM 主體與叢集互動的能力,您必須編輯 Kubernetes 中的 aws-auth ConfigMap 並用 group 的名稱建立一個 Kubernetes rolebindingclusterrolebinding,其名稱是您在 aws-auth ConfigMap 中指定的名稱。

注意

如需有關 Kubernetes 角色型存取控制 (RBAC) 組態的詳細資訊,請參閱 Kubernetes 文件中的使用 RBAC 授權

將 IAM 主體新增至 Amazon EKS 叢集
  1. 判斷 kubectl 正使用哪些憑證來存取叢集。您可以在電腦上透過一下命令查看 kubectl 正在使用的憑證。如果不使用預設路徑,則使用 kubeconfig 檔案的路徑取代 ~/.kube/config

    cat ~/.kube/config

    範例輸出如下。

    [...] contexts: - context: cluster: my-cluster.region-code.eksctl.io user: admin@my-cluster.region-code.eksctl.io name: admin@my-cluster.region-code.eksctl.io current-context: admin@my-cluster.region-code.eksctl.io [...]

    在前述範例輸出中,已針對名為 my-cluster 的叢集設定名為 admin 的使用者的憑證。若該叢集是由這名使用者建立,則其已擁有您叢集的存取權。若叢集不是由此使用者建立,則您需要完成剩餘的步驟,才能為其他 IAM 主體啟用叢集存取權。IAM 最佳實務建議您將許可授予角色而非使用者。您可以使用以下命令查看目前哪些其他主體可以存取您的叢集:

    kubectl describe -n kube-system configmap/aws-auth

    範例輸出如下。

    Name: aws-auth Namespace: kube-system Labels: <none> Annotations: <none> Data ==== mapRoles: ---- - groups: - system:bootstrappers - system:nodes rolearn: arn:aws:iam::111122223333:role/my-node-role username: system:node:{{EC2PrivateDNSName}} BinaryData ==== Events: <none>

    上一個範例是預設的 aws-auth ConfigMap。只有節點執行個體角色有權存取叢集。

  2. 請確定您現有的 Kubernetes rolesrolebindingsclusterrolesclusterrolebindings (您可以將 IAM 主體映射至此)。如需有關這些資源的詳細資訊,請參閱 Kubernetes 文件中的使用 RBAC 授權

    1. 檢視您現有的 Kubernetes rolesclusterrolesRoles 的作用域為 namespace,但 clusterroles 的作用域限定為叢集。

      kubectl get roles -A
      kubectl get clusterroles
    2. 檢視先前輸出中傳回的任何 roleclusterrole 的詳細資訊,並確認其具有您希望 IAM 主體在叢集中擁有的許可 (rules)。

      role-name 取代為上一個命令的輸出中傳回的 role 名稱。將 kube-system 取代為 role 的命名空間。

      kubectl describe role role-name -n kube-system

      cluster-role-name 取代為上一個命令的輸出中傳回的 clusterrole 名稱。

      kubectl describe clusterrole cluster-role-name
    3. 檢視您現有的 Kubernetes rolebindingsclusterrolebindingsRolebindings 的作用域為 namespace,但 clusterrolebindings 的作用域限定為叢集。

      kubectl get rolebindings -A
      kubectl get clusterrolebindings
    4. 檢視任何 rolebindingclusterrolebinding 的詳細資訊,並確認其具有上一步中列為 roleRefroleclusterrole,以及為 subjects 列出的群組名稱。

      role-binding-name 取代為上一個命令的輸出中傳回的 rolebinding 名稱。將 kube-system 取代為 rolebindingnamespace

      kubectl describe rolebinding role-binding-name -n kube-system

      範例輸出如下。

      apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: eks-console-dashboard-restricted-access-role-binding namespace: default subjects: - kind: Group name: eks-console-dashboard-restricted-access-group apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: eks-console-dashboard-restricted-access-role apiGroup: rbac.authorization.k8s.io

      cluster-role-binding-name 取代為上一個命令的輸出中傳回的 clusterrolebinding 名稱。

      kubectl describe clusterrolebinding cluster-role-binding-name

      範例輸出如下。

      apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: eks-console-dashboard-full-access-binding subjects: - kind: Group name: eks-console-dashboard-full-access-group apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: eks-console-dashboard-full-access-clusterrole apiGroup: rbac.authorization.k8s.io
  3. 編輯 aws-auth ConfigMap。您可以使用例如 eksctl 的工具來更新 ConfigMap,或者您可以透過編輯來手動更新它。

    重要

    我們建議您使用 eksctl 或其他工具來編輯 ConfigMap。如需有關您可使用的其他工具的資訊,請參閱《Amazon EKS 最佳實務指南》中的使用工具對 aws-authConfigMap 進行變更。格式錯誤的 aws-auth ConfigMap可能會導致您失去叢集存取權。

    eksctl
    先決條件

    已在裝置或 AWS CloudShell上安裝版本 0.183.0 或更新版本的 eksctl 命令列工具。如需有關安裝或更新 eksctl 的指示,請參閱 eksctl 文件中的安裝一節。

    1. ConfigMap 檢視目前的映射項目。使用您叢集的名稱取代 my-clusterregion-code以叢集所 AWS 區域 在的位置取代。

      eksctl get iamidentitymapping --cluster my-cluster --region=region-code

      範例輸出如下。

      ARN USERNAME GROUPS ACCOUNT arn:aws:iam::111122223333:role/eksctl-my-cluster-my-nodegroup-NodeInstanceRole-1XLS7754U3ZPA system:node:{{EC2PrivateDNSName}} system:bootstrappers,system:nodes
    2. 為角色新增映射項目。將 my-role 取代為您的角色名稱。將 eks-console-dashboard-full-access-group 取代為 Kubernetes RoleBindingClusterRoleBinding 物件中指定的群組名稱。使用您的帳戶 ID 取代 111122223333。您可以將 admin 取代為您選擇的任何名稱。

      eksctl create iamidentitymapping --cluster my-cluster --region=region-code \ --arn arn:aws:iam::111122223333:role/my-role --username admin --group eks-console-dashboard-full-access-group \ --no-duplicate-arns
      重要

      角色 ARN 不能包含例如 role/my-team/developers/my-role 的路徑。ARN 的格式必須是 arn:aws:iam::111122223333:role/my-role。在此範例中,需移除 my-team/developers/

      範例輸出如下。

      [...]
      2022-05-09 14:51:20 [ℹ]  adding identity "arn:aws:iam::111122223333:role/my-role" to auth ConfigMap
    3. 為使用者新增映射項目。IAM 最佳實務建議您將許可授予角色而非使用者。將 my-user 取代為您的使用者名稱。將 eks-console-dashboard-restricted-access-group 取代為 Kubernetes RoleBindingClusterRoleBinding 物件中指定的群組名稱。使用您的帳戶 ID 取代 111122223333。您可以將 my-user 取代為您選擇的任何名稱。

      eksctl create iamidentitymapping --cluster my-cluster --region=region-code \ --arn arn:aws:iam::111122223333:user/my-user --username my-user --group eks-console-dashboard-restricted-access-group \ --no-duplicate-arns

      範例輸出如下。

      [...]
      2022-05-09 14:53:48 [ℹ]  adding identity "arn:aws:iam::111122223333:user/my-user" to auth ConfigMap
    4. 再次檢視 ConfigMap 中的映射項目。

      eksctl get iamidentitymapping --cluster my-cluster --region=region-code

      範例輸出如下。

      ARN USERNAME GROUPS ACCOUNT arn:aws:iam::111122223333:role/eksctl-my-cluster-my-nodegroup-NodeInstanceRole-1XLS7754U3ZPA system:node:{{EC2PrivateDNSName}} system:bootstrappers,system:nodes arn:aws:iam::111122223333:role/admin my-role eks-console-dashboard-full-access-group arn:aws:iam::111122223333:user/my-user my-user eks-console-dashboard-restricted-access-group
    Edit ConfigMap manually
    1. 開啟 ConfigMap 進行編輯。

      kubectl edit -n kube-system configmap/aws-auth
      注意

      若您收到錯誤訊息,指出 "Error from server (NotFound): configmaps "aws-auth" not found",請使用 將 aws-authConfigMap 套用至您的叢集 中的程序來套用儲存的 ConfigMap

    2. 將您的 IAM 主體新增至 ConfigMap。IAM 群組不是 IAM 主體,因此無法新增至 ConfigMap

      • 新增 IAM 角色 (例如:為聯合身分使用者):在 data 下位於 ConfigMap 中的 mapRoles 區段新增角色詳細資訊。若此區段在檔案不存在,則將其新增。每個項目支援以下參數:

        • rolearn:要新增的 IAM 角色之 ARN。此值不能包含路徑。例如,您無法指定 ARN (如 arn:aws:iam::111122223333:role/my-team/developers/role-name)。ARN 需要改為 arn:aws:iam::111122223333:role/role-name

        • username:Kubernetes 內映射至 IAM 角色的使用者名稱。

        • 群組:要將角色映射到的 Kubernetes 群組的群組或清單。群組可以是預設群組,也可以是 clusterrolebindingrolebinding 中指定的群組。如需詳細資訊,請參閱 Kubernetes 文件中的預設角色和角色連結

      • 若要新增 IAM 使用者:IAM 最佳實務建議您將許可授予角色而非使用者。將使用者詳細資訊新增至 ConfigMapmapUsers 區段 (在 data 下方)。若此區段在檔案不存在,則將其新增。每個項目支援以下參數:

        • userarn:要新增之 IAM 使用者的 ARN。

        • username:Kubernetes 內映射至 IAM 使用者的使用者名稱。

        • 群組:要將使用者映射到的 Kubernetes 群組的群組或清單。群組可以是預設群組,也可以是 clusterrolebindingrolebinding 中指定的群組。如需詳細資訊,請參閱 Kubernetes 文件中的預設角色和角色連結

      例如,下列的 YAML 區塊包含:

      • mapRoles 區段,將 IAM 節點執行個體映射至 Kubernetes 群組,讓節點可以將自己註冊到叢集,以及 my-console-viewer-role IAM 角色,映射至 Kubernetes 群組,可以檢視所有叢集的所有 Kubernetes 資源。如需 my-console-viewer-role IAM 角色所需的 IAM 和 Kubernetes 群組許可的清單,請參閱 所需的許可

      • admin IAM 使用者從預設 AWS 帳戶對應至system:mastersKubernetes群組,以及對應至可檢視特定命名空間Kubernetes資源之Kubernetes群組的其他 AWS 帳戶的my-user使用者的mapUsers區段。如需 my-user IAM 使用者所需的 IAM 和 Kubernetes 群組許可的清單,請參閱 所需的許可

      根據需要新增或移除行,並將所有 example values 取代為您自己的值。

      # Please edit the object below. Lines beginning with a '#' will be ignored, # and an empty file will abort the edit. If an error occurs while saving this file will be # reopened with the relevant failures. # apiVersion: v1 data: mapRoles: | - groups: - system:bootstrappers - system:nodes rolearn: arn:aws:iam::111122223333:role/my-role username: system:node:{{EC2PrivateDNSName}} - groups: - eks-console-dashboard-full-access-group rolearn: arn:aws:iam::111122223333:role/my-console-viewer-role username: my-console-viewer-role mapUsers: | - groups: - system:masters userarn: arn:aws:iam::111122223333:user/admin username: admin - groups: - eks-console-dashboard-restricted-access-group userarn: arn:aws:iam::444455556666:user/my-user username: my-user
    3. 儲存檔案並結束您的文字編輯器。

aws-authConfigMap 套用至您的叢集

在建立受管節點群組或以 eksctl 建立節點群組時,便會自動建立並套用 aws-auth ConfigMap 至您的叢集。最初建立的目的是要允許將節點加入您的叢集,但您也可以使用此 ConfigMap 來新增角色型存取控制 (RBAC) 以存取 IAM 主體。若尚未啟動自我管理節點且尚未套用 aws-auth ConfigMap 至叢集,則您可以使用以下程序來完成此操作。

aws-authConfigMap 套用至您的叢集
  1. 檢查您是否已套用 aws-auth ConfigMap

    kubectl describe configmap -n kube-system aws-auth

    若您收到錯誤訊息,指出 "Error from server (NotFound): configmaps "aws-auth" not found",請使用以下步驟的程序來套用儲存的 ConfigMap

  2. 下載、編輯和套用 AWS 驗證器設定對應。

    1. 下載組態對應。

      curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2020-10-29/aws-auth-cm.yaml
    2. aws-auth-cm.yaml 檔案中,將 rolearn 設定至與您節點關聯的 IAM 角色之 Amazon Resource Name (ARN)。您可以使用文字編輯器來完成此操作,或者透過替換 my-node-instance-role 並執行以下命令:

      sed -i.bak -e 's|<ARN of instance role (not instance profile)>|my-node-instance-role|' aws-auth-cm.yaml

      請勿修改此檔案中的任何其他行。

      重要

      角色 ARN 不能包含例如 role/my-team/developers/my-role 的路徑。ARN 的格式必須是 arn:aws:iam::111122223333:role/my-role。在此範例中,需移除 my-team/developers/

      您可以檢查節點群組的 AWS CloudFormation 堆疊輸出,並尋找下列值:

      • InstanceRoleARN — 針對使用建立的節點群組 eksctl

      • NodeInstance角色 — 針對使用 Amazon EKS 提供 AWS CloudFormation 範本所建立的節點群組 AWS Management Console

    3. 套用組態。此命令可能需要幾分鐘的時間來完成。

      kubectl apply -f aws-auth-cm.yaml
      注意

      如果您收到任何授權或資源類型錯誤,請參閱故障診斷主題中的未經授權或存取遭拒 (kubectl)

  3. 查看節點的狀態,並等待他們到達 Ready 狀態。

    kubectl get nodes --watch

    輸入 Ctrl+C 傳回 Shell 提示。