本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
服務帳戶的 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 中,有一個許可控制器AWS_ROLE_ARN
AWS_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
,您可以像節點群組一樣管理 iamserviceaccounts。 eksctl create iamserviceaccount
命令支援 --include
和 --exclude
旗標 (如需這些運作方式的詳細資訊,請參閱本節)。命令--only-missing
也eksctl 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>