授權 IAM 使用者對 的存取 Kubernetes 使用 ConfigMap - Amazon EKS

協助改善此頁面

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

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

授權 IAM 使用者對 的存取 Kubernetes 使用 ConfigMap

重要

aws-auth ConfigMap 已棄用。管理 存取的建議方法 Kubernetes APIs 是存取項目

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

將IAM主體新增至您的 Amazon EKS叢集

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

注意

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

將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 rolesrolebindingsclusterrolebindings clusterroles以及您可以映射IAM主體的 。如需這些資源的詳細資訊,請參閱 中的使用RBAC授權 Kubernetes 文件中)。

    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.191.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角色 (例如,聯合使用者 ):將角色詳細資訊新增至 的 mapRoles區段ConfigMap,位於 下data。若此區段在檔案不存在,則將其新增。每個項目支援以下參數:

        • rolearn :要新增ARNIAM的角色的 。此值不能包含路徑。例如,您無法指定 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區塊包含:

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

      • adminIAM使用者從預設 AWS 帳戶映射到 的mapUsers區段 system:masters Kubernetes 群組和來自不同 AWS 帳戶my-user的使用者,該帳戶對應至 Kubernetes 可檢視的 群組 Kubernetes 特定命名空間的資源。如需 IAM和 的清單 Kubernetes my-user IAM 使用者所需的群組許可,請參閱 所需的許可

      視需要新增或移除行,並取代所有行 範例值 使用您自己的值。

      # 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來新增IAM主體的角色型存取控制 (RBAC) 存取權。若尚未啟動自我管理節點且尚未套用 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

      • NodeInstanceRole – 適用於使用 Amazon EKS vended AWS CloudFormation 範本建立的節點群組 AWS Management Console

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

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

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

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

    kubectl get nodes --watch

    輸入 Ctrl+C 傳回 Shell 提示。