

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在亚马逊 Elastic Kubernetes Service 中使用 AWS Secrets Manager 密钥
<a name="integrate_eks"></a>

要将来自 AWS Secrets Manager (ASCP) 的密钥显示为挂载在 Amazon EKS Pod 中的文件，你可以使用 Kubernetes S AWS ecrets Store CSI 驱动程序的密钥和配置提供程序。ASCP 可与运行亚马逊 EC2 节点组的亚马逊 Elastic Kubernetes Service 1.17\$1 配合使用。 AWS Fargate 不支持节点组。使用 ASCP，您可以在 Secrets Manager 中存储并管理密钥，然后通过 Amazon EKS 上运行的工作负载检索。如果密钥包含多个 JSON 格式的键-值对，您可以选择要在 Amazon EKS 中挂载的密钥/值对。ASCP 可使用 JMESPath 语法来查询密钥中的键/值对。ASCP 还适用于 Parameter Store 参数。ASCP 提供两种通过 Amazon EKS 进行身份验证的方法。第一种方法是使用服务账户的 IAM 角色（IRSA），第二种方法是使用容器组身份。每种方法都有其优势和用例。

## 基于服务账户的 IAM 角色（IRSA）的 ASCP
<a name="csi_driver_overview"></a>

具有 IAM 服务账户角色的 ASCP (IRSA) 允许您将密钥 AWS Secrets Manager 作为文件挂载到 Amazon EKS Pod 中。这种方法适用于以下情况：
+ 需要将密钥作为文件挂载到容器组（pod）中时。
+ 将 Amazon EKS 版本 1.17 或更高版本与 Amazon EC2 节点组结合使用时。
+ 希望从 JSON 格式的密钥中检索特定的键-值对时。

有关更多信息，请参阅 [将 AWS 密钥和配置提供商 CSI 与服务账户 IAM 角色配合使用 (IRSA)](integrating_ascp_irsa.md)。

## 基于容器组身份的 ASCP
<a name="pod_identity_overview"></a>

基于容器组身份的 ASCP 方法增强了安全性，简化了访问 Amazon EKS 中密钥的配置。这种方法在以下情况下非常有用：
+ 需要在容器组（pod）级别进行更精细的权限管理时。
+ 使用的是 Amazon EKS 版本 1.24 或更高版本时。
+ 需要提高性能和可扩展性时。

有关更多信息，请参阅 [在 Amazon EKS 中使用带有 Pod 身份的 AWS 密钥和配置提供商 CSI](ascp-pod-identity-integration.md)。

## 选择正确的方法
<a name="comparison"></a>

在基于 IRSA 的 ASCP 和基于容器组身份的 ASCP 之间做选择时，需考虑以下因素：
+ 亚马逊 EKSversion：Pod Identity 需要亚马逊 EKS 1.24\$1，而 CSI 驱动程序适用于亚马逊 EKS 1.17\$1。
+ 安全要求：容器组身份可在容器组（pod）级别提供更精细的控制。
+ 性能：容器组身份通常会在大规模环境中展现更出色的性能。
+ 复杂性：容器组身份无需单独的服务账户，可以简化设置。

选择最符合您的具体要求和 Amazon EKS 环境的方法。

# 安装适用于 Amazon EKS 的 ASCP
<a name="ascp-eks-installation"></a>

本节介绍如何安装适用于 Amazon EKS 的 AWS 密钥和配置提供程序。使用 ASCP，您可以将 Secrets Manager 中的密钥和来自的参数 AWS Systems Manager 作为文件挂载到 Amazon EKS Pods 中。

## 先决条件
<a name="prerequisites"></a>
+ Amazon EKS 集群
  + 容器组身份版本 1.24 或更高版本
  + IRSA 版本 1.17 或更高版本
+ 已 AWS CLI 安装并配置的
+ 已为 Amazon EKS 集群安装并配置 kubectl
+ Helm（版本 3.0 或更高版本）

## 安装和配置 ASCP
<a name="integrating_csi_driver_install"></a>

