

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

# 選項 1：在 EKS 叢集上啟用 EKS Pod 身分
<a name="setting-up-enable-IAM"></a>

Amazon EKS Pod 身分識別關聯提供管理應用程式憑證的功能，類似 Amazon EC2 執行個體設定檔將憑證提供給 Amazon EC2 執行個體的方式。Amazon EKS Pod 身分識別透過其他 EKS 驗證 API 和在每個節點上執行的代理程式 Pod，為您的工作負載提供憑證。

自 emr-7.3.0 發行以來，Amazon EMR on EKS 開始支援 StartJobRun 提交模型的 EKS Pod 身分。

如需 EKS Pod 身分的詳細資訊，請參閱[了解 EKS Pod 身分的運作方式](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-how-it-works.html)。

## 為什麼選擇 EKS Pod 身分？
<a name="setting-up-enable-IAM-pod-identity-why"></a>

作為 EMR 設定的一部分，任務執行角色需要在特定命名空間 (EMR 虛擬叢集） 中的 IAM 角色和服務帳戶之間建立信任界限。使用 IRSA，這是透過更新 EMR 任務執行角色的信任政策來實現的。不過，由於 IAM 信任政策長度有 4096 個字元的硬性限制，在最多十二 (12) 個 EKS 叢集之間共用單一任務執行 IAM 角色有其限制。

EMR 支援 Pod 身分，IAM 角色和服務帳戶之間的信任界限現在由 EKS 團隊透過 EKS Pod 身分的關聯 APIs 管理。

**注意**  
EKS Pod 身分的安全界限仍在服務帳戶層級，而非 Pod 層級。

## Pod 身分考量事項
<a name="setting-up-enable-IAM-pod-identity-consider"></a>

如需 Pod 身分限制的資訊，請參閱 [EKS Pod 身分考量](https://docs.aws.amazon.com/eks/latest/userguide/pod-identities.html#pod-id-considerations)事項。

## 在 EKS 叢集中準備 EKS Pod 身分
<a name="setting-up-enable-IAM-pod-eks-cluster"></a>

### 檢查 NodeInstanceRole 中是否存在所需的許可
<a name="setting-up-enable-IAM-pod-eks-cluster-permission"></a>

節點角色`NodeInstanceRole`需要代理程式在 EKS 驗證 API 中執行`AssumeRoleForPodIdentity`動作的許可。您可以將以下內容新增至 Amazon EKS 使用者指南中定義的 [AmazonEKSWorkerNodePolicy](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/security-iam-awsmanpol.html#security-iam-awsmanpol-amazoneksworkernodepolicy)，或使用自訂政策。

如果您的 EKS 叢集建立的 eksctl 版本高於 **0.181.0**，AmazonEKSWorkerNodePolicy 會自動連接到節點角色，包括必要的`AssumeRoleForPodIdentity`許可。如果許可不存在，請手動將下列許可新增至 AmazonEKSWorkerNodePolicy，以允許 擔任 Pod 身分的角色。EKS Pod 身分代理程式需要此許可，才能擷取 Pod 的登入資料。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "eks-auth:AssumeRoleForPodIdentity"
      ],
      "Resource": [
        "*"
      ],
      "Sid": "AllowEKSAUTHAssumeroleforpodidentity"
    }
  ]
}
```

------

### 建立 EKS Pod 身分代理程式附加元件
<a name="setting-up-enable-IAM-pod-eks-cluster-agent"></a>

使用下列命令建立具有最新版本的 EKS Pod Identity Agent 附加元件：

```
aws eks create-addon --cluster-name cluster-name --addon-name eks-pod-identity-agent

