服務帳戶的 IAM 角色 - Eksctl 使用者指南

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

服務帳戶的 IAM 角色

提示

eksctl 支援設定透過 EKS Pod Identity Associations 執行應用程式的 EKS 精細許可

Amazon EKS 支援此處的服務帳戶角色 (IRSA)】,可讓叢集運算子將 AWS IAM 角色映射至 Kubernetes 服務帳戶。

這可為在 EKS 上執行並使用其他 AWS 服務的應用程式提供精細的許可管理。這些可能是使用 S3、任何其他資料服務 (RDS、MQ、STS、DynamoDB) 或 Kubernetes 元件的應用程式,例如 AWS Load Balancer 控制器或 ExternalDNS。

您可以使用 輕鬆建立 IAM 角色和服務帳戶對eksctl

注意

如果您使用執行個體角色,並考慮改用 IRSA,則不應混合兩者。

運作方式

它透過 EKS 公開的 IAM OpenID Connect 提供者 (OIDC) 運作,且 IAM 角色的建構必須參考 IAM OIDC 提供者 (特定於指定的 EKS 叢集),並參考其將繫結的 Kubernetes 服務帳戶。建立 IAM 角色後,服務帳戶應包含該角色的 ARN 做為註釋 (eks.amazonaws.com/role-arn)。根據預設,將建立或更新服務帳戶以包含角色註釋,這可以使用旗標 停用--role-only

在 EKS 中,有一個許可控制器,根據 Pod 使用的服務帳戶上的註釋,分別將 AWS 工作階段登入資料注入 Pod 的角色。& AWS_ROLE_ARNAWS_WEB_IDENTITY_TOKEN_FILE環境變數會公開登入資料。由於使用了最新版本的 AWS 開發套件 (如需確切版本的詳細資訊,請參閱此處),應用程式將使用這些登入資料。

資源eksctl的名稱為 iamserviceaccount,代表 IAM 角色和服務帳戶對。

來自 CLI 的用量

注意

服務帳戶的 IAM 角色需要 Kubernetes 1.13 版或更新版本。

IAM OIDC 提供者預設為未啟用,您可以使用下列命令來啟用它,或使用組態檔案 (請參閱下文):

eksctl utils associate-iam-oidc-provider --cluster=<clusterName>

將 IAM OIDC 提供者與叢集建立關聯後,若要建立繫結至服務帳戶的 IAM 角色,請執行:

eksctl create iamserviceaccount --cluster=<clusterName> --name=<serviceAccountName> --namespace=<serviceAccountNamespace> --attach-policy-arn=<policyARN>
注意

您可以指定--attach-policy-arn多次使用多個政策。

更具體地說,您可以透過執行以下操作來建立具有 S3 唯讀存取權的服務帳戶:

eksctl create iamserviceaccount --cluster=<clusterName> --name=s3-read-only --attach-policy-arn=arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess

根據預設,它會在default命名空間中建立,但您可以指定任何其他命名空間,例如:

eksctl create iamserviceaccount --cluster=<clusterName> --name=s3-read-only --namespace=s3-app --attach-policy-arn=arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
注意

如果命名空間尚不存在,則會建立命名空間。

如果您已在叢集中建立服務帳戶 (沒有 IAM 角色),則需要使用 --override-existing-serviceaccounts 旗標。

自訂標記也可以透過指定 套用至 IAM 角色--tags

eksctl create iamserviceaccount --cluster=<clusterName> --name=<serviceAccountName> --tags "Owner=John Doe,Team=Some Team"

CloudFormation 會產生包含隨機字串的角色名稱。如果您偏好預先決定的角色名稱,您可以指定 --role-name

eksctl create iamserviceaccount --cluster=<clusterName> --name=<serviceAccountName> --role-name "custom-role-name"

當服務帳戶由一些其他工具建立和管理時,例如 helm,請使用 --role-only 來防止衝突。然後,另一個工具負責維護角色 ARN 註釋。請注意, --override-existing-serviceaccounts 不會影響 roleOnly/--role-only 服務帳戶,一律會建立角色。

eksctl create iamserviceaccount --cluster=<clusterName> --name=<serviceAccountName> --role-only --role-name=<customRoleName>

當您擁有要與服務帳戶搭配使用的現有角色時,您可以提供 --attach-role-arn旗標,而不是提供政策。為了確保角色只能由指定的服務帳戶擔任,您應該在此處設定關係政策文件】。

eksctl create iamserviceaccount --cluster=<clusterName> --name=<serviceAccountName> --attach-role-arn=<customRoleARN>

若要更新服務帳戶角色許可,您可以執行 eksctl update iamserviceaccount

注意

eksctl delete iamserviceaccount ServiceAccounts 即使 未建立 Kubernetes, 也會將其刪除eksctl

使用組態檔案

若要iamserviceaccounts使用組態檔案管理 ,您會希望在 下設定iam.withOIDC: true和列出您想要的帳戶iam.serviceAccount

所有命令都支援 --config-file,您可以像節點群組一樣管理 iamserviceaccountseksctl create iamserviceaccount 命令支援 --include--exclude旗標 (如需這些運作方式的詳細資訊,請參閱本節)。命令--only-missingeksctl delete iamserviceaccount支援 ,因此您可以像節點群組一樣執行刪除。

注意

IAM 服務帳戶的範圍在命名空間中,即兩個同名的服務帳戶可能存在於不同的命名空間中。因此,若要將服務帳戶唯一定義為 --include--exclude旗標的一部分,您需要以 namespace/name 格式傳遞名稱字串。例如

eksctl create iamserviceaccount --config-file=<path> --include backend-apps/s3-reader

使用 IRSA 搭配已知的使用案例,例如 cluster-autoscaler和 ,wellKnownPolicies包含 啟用 的選項cert-manager,作為 政策清單的速記。

支援的已知政策和其他屬性serviceAccounts會記錄在組態結構描述中

您可以使用下列組態範例搭配 eksctl create cluster

# An example of ClusterConfig with IAMServiceAccounts: --- apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: cluster-13 region: us-west-2 iam: withOIDC: true serviceAccounts: - metadata: name: s3-reader # if no namespace is set, "default" will be used; # the namespace will be created if it doesn't exist already namespace: backend-apps labels: {aws-usage: "application"} attachPolicyARNs: - "arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess" tags: Owner: "John Doe" Team: "Some Team" - metadata: name: cache-access namespace: backend-apps labels: {aws-usage: "application"} attachPolicyARNs: - "arn:aws:iam::aws:policy/AmazonDynamoDBReadOnlyAccess" - "arn:aws:iam::aws:policy/AmazonElastiCacheFullAccess" - metadata: name: cluster-autoscaler namespace: kube-system labels: {aws-usage: "cluster-ops"} wellKnownPolicies: autoScaler: true roleName: eksctl-cluster-autoscaler-role roleOnly: true - metadata: name: some-app namespace: default attachRoleARN: arn:aws:iam::123:role/already-created-role-for-app nodeGroups: - name: "ng-1" tags: # EC2 tags required for cluster-autoscaler auto-discovery k8s.io/cluster-autoscaler/enabled: "true" k8s.io/cluster-autoscaler/cluster-13: "owned" desiredCapacity: 1

如果您在未設定這些欄位的情況下建立叢集,您可以使用下列命令來啟用您所需的一切:

eksctl utils associate-iam-oidc-provider --config-file=<path> eksctl create iamserviceaccount --config-file=<path>

詳細資訊