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

協助改善此頁面

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

想要為此使用者指南做出貢獻? 選擇 GitHub 上的編輯此頁面連結,該連結位於每個頁面的右窗格中。您的貢獻將幫助我們的使用者指南更適合每個人。

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

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

重要

aws-auth ConfigMap 已棄用。如需管理 Kubernetes APIs存取的建議方法,請參閱 使用 EKS 存取項目授予IAM使用者對 Kubernetes的存取權

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

將 IAM 主體新增至 Amazon EKS 叢集

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

注意

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

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

    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 [...]

    在上一個範例輸出中,名為 admin 之使用者的登入資料會設定為名為 my-cluster 的叢集。若該叢集是由這名使用者建立,則其已擁有您叢集的存取權。如果不是建立叢集的使用者,則需要完成其餘步驟,才能為其他 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 編輯 Configmap

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

  2. ConfigMap 檢視目前的映射項目。使用您叢集的名稱取代 my-cluster。將 region-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
  3. 為角色新增映射項目。將 my-group 取代為您的角色名稱。將 eks-console-dashboard-full-access-group 取代為 KubernetesRoleBindingClusterRoleBinding 物件中指定的群組名稱。使用您的帳戶 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
  4. 為使用者新增映射項目。IAM 最佳實務建議您將許可授予角色而非使用者。將 my-user 取代為您的使用者名稱。將 eks-console-dashboard-restricted-access-group 取代為 KubernetesRoleBindingClusterRoleBinding 物件中指定的群組名稱。使用您的帳戶 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
  5. 再次檢視 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

手動編輯 Configmap

  1. 開啟 ConfigMap 進行編輯。

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

    如果您收到錯誤,指出 " Error from server (NotFound): configmaps "aws-auth" not found ",請使用 中的程序將 aws-auth ConfigMap 套用至您的叢集,以套用庫存 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 文件中的預設角色和角色連結

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

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

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

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

      # 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
  4. 儲存檔案並結束您的文字編輯器。

aws-authConfigMap 套用至您的叢集

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

  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 提示。