kubectl get pods -n kube-system | grep 'eks-pod-identity-agent'
```

使用下列步驟，從 Amazon EKS 主控台建立 EKS Pod Identity Agent 附加元件：

1. 開啟 Amazon EKS 主控台：[Amazon EKS 主控台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 在左側導覽窗格中，選取**叢集**，然後選取您要為其設定 EKS Pod 身分識別代理程式附加元件之叢集的名稱。

1. 選擇**附加元件**索引標籤。

1. 選擇**取得更多附加元件**。

1. 選取 EKS Pod 身分識別代理程式之附加元件方塊右上方的方塊，然後選擇**下一步**。

1. 在**設定選取的附加元件設定**頁面上，在版本下拉式清單中選取任何**版本**。

1. (選用) 展開**選用組態設定**以輸入其他組態。例如，您可以提供替代容器映像位置和 `ImagePullSecrets`。具有已接受索引鍵的 JSON 結構描述會顯示在**附加元件組態結構描述**中。

   在**組態值**中輸入組態金鑰和值。

1. 選擇**下一步**。

1. 確認代理程式 Pod 透過 CLI 在叢集上執行。

   `kubectl get pods -n kube-system | grep 'eks-pod-identity-agent'`

輸出範例如下：

```
NAME                              READY   STATUS    RESTARTS      AGE
eks-pod-identity-agent-gmqp7      1/1     Running   1 (24h ago)   24h
eks-pod-identity-agent-prnsh      1/1     Running   1 (24h ago)   24h
```

這會在 `kube-system` 命名空間中設定新的 DaemonSet。在每個 EKS 節點上執行的 Amazon EKS Pod Identity Agent 會使用 [AssumeRoleForPodIdentity](https://docs.aws.amazon.com/eks/latest/APIReference/API_auth_AssumeRoleForPodIdentity.html) 動作，從 EKS 身分驗證 API 擷取臨時憑證。然後，這些登入資料可供您在容器內執行 AWS SDKs 使用。

如需詳細資訊，請參閱公有文件中的先決條件：[設定 Amazon EKS Pod Identity Agent](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-agent-setup.html)。

## 建立任務執行角色
<a name="setting-up-enable-IAM-pod-create-job-role"></a>

### 建立或更新允許 EKS Pod Identity 的任務執行角色
<a name="setting-up-enable-IAM-pod-create-job-role-update"></a>

若要使用 Amazon EMR on EKS 執行工作負載，您需要建立 IAM 角色。在本文件中，我們將此角色稱為作業執行角色。如需如何建立 IAM 角色的詳細資訊，請參閱《 使用者指南》中的[建立 IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create.html)。

此外，您必須建立指定任務執行角色必要許可的 IAM 政策，然後將此政策連接至角色以啟用 EKS Pod Identity。

例如，您有下列任務執行角色。如需詳細資訊，請參閱[建立任務執行角色](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/creating-job-execution-role.html)。

```
arn:aws:iam::111122223333:role/PodIdentityJobExecutionRole
```

**重要**  
Amazon EMR on EKS 會根據您的任務執行角色名稱自動建立 Kubernetes 服務帳戶。請確定角色名稱不會太長，因為如果 `cluster_name`、 和 的組合`service_account_name`超過長度限制`pod_name`，您的任務可能會失敗。

**任務執行角色組態** – 確保使用下列 EKS Pod 身分的信任許可建立任務執行角色。若要更新現有的任務執行角色，請將其設定為信任下列 EKS 服務委託人，做為信任政策中的額外許可。此信任許可可以與現有的 IRSA 信任政策共存。

```
cat >trust-relationship.json <<EOF
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowEksAuthToAssumeRoleForPodIdentity",
            "Effect": "Allow",
            "Principal": {
                "Service": "pods.eks.amazonaws.com"
            },
            "Action": [
                "sts:AssumeRole",
                "sts:TagSession"
            ]
        }
    ]
}
EOF
```

**使用者許可**：使用者需要執行 `StartJobRun` API 呼叫或提交任務的`iam:PassRole`許可。此許可可讓使用者將任務執行角色傳遞至 EMR on EKS。任務管理員預設應具有 許可。

以下是使用者所需的許可：

```
{
    "Effect": "Allow",
    "Action": "iam:PassRole",
    "Resource": "arn:aws:iam::111122223333:role/PodIdentityJobExecutionRole",
    "Condition": {
        "StringEquals": {
            "iam:PassedToService": "pods.eks.amazonaws.com"
        }
    }
}
```

若要進一步限制使用者存取特定 EKS 叢集，請將 AssociatedResourceArn 屬性篩選條件新增至 IAM 政策。它將角色假設限制為授權的 EKS 叢集，加強您的資源層級安全控制。

```
"Condition": {
        "ArnLike": {
            "iam:AssociatedResourceARN": [
                "arn:aws:eks:us-west-2:111122223333:cluster/*"
            ]
        }
```

## 設定 EKS Pod 身分關聯
<a name="setting-up-enable-IAM-pod-identity-asociations"></a>

### 先決條件
<a name="setting-up-enable-IAM-pod-identity-asociations-prereq"></a>

請確定建立 Pod 身分關聯的 IAM 身分，例如 EKS 管理員使用者，具有 許可`eks:CreatePodIdentityAssociation`和 `iam:PassRole`。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "eks:CreatePodIdentityAssociation"
      ],
      "Resource": [
        "arn:aws:eks:*:*:cluster/*"
      ],
      "Sid": "AllowEKSCreatepodidentityassociation"
    },
    {
      "Effect": "Allow",
      "Action": [
        "iam:PassRole"
      ],
      "Resource": [
        "arn:aws:iam::*:role/*"
      ],
      "Condition": {
        "StringEquals": {
          "iam:PassedToService": "pods.eks.amazonaws.com"
        }
      },
      "Sid": "AllowIAMPassrole"
    }
  ]
}
```

------

### 建立角色和 EMR 服務帳戶的關聯
<a name="setting-up-enable-IAM-pod-identity-asociations-emr-service"></a>

------
#### [ Create EMR role associations through the AWS CLI ]

當您將任務提交至 Kubernetes 命名空間時，管理員必須在任務執行角色與 EMR 受管服務帳戶的身分之間建立關聯。請注意，會在提交作業時自動建立 EMR 受管服務帳戶，範圍限定在提交作業的命名空間。

使用 AWS CLI （高於 2.24.0 版），執行下列命令來建立與 Pod 身分的角色關聯。

執行下列命令來建立與 Pod 身分的角色關聯：

```
aws emr-containers create-role-associations \
        --cluster-name mycluster \
        --namespace mynamespace \
        --role-name JobExecutionRoleIRSAv2
```

請注意：
+ 每個叢集最多可以有 1，000 個關聯。每個任務執行角色 - 命名空間映射需要任務提交者、驅動程式和執行器 Pod 的 3 個關聯。
+ 您只能關聯與叢集位於相同 AWS 帳戶中的角色。您可以將存取權從另一個帳戶委派給此帳戶 (您為要使用的 EKS Pod 身分識別所設定) 中的角色。如需委派存取權和 的教學課程`AssumeRole`，請參閱 [IAM 教學課程：使用 IAM 角色將存取權委派給 AWS 帳戶](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html)。

------
#### [ Create EMR role associations through Amazon EKS ]

提交任務時，EMR 會建立具有特定命名模式的服務帳戶。若要建立手動關聯或將此工作流程與 AWS SDK 整合，請遵循下列步驟：

建構服務帳戶名稱：

```
emr-containers-sa-spark-%(SPARK_ROLE)s-%(AWS_ACCOUNT_ID)s-%(BASE36_ENCODED_ROLE_NAME)s
```

以下範例會為範例任務執行角色 JobExecutionRoleIRSAv2 建立角色關聯。

**角色關聯範例：**

```
RoleName: JobExecutionRoleIRSAv2
Base36EncodingOfRoleName: 2eum5fah1jc1kwyjc19ikdhdkdegh1n26vbe
```

**CLI 命令範例：**

```
# setup for the client service account (used by job runner pod)
# emr-containers-sa-spark-client-111122223333-2eum5fah1jc1kwyjc19ikdhdkdegh1n26vbe
aws eks create-pod-identity-association --cluster-name mycluster --role-arn arn:aws:iam::111122223333:role/JobExecutionRoleIRSAv2 --namespace mynamespace --service-account emr-containers-sa-spark-client-111122223333-2eum5fah1jc1kwyjc19ikdhdkdegh1n26vbe

# driver service account
# emr-containers-sa-spark-driver-111122223333-2eum5fah1jc1kwyjc19ikdhdkdegh1n26vbe        
aws eks create-pod-identity-association --cluster-name mycluster --role-arn arn:aws:iam::111122223333:role/JobExecutionRoleIRSAv2 --namespace mynamespace --service-account emr-containers-sa-spark-driver-111122223333-2eum5fah1jc1kwyjc19ikdhdkdegh1n26vbe

# executor service account
# emr-containers-sa-spark-executor-111122223333-2eum5fah1jc1kwyjc19ikdhdkdegh1n26vbe
aws eks create-pod-identity-association --cluster-name mycluster --role-arn arn:aws:iam::111122223333:role/JobExecutionRoleIRSAv2 --namespace mynamespace --service-account emr-containers-sa-spark-executor-111122223333-2eum5fah1jc1kwyjc19ikdhdkdegh1n26vbe
```

------

完成 EKS Pod 身分所需的所有步驟後，您可以略過下列步驟進行 IRSA 設定：
+ [在 EKS 叢集上啟用服務帳戶的 IAM 角色 (IRSA)](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/setting-up-enable-IAM.html)
+ [建立任務執行角色](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/creating-job-execution-role.html)
+ [更新任務執行角色的信任政策](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/setting-up-trust-policy.html)

您可以直接跳至下列步驟：[授予使用者對 Amazon EMR on EKS 的存取權](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/setting-up-iam.html)

## 刪除角色關聯
<a name="setting-up-enable-IAM-pod-identity-asociations-delete-associations"></a>

每當您刪除虛擬叢集或任務執行角色，而且您不想再將 EMR 的存取權授予其服務帳戶時，您應該刪除該角色的關聯。這是因為 EKS 允許與不存在的資源 （命名空間和服務帳戶） 建立關聯。如果命名空間已刪除或角色不再使用，Amazon EMR on EKS 建議刪除關聯，以釋放空間給其他關聯。

**注意**  
如果您不刪除關聯，保留關聯可能會影響您擴展的能力，因為 EKS 對您可以建立的關聯數量有限制 （軟性限制：每個叢集 1000 個關聯）。您可以在指定的命名空間中列出 Pod 身分關聯，以檢查是否有任何需要清除的保留關聯：

```
aws eks list-pod-identity-associations --cluster-name mycluster --namespace mynamespace
```

使用 AWS CLI (2.24.0 版或更新版本），執行下列 emr-containers 命令來刪除 EMR 的角色關聯：

```
aws emr-containers delete-role-associations \
        --cluster-name mycluster \
        --namespace mynamespace \
        --role-name JobExecutionRoleIRSAv2
```

## 自動將現有 IRSA 遷移至 Pod 身分
<a name="setting-up-enable-IAM-pod-identity-auto-migrate"></a>

您可以使用工具 eksctl 將服務帳戶 (IRSA) 的現有 IAM 角色遷移至 Pod 身分關聯：

```
eksctl utils migrate-to-pod-identity \
    --cluster mycluster \
    --remove-oidc-provider-trust-relationship \
    --approve
```

在沒有`--approve`旗標的情況下執行命令只會輸出反映遷移步驟的計劃，而且不會發生實際的遷移。

## 疑難排解
<a name="setting-up-enable-IAM-pod-identity-troubleshooting"></a>

### 我的任務無法使用登入資料提供者的 NoClassDefinitionFound 或 ClassNotFound 例外狀況，或無法取得登入資料提供者。
<a name="setting-up-enable-IAM-pod-identity-troubleshooting-no-class"></a>

EKS Pod 身分使用容器登入資料提供者來擷取必要的登入資料。如果您已指定自訂登入資料提供者，請確保其正常運作。或者，請確定您使用的是支援 EKS Pod Identity 的正確 AWS SDK 版本。如需詳細資訊，請參閱[開始使用 Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html)。

### 任務失敗，因為 eks-pod-identity-agent 日誌中顯示的「因 【x】 大小限制而無法擷取登入資料」錯誤。
<a name="setting-up-enable-IAM-pod-identity-troubleshooting-creds"></a>

EMR on EKS 會根據任務執行角色名稱建立 Kubernetes 服務帳戶。如果角色名稱太長，EKS 身分驗證將無法擷取登入資料`pod_name`，因為 `cluster_name`、 和 的組合`service_account_name`超過長度限制。識別哪個元件佔用的空間最多，並相應地調整大小。

### 任務失敗，出現 eks-pod-identity 日誌中顯示的「無法擷取登入資料 xxx」錯誤。
<a name="setting-up-enable-IAM-pod-identity-troubleshooting-creds-error"></a>

此問題的一個可能原因是 EKS 叢集是在私有子網路下設定，但未正確設定叢集的 PrivateLink。檢查您的叢集是否位於私有網路中，並設定 AWS PrivateLink 以解決問題。如需詳細說明，請參閱[開始使用 Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html)。