

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

# 使用 AWS 秘密和組態提供者 CSI 搭配 Amazon EKS 的 Pod 身分
<a name="ascp-pod-identity-integration"></a>

 AWS Secrets and Configuration Provider 與 Pod Identity Agent for Amazon Elastic Kubernetes Service 整合，可為在 Amazon EKS 上執行的應用程式提供增強的安全性、簡化組態並改善效能。從 Secrets Manager 或從 AWS Systems Manager 參數存放區擷取秘密或參數時，Pod Identity 可簡化 Amazon EKS 的 IAM 身分驗證。

Amazon EKS Pod 身分識別透過允許直接透過 Amazon EKS 介面設定許可、減少步驟數量，並消除在 Amazon EKS 和 IAM 服務之間切換的需求，簡化設定 Kubernetes 應用程式 IAM 許可的程序。Pod 身分識別可讓您跨多個叢集使用單一 IAM 角色，而無需更新信任政策，並支援[角色工作階段標籤](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-abac.html#pod-id-abac-tags)，以實現更精細的存取控制。這種方法不僅允許跨角色重複使用許可政策來簡化政策管理，還允許根據相符標籤存取 AWS 資源來增強安全性。

## 運作方式
<a name="how-it-works"></a>

1. Pod 身分識別可將 IAM 角色指派給 Pod。

1. ASCP 使用此角色進行身分驗證 AWS 服務。

1. 如果獲得授權，ASCP 會擷取請求的秘密，並將其提供給 Pod。

如需詳細資訊，請參閱《Amazon EKS 使用者指南》**中的[了解 Amazon EKS Pod 身分識別的運作方式](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-how-it-works.html)。

## 先決條件
<a name="prerequisites"></a>

**重要**  
僅雲端中的 Amazon EKS 支援 Pod 身分識別。Amazon EC2 執行個體上的 [Amazon EKS Anywhere](https://aws.amazon.com/eks/eks-anywhere/)、[Red Hat OpenShift Service on AWS](https://aws.amazon.com/rosa/) 或自我管理型 Kubernetes 叢集不支援此功能。
+ Amazon EKS 叢集 (1.24 版或更新版本)
+ 透過 存取 AWS CLI 和 Amazon EKS 叢集 `kubectl`
+ 存取兩個 AWS 帳戶 （用於跨帳戶存取）

## 安裝 Amazon EKS Pod 身分識別代理程式
<a name="install-pod-identity-agent"></a>

若要將 Pod 身分識別與叢集搭配使用，您必須安裝 Amazon EKS Pod 身分識別代理程式附加元件。

**安裝 Pod 身分識別代理程式**
+ 在叢集上安裝 Pod Identity Agent 附加元件：

  ```
  eksctl create addon \
    --name eks-pod-identity-agent \
    --cluster clusterName \
    --region region
  ```

## 使用 Pod 身分識別設定 ASCP
<a name="pod-identity-setup"></a>

1. 建立許可政策，以授予 Pod 需要存取之秘密的 `secretsmanager:GetSecretValue`和 `secretsmanager:DescribeSecret`許可。如需政策範例，請參閱 [範例：讀取和描述個別秘密的許可](auth-and-access_iam-policies.md#auth-and-access_examples-read-and-describe)。

1. 建立由 Amazon EKS 服務主體擔任的 IAM 角色，用於 Pod 身分識別：

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
         {
           "Effect": "Allow",
           "Principal": {
             "Service": "pods.eks.amazonaws.com"
           },
           "Action": [
             "sts:AssumeRole",
             "sts:TagSession"
           ]
         }
       ]
     }
   ```

------

   將 IAM 政策連接至角色：

   ```
   aws iam attach-role-policy \
     --role-name MY_ROLE \
     --policy-arn POLICY_ARN
   ```

1. 建立 Pod 身分識別關聯。如需範例，請參閱《Amazon EKS 使用者指南》**中的[建立 Pod 身分識別關聯](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-association.html#pod-id-association-create)

1. 建立 `SecretProviderClass`，指定要掛載在 Pod 中的秘密：

   ```
   kubectl apply -f https://raw.githubusercontent.com/aws/secrets-store-csi-driver-provider-aws/main/examples/ExampleSecretProviderClass-PodIdentity.yaml
   ```

   在 IRSA 和 Pod 身分識別之間，`SecretProviderClass` 主要差異是選用參數 `usePodIdentity`。這是可決定身分驗證方法的選用欄位。未指定時，它會預設為使用服務帳戶的 IAM 角色 (IRSA)。
   + 若要使用 EKS Pod 身分識別，請使用下列任何值：`"true", "True", "TRUE", "t", "T"`。
   + 若要明確使用 IRSA，請設定為下列任何值：`"false", "False", "FALSE", "f", or "F"`。

1. 在 下部署掛載秘密的 Pod`/mnt/secrets-store`：

   ```
   kubectl apply -f https://raw.githubusercontent.com/aws/secrets-store-csi-driver-provider-aws/main/examples/ExampleDeployment-PodIdentity.yaml
   ```

1. 如果您使用私有 Amazon EKS 叢集，請確定叢集所在的 VPC 具有 AWS STS 端點。如需有關建立端點的資訊，請參閱 *AWS Identity and Access Management User Guide* 中的 [Interface VPC endpoints](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_interface_vpc_endpoints.html)。

### 驗證秘密掛載
<a name="verify-secret-mount"></a>

若要驗證秘密是否已正確掛載，請執行下列命令：

```
kubectl exec -it $(kubectl get pods | awk '/pod-identity-deployment/{print $1}' | head -1) -- cat /mnt/secrets-store/MySecret
```

**設定 Amazon EKS Pod Identity 以存取 Secrets Manager 中的秘密**

1. 建立許可政策，以授予 Pod 需要存取之秘密的 `secretsmanager:GetSecretValue`和 `secretsmanager:DescribeSecret`許可。如需政策範例，請參閱 [範例：讀取和描述個別秘密的許可](auth-and-access_iam-policies.md#auth-and-access_examples-read-and-describe)。

1. 如果您還沒有秘密，請在 Secrets Manager 中建立秘密。

## 疑難排解
<a name="integrating_aspc_pod_trouble"></a>

您可以透過描述 Pod 部署來檢視大多數錯誤。

**若要查看容器的錯誤訊息**

1. 使用下列命令取得 Pod 名稱清單。如果不使用預設命名空間，請使用 `-n NAMESPACE`。

   ```
   kubectl get pods
   ```

1. 若要描述 Pod，請在下列命令中，針對 *PODID* 使用您在上一個步驟中找到的 Pod 中的 Pod ID。如果不使用預設命名空間，請使用 `-n NAMESPACE`。

   ```
   kubectl describe pod/PODID
   ```

**若要查看 ASCP 的錯誤**
+ 若要在提供者日誌中尋找更多資訊，請在下列命令中，針對 *PODID* 使用 *csi-secrets-store-provider-aws* Pod 的 ID。

  ```
  kubectl -n kube-system get pods
  kubectl -n kube-system logs pod/PODID
  ```