ASCP 可在 [secrets-store-csi-provider-aws 存储 GitHub 库中找到](https://github.com/aws/secrets-store-csi-driver-provider-aws)。回购还包含用于创建和装载密钥的 YAML 文件示例。

安装过程中，您可以将 ASCP 配置为使用 FIPS 端点。有关 终端节点的列表，请参阅[AWS Secrets Manager 端点](asm_access.md#endpoints)。

**将 ASCP 作为 EKS 附加组件安装**

1. 安装`eksctl`（[安装说明](https://docs.aws.amazon.com/eks/latest/eksctl/installation.html)）

1. 运行以下命令以使用[默认配置](https://github.com/aws/secrets-store-csi-driver-provider-aws/blob/main/charts/secrets-store-csi-driver-provider-aws/values.yaml)安装插件：

   ```
   eksctl create addon --cluster <your_cluster> --name aws-secrets-store-csi-driver-provider
   ```

   如果您想配置插件，请改为运行以下安装命令：

   ```
   aws eks create-addon --cluster-name <your_cluster> --addon-name aws-secrets-store-csi-driver-provider --configuration-values 'file://path/to/config.yaml'
   ```

   配置文件可以是 YAML 或 JSON 文件。要查看插件的配置架构，请执行以下操作：

   1. 运行以下命令并记下插件的最新版本：

      ```
      aws eks describe-addon-versions --addon-name aws-secrets-store-csi-driver-provider
      ```

   1. 运行以下命令以查看插件的配置架构，`<version>`替换为上一步中的版本：

      ```
      aws eks describe-addon-configuration --addon-name aws-secrets-store-csi-driver-provider --addon-version <version>
      ```

**使用 Helm 安装 ASCP**

1. 为确保存储库指向最新图表，请使用 `helm repo update.`

1. 安装图表。以下是 `helm install` 命令的示例：

   ```
   helm install -n kube-system secrets-provider-aws aws-secrets-manager/secrets-store-csi-driver-provider-aws
   ```

   1. 要使用 FIPS 端点，请添加以下标志：`--set useFipsEndpoint=true`

   1. 要配置节流，请添加以下标志：`--set-json 'k8sThrottlingParams={"qps": "number of queries per second", "burst": "number of queries per second"}'`

   1. 如果您的集群上已经安装 Secrets Store CSI 驱动程序，请添加以下标志：`--set secrets-store-csi-driver.install=false`。这会跳过将 Secrets Store CSI 驱动程序作为依赖项进行安装。

**在存储库中使用 YAML 进行安装**
+ 使用以下命令。

  ```
  helm repo add secrets-store-csi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
  helm install -n kube-system csi-secrets-store secrets-store-csi-driver/secrets-store-csi-driver
  kubectl apply -f https://raw.githubusercontent.com/aws/secrets-store-csi-driver-provider-aws/main/deployment/aws-provider-installer.yaml
  ```

## 验证安装情况
<a name="verify-ascp-installations"></a>

要验证 EKS 集群、Secrets Store CSI 驱动程序和 ASCP 插件的安装情况，请按照以下步骤操作：

1. 验证 EKS 集群的安装情况：

   ```
   eksctl get cluster --name clusterName
   ```

   该命令应返回有关集群的信息。

1. 验证 Secrets Store CSI 驱动程序的安装情况：

   ```
   kubectl get pods -n kube-system -l app=secrets-store-csi-driver
   ```

   您应该看到正在运行的容器组（pod），其名称如下：`csi-secrets-store-secrets-store-csi-driver-xxx`。

1. 验证 ASCP 插件的安装情况：

------
#### [ YAML installation ]

   ```
   $ kubectl get pods -n kube-system -l app=csi-secrets-store-provider-aws
   ```

   输出示例：

   ```
   NAME                                     READY   STATUS    RESTARTS   AGE
   csi-secrets-store-provider-aws-12345      1/1     Running   0          2m
   ```

------
#### [ Helm installation ]

   ```
   $  kubectl get pods -n kube-system -l app=secrets-store-csi-driver-provider-aws
   ```

   输出示例：

   ```
   NAME                                              READY   STATUS    RESTARTS   AGE
   secrets-provider-aws-secrets-store-csi-driver-provider-67890       1/1     Running   0          2m
   ```

------

   您应该看到处于 `Running` 状态的容器组（pod）。

运行这些命令后，如果一切设置正确，您应该会看到所有组件都在运行，且没有任何错误。如果遇到任何问题，可能需要通过查看出现问题的特定容器组（pod）的日志来进行故障排除。

## 问题排查
<a name="troubleshooting"></a>

1. 要查看 ASCP 提供者的日志，请运行：

   ```
   kubectl logs -n kube-system -l app=csi-secrets-store-provider-aws
   ```

1. 检查 `kube-system` 命名空间中所有容器组（pod）的状态：

   ```
   kubectl -n kube-system get pods
   ```

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

   所有与 CSI 驱动程序和 ASCP 相关的容器组（pod）都应处于“正在运行”状态。

1. 检查 CSI 驱动程序版本：

   ```
   kubectl get csidriver secrets-store.csi.k8s.io -o yaml
   ```

   该命令应返回有关已安装的 CSI 驱动程序的信息。

## 其他资源
<a name="additional-resources"></a>

有关将 ASCP 与 Amazon EKS 结合使用的更多信息，请参阅以下资源：
+ [将容器组身份与 Amazon EKS 结合使用](https://docs.aws.amazon.com/eks/latest/userguide/pod-identities.html)
+ [AWS 秘密商店 CSI 驱动程序开启 GitHub](https://github.com/aws/secrets-store-csi-driver-provider-aws)

# 在 Amazon EKS 中使用带有 Pod 身份的 AWS 密钥和配置提供商 CSI
<a name="ascp-pod-identity-integration"></a>

 AWS 机密和配置提供程序与适用于 Amazon Elastic Kubernetes Service 的 Pod 身份代理集成，为在 Amazon EKS 上运行的应用程序提供了增强的安全性、简化的配置和更高的性能。Pod Identity 在从 Secrets Manager 检索密钥或从 Parameter Stor AWS Systems Manager e 检索参数时简化了 Amazon EKS 的

Amazon EKS 容器组身份通过直接在 Amazon EKS 接口设置权限，减少了操作步骤，且无需在 Amazon EKS 和 IAM 服务之间切换，从而简化了为 Kubernetes 应用程序配置 IAM 权限的过程。容器组身份允许在多个集群中共用一个 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 角色。

1. ASCP 使用此角色进行身份验证。 AWS 服务

1. 如果获得授权，ASCP 会检索请求的密钥并将其提供给容器组（pod）。

有关更多信息，请参阅《Amazon EKS 用户指南**》中的[了解 Amazon EKS 容器组身份的工作原理](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-how-it-works.html)。

## 先决条件
<a name="prerequisites"></a>

**重要**  
仅云中的 Amazon EKS 支持容器组身份。[Amazon EKS Anywhere](https://aws.amazon.com/eks/eks-anywhere/)、[AWS 云端 Red Hat OpenShift 服务](https://aws.amazon.com/rosa/) 或 Amazon EC2 实例上自行管理的 Kubernetes 集群不支持容器组身份。
+ Amazon EKS 集群（版本 1.24 或更高版本）
+ 通过以下方式访问 AWS CLI 和 Amazon EKS 集群 `kubectl`
+ 访问两个 AWS 账户 （用于跨账户访问）

## 安装 Amazon EKS 容器组身份代理
<a name="install-pod-identity-agent"></a>

要将容器组身份与集群结合使用，必须安装 Amazon EKS 容器组身份代理附加组件。

**安装容器组身份代理**
+ 在集群上安装容器组身份代理附加组件：

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

## 通过容器组身份设置 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 角色：

------
#### [ 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. 创建容器组身份关联。有关示例，请参阅《Amazon EKS 用户指南**》中的[创建容器组身份关联](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 和容器组身份在 `SecretProviderClass` 中的关键区别在于可选参数 `usePodIdentity`。这是一个可选字段，用于确定身份验证方法。如果未指定，则默认对服务账户（IRSA）使用 IAM 角色。
   + 要使用 EKS 容器组身份，请使用以下任意值：`"true", "True", "TRUE", "t", "T"`。
   + 要明确使用 IRSA，请将其设置为以下任意值：`"false", "False", "FALSE", "f", or "F"`。

1. 部署挂载 `/mnt/secrets-store` 下的密钥的容器组（pod）：

   ```
   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 用户指南*》中的[接口 VPC 端点](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 容器组身份以访问 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
  ```

# 将 AWS 密钥和配置提供商 CSI 与服务账户 IAM 角色配合使用 (IRSA)
<a name="integrating_ascp_irsa"></a>

**Topics**
+ [先决条件](#prerequisites)
+ [设置访问控制](#integrating_ascp_irsa_access)
+ [确定要挂载的密钥](#integrating_ascp_irsa_mount)
+ [故障排除](#integrating_ascp_irsa_trouble)

## 先决条件
<a name="prerequisites"></a>
+ Amazon EKS 集群（版本 1.17 或更高版本）
+ 通过以下方式访问 AWS CLI 和 Amazon EKS 集群 `kubectl`

## 设置访问控制
<a name="integrating_ascp_irsa_access"></a>

ASCP 会检索 Amazon EKS 容器组身份并将其交换为 IAM 角色。您可以在 IAM 策略中为该 IAM 角色设置权限。当 ASCP 代入 IAM 角色时，它可以访问您授权的密钥。除非将其与 IAM 角色关联，否则其他容器无法访问密钥。

**授予 Amazon EKS 容器组（pod）对 Secrets Manager 中密钥的访问权限**

1. 创建一个权限策略，授予对容器组（pod）需要访问的密钥的 `secretsmanager:GetSecretValue` 和 `secretsmanager:DescribeSecret` 权限。有关策略示例，请参阅 [示例：读取和描述个人密钥的权限](auth-and-access_iam-policies.md#auth-and-access_examples-read-and-describe)。

1. 为集群创建 IAM OpenID Connect (OIDC) 提供商（如果还没有）。有关更多信息，请参阅《*Amazon EKS 用户指南*》中的[为集群创建 IAM OIDC 提供商](https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html)。

1. [为服务账户创建一个 IAM 角色](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html)并将策略附加到该角色。有关更多信息，请参阅《*Amazon EKS 用户指南*》中的[为服务账户创建 IAM 角色](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html)。

1. 如果您使用私有 Amazon EKS 集群，请确保集群所在的 VPC 具有 AWS STS 终端节点。有关创建端点的信息，请参阅《*AWS Identity and Access Management 用户指南*》中的[接口 VPC 端点](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_interface_vpc_endpoints.html)。

## 确定要挂载的密钥
<a name="integrating_ascp_irsa_mount"></a>

要确定 ASCP 将哪些密钥作为文件系统上的文件挂载在 Amazon EKS 中，您需要创建一个 [SecretProviderClass](ascp-examples.md#ascp-examples-secretproviderclass) YAML 文件。`SecretProviderClass` 列出了要挂载的密钥以及要挂载这些密钥的文件名。`SecretProviderClass` 必须与该文件引用的 Amazon EKS 容器组（pod）位于同一命名空间。

### 将密钥作为文件进行挂载
<a name="mount-secrets"></a>

[以下说明说明如何使用示例 YAML 文件.yaml 和 [ExampleSecretProviderClass.yaml 将密钥挂载为文件。](https://github.com/aws/secrets-store-csi-driver-provider-aws/blob/main/examples/ExampleSecretProviderClass-IRSA.yaml) ExampleDeployment](https://github.com/aws/secrets-store-csi-driver-provider-aws/blob/main/examples/ExampleDeployment-IRSA.yaml)

**在 Amazon EKS 中挂载密钥**

1. 将 `SecretProviderClass` 应用于容器组（pod）：

   ```
   kubectl apply -f ExampleSecretProviderClass.yaml
   ```

1. 部署容器组（pod）：

   ```
   kubectl apply -f ExampleDeployment.yaml
   ```

1. ASCP 会挂载文件。

## 故障排除
<a name="integrating_ascp_irsa_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
  ```
+ 

**验证是否已安装 `SecretProviderClass` CRD：**

  ```
  kubectl get crd secretproviderclasses.secrets-store.csi.x-k8s.io
  ```

  该命令应返回有关 `SecretProviderClass` 自定义资源定义的信息。
+ 

**验证 SecretProviderClass 对象是否已创建。**

  ```
  kubectl get secretproviderclass SecretProviderClassName -o yaml
  ```

# AWS 机密和配置提供程序代码示例
<a name="ascp-examples"></a>

## ASCP 身份验证和访问控制示例
<a name="ascp-auth-access-examples"></a>

### 示例：允许 Amazon EKS 容器组身份服务（pods.eks.amazonaws.com）担任角色并标记会话的 IAM 策略：
<a name="w2aac19c17c18b5b3"></a>

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

****  

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

------

## SecretProviderClass
<a name="ascp-examples-secretproviderclass"></a>

您可以使用 YAML 描述要使用 ASCP 在 Amazon EKS 中挂载哪些密钥。有关示例，请参阅 [SecretProviderClass 用法](#ascp-scenarios-secretproviderclass)。

### SecretProviderClass YAML 结构
<a name="w2aac19c17c18c25b5"></a>

```
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
   name: name
spec:
  provider: aws
  parameters:
    region:
    failoverRegion:
    pathTranslation:
    usePodIdentity:
    preferredAddressType:
    objects:
```

参数字段包含挂载请求的详细信息：

**region**  
（可选）机密 AWS 区域 中的一个。如果不使用此字段，ASCP 将从节点上的注释中查找 “区域”。查找会增加挂载请求的开销，因此我们建议为使用大量容器组（pod）的集群提供区域。  
如果您还指定 `failoverRegion`，ASCP 会尝试从两个区域检索密钥。如果任一区域返回 4xx 错误（例如身份验证问题），ASCP 都不会挂载任何一个密钥。如果成功从 `region` 中检索到密钥，则 ASCP 会挂载该密钥值。如果未成功从 `region` 中检索到密钥，但已成功从 `failoverRegion` 中检索到密钥，则 ASCP 会挂载该密钥值。

**failoverRegion**  
（可选）如果您包含此字段，ASCP 会尝试从 `region` 中定义的区域和此字段检索密钥。如果任一区域返回 4xx 错误（例如身份验证问题），ASCP 都不会挂载任何一个密钥。如果成功从 `region` 中检索到密钥，则 ASCP 会挂载该密钥值。如果未成功从 `region` 中检索到密钥，但已成功从 `failoverRegion` 中检索到密钥，则 ASCP 会挂载该密钥值。有关如何使用此字段的示例，请参阅 [多区域密钥失效转移](#multi-region-failover)。

**pathTranslation**  
（可选）如果 Amazon EKS 中的文件名包含路径分隔符则要使用的单个替换字符，例如 Linux 上的斜杠 (/)。ASCP 无法创建包含路径分隔符的挂载文件。相反，ASCP 使用不同的字符替换路径分隔符。如果不使用此字段，替换字符为下划线 (\$1)，因此，例如 `My/Path/Secret` 挂载为 `My_Path_Secret`。  
要防止字符替换，请输入字符串 `False`。

**usePodIdentity**  
（可选）确定身份验证方法。如果未指定，则默认为服务账户（IRSA）的 IAM 角色。  
+ 要使用 EKS 容器组身份，请使用以下任意值：`"true"`、`"True"`、`"TRUE"`、`"t"` 或 `"T"`。
+ 要明确使用 IRSA，请设置为以下任意值：`"false"`、`"False"`、`"FALSE"`、`"f"` 或 `"F"`。

**preferredAddressType**  
（可选）指定容器组身份代理端点通信的首选 IP 地址类型。该字段仅在使用 EKS 容器组身份功能时适用，使用服务账户的 IAM 角色时将忽略。值不区分大小写。有效值为：  
+ `"ipv4"`、`"IPv4"` “或 `"IPV4"` — 强制使用 Pod Identity Agent IPv4 端点
+ `"ipv6"``"IPv6"`、或 `"IPV6"` — 强制使用 Pod Identity Agent IPv6 端点
+ 未指定 — 使用 auto 端点选择，先尝试 IPv4 端点，如果 IPv4 失败则回退到 IPv6 端点

**对象**  
包含要挂载密钥的 YAML 声明字符串。我们建议使用 YAML 多行字符串或竖线 (\$1) 字符。    
**objectName**  
必需。指定要获取的密钥或参数的名称。对于 Secrets Manager，这是 [https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html#API_GetSecretValue_RequestParameters](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html#API_GetSecretValue_RequestParameters) 参数，可以是密钥的友好名称，也可以是完整 ARN。对于 SSM Parameter Store，这是参数的 [https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParameter.html#API_GetParameter_RequestParameters](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetParameter.html#API_GetParameter_RequestParameters)，可以是参数名称，也可以是完整 ARN。  
**objectType**  
如果不将 Secrets Manager ARN 用于 `objectName`，需要这个操作 可以是 `secretsmanager` 或 `ssmparameter`。  
**objectAlias**  
（可选）Amazon EKS 容器组（pod）中密钥的文件名。如果不指定此字段，则 `objectName` 作为文件名显示。  
**filePermission**  
（可选）4 位八进制字符串，指定用于挂载密钥的文件权限。如果您没有指定此字段，它将默认为 `"0644"`。  
**ObjectVersion**  
（可选）密钥的版本 ID。不推荐，因为每次更新密钥时都必须更新版本 ID。默认情况下，使用最新版本。如果包括 `failoverRegion`，则此字段表示主 `objectVersion`。  
**objectVersionLabel**  
（可选）版本的别名。默认为最新版本 AWSCURRENT。有关更多信息，请参阅 [密钥版本](whats-in-a-secret.md#term_version)。如果包括 `failoverRegion`，则此字段表示主 `objectVersionLabel`。  
**JMESPath**  
（可选）密钥中的键映射到要在 Amazon EKS 中挂载的文件。要使用此字段，密钥值必须采用 JSON 格式。如果使用此字段，必须包含子字段 `path` 和 `objectAlias`。    
**path**  
来自密钥值 JSON 中的键-值对的键。如果该字段包含连字符，请使用单引号对其进行转义，例如：`path: '"hyphenated-path"'`  
**objectAlias**  
要挂载到 Amazon EKS 容器组（pod）中的文件名。如果该字段包含连字符，请使用单引号对其进行转义，例如：`objectAlias: '"hyphenated-alias"'`  
**filePermission**  
（可选）4 位八进制字符串，指定用于挂载密钥的文件权限。如果未指定此字段，则其默认为父对象的文件权限。  
**failoverObject**  
（可选）如果您指定此字段，ASCP 会尝试检索主 `objectName` 中指定的密钥和 `failoverObject` `objectName` 子字段中指定的密钥。如果任何一个返回 4xx 错误（例如身份验证问题），ASCP 都不会挂载任何一个密钥。如果成功从主 `objectName` 中检索到密钥，则 ASCP 会挂载该密钥值。如果未成功从主 `objectName` 中检索到密钥，但已成功从失效转移 `objectName` 中检索到密钥，则 ASCP 会挂载该密钥值。如果包含此字段，责必须包含字段 `objectAlias`。有关如何使用此字段的示例，请参阅 [失效转移到其他密钥](#failover-secret)。  
当失效转移密钥不是副本时，通常使用此字段。有关如何指定副本的示例，请参阅 [多区域密钥失效转移](#multi-region-failover)。    
**objectName**  
失效转移密钥的名称或完整 ARN。如果使用 ARN，则 ARN 中的区域必须与字段 `failoverRegion` 匹配。  
**ObjectVersion**  
（可选）密钥的版本 ID。必须与主 `objectVersion` 匹配。不推荐，因为每次更新密钥时都必须更新版本 ID。默认情况下，使用最新版本。  
**objectVersionLabel**  
（可选）版本的别名。默认为最新版本 AWSCURRENT。有关更多信息，请参阅 [密钥版本](whats-in-a-secret.md#term_version)。

### 创建基本 SecretProviderClass 配置以在您的 Amazon EKS 容器中挂载密钥。
<a name="w2aac19c17c18c25c11"></a>

------
#### [ Pod Identity ]

SecretProviderClass 要在同一 Amazon EKS 集群中使用密钥，请执行以下操作：

```
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: aws-secrets-manager
spec:
  provider: aws
  parameters:
    objects: |
      - objectName: "mySecret"
        objectType: "secretsmanager"
    usePodIdentity: "true"
```

------
#### [ IRSA ]

```
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: deployment-aws-secrets
spec:
  provider: aws
  parameters:
    objects: |
        - objectName: "MySecret"
          objectType: "secretsmanager"
```

------

### SecretProviderClass 用法
<a name="ascp-scenarios-secretproviderclass"></a>

使用这些示例为不同的场景创建 SecretProviderClass 配置。

#### 示例：按名称或 ARN 挂载密钥
<a name="mount-by-name-arn"></a>

此示例说明了如何挂载三种不同类型的密钥：
+ 由完整 ARN 指定的密钥
+ 由名称指定的密钥
+ 密钥的特定版本

```
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: aws-secrets
spec:
  provider: aws
  parameters:
    objects: |
      - objectName: "arn:aws:secretsmanager:us-east-2:777788889999:secret:MySecret2-d4e5f6"
      - objectName: "MySecret3"
        objectType: "secretsmanager"
      - objectName: "MySecret4"
        objectType: "secretsmanager"
        objectVersionLabel: "AWSCURRENT"
```

#### 示例：从密钥挂载键-值对
<a name="mount-key-value-pairs"></a>

此示例说明了如何从 JSON 格式的密钥挂载特定的键-值对：

```
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: aws-secrets
spec:
  provider: aws
  parameters:
    objects: |
      - objectName: "arn:aws:secretsmanager:us-east-2:777788889999:secret:MySecret-a1b2c3"
        jmesPath: 
            - path: username
              objectAlias: dbusername
            - path: password
              objectAlias: dbpassword
```

#### 示例：按文件权限挂载密钥
<a name="mount-by-permission"></a>

此示例说明了如何使用特定文件权限挂载密钥

```
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: aws-secrets
spec:
  provider: aws
  parameters:
    objects: |
      - objectName: "mySecret"
        objectType: "secretsmanager"
        filePermission: "0600"
        jmesPath: 
            - path: username
              objectAlias: dbusername
              filePermission: "0400"
```

#### 示例：失效转移配置示例
<a name="failover-examples"></a>

此示例说明了如何为密钥配置失效转移。

##### 多区域密钥失效转移
<a name="multi-region-failover"></a>

此示例说明了如何为跨多个区域复制的密钥配置自动失效转移：

```
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: aws-secrets
spec:
  provider: aws
  parameters:
    region: us-east-1
    failoverRegion: us-east-2
    objects: |
      - objectName: "MySecret"
```

##### 失效转移到其他密钥
<a name="failover-secret"></a>

此示例说明了如何将失效转移配置为其他密钥（并非副本）：

```
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: aws-secrets
spec:
  provider: aws
  parameters:
    region: us-east-1
    failoverRegion: us-east-2
    objects: |
      - objectName: "arn:aws:secretsmanager:us-east-1:777788889999:secret:MySecret-a1b2c3"
        objectAlias: "MyMountedSecret"
        failoverObject: 
          - objectName: "arn:aws:secretsmanager:us-east-2:777788889999:secret:MyFailoverSecret-d4e5f6"
```

## 其他资源
<a name="additional-resources"></a>

有关将 ASCP 与 Amazon EKS 结合使用的更多信息，请参阅以下资源：
+ [将容器组身份与 Amazon EKS 结合使用](https://docs.aws.amazon.com/eks/latest/userguide/pod-identities.html)
+ [使用 AWS 密钥和配置提供程序](https://docs.aws.amazon.com/secretsmanager/latest/userguide/integrating_ascp_csi.html)
+ [AWS 秘密商店 CSI 驱动程序开启 GitHub](https://github.com/aws/secrets-store-csi-driver-provider-aws)