POLICY_ARN=$(aws --region "$CLUSTER_REGION" --query Policy.Arn --output text iam create-policy --policy-name eksdemo-secretsmanager-policy --policy-document '{
"Version": "2012-10-17",
"Statement": [ {
"Effect": "Allow",
"Action": ["secretsmanager:GetSecretValue", "secretsmanager:DescribeSecret"],
"Resource": ['$SECRET_ARN']
Code snippet copied
上述命令会将该策略的 ARN 存储在变量中,以供后续使用。若要验证策略是否已创建成功,请运行以下命令输出变量:
echo $POLICY_ARN
Code snippet copied
预期的输出应如下所示:
`arn:aws:iam::0123456789:policy/eksdemo-secretsmanager-policy`
Code snippet copied
步骤 4:创建 IAM 角色并与 Kubernetes 服务账户关联
在这一步中,您将使用服务账户的 IAM 角色 (IRSA) 将 Kubernetes 服务账户映射到 Amazon IAM 角色,从而为在 EKS 上运行的应用程序启用精细化的权限管理。您将使用 eksctl 创建一个 Amazon IAM 角色,并将其与 EKS 集群中的特定 Kubernetes 服务账户相关联。您还将使用 Secret Store CSI Driver 在应用程序 Pod 级别(而非 CSI 驱动程序 Pod 级别)应用 IAM 权限。这样可以确保只有利用 IRSA 关联的 Kubernetes 服务账户的特定应用程序 Pod 才有权访问存储在 Amazon Secrets Manager 中的密钥。我们会将在上一步中创建的 IAM 策略关联到新创建的 IAM 角色。请注意,在运行这些命令之前,您必须具有与集群相关联的 OpenID Connect (OIDC) 端点。
eksctl create iamserviceaccount --name eksdemo-secretmanager-sa --region="$CLUSTER_REGION" --cluster "$CLUSTER_NAME" --attach-policy-arn "$POLICY_ARN" --approve --override-existing-serviceaccounts
Code snippet copied
完成后,您应当会看到以下输出结果:
[2023-08-07 15](tel:2023080715):45:32 [ℹ] created serviceaccount "default/eksdemo-secretmanager-sa"
Code snippet copied
确保在集群的“default”命名空间中正确设置了“eksdemo-secretmanager-sa”服务账户。
kubectl get sa eksdemo-secretmanager-sa -o yaml
Code snippet copied
预期的输出应如下所示:
apiVersion: v1
kind: ServiceAccount
metadata:
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::01234567890:role/eksctl-managednodes-quickstart-addon-iamserv-Role1-WRJJQSRMC4LK
creationTimestamp: "2023-09-12T18:32:23Z"
labels:
app.kubernetes.io/managed-by: eksctl
name: eksdemo-secretmanager-sa
namespace: default
resourceVersion: "4456"
uid: 5c7989b7-2cdb-42f6-a9ee-db20a7e484d9
Code snippet copied
步骤 5:安装 ASCP 和 Secrets Store CSI Driver
在这一步中,您将使用 Helm 安装 Amazon Secrets and Configuration Provider (ASCP) 和 Secrets Store CSI Driver,二者会在 Amazon Secrets Manager 和 Kubernetes 集群之间建立安全的桥梁。这样,您的集群就能够访问存储在 Amazon Secrets Manager 中的密钥,并且无需对应用程序代码进行复杂的更改。ASCP 和 Secrets Store CSI Driver 将分别作为 DaemonSet 进行安装,确保驱动程序和提供程序的副本可以在集群中的每个节点上运行。
以下命令会将 Secrets Store CSI Driver Helm 图表存储库添加到本地 Helm 索引以允许安装:
helm repo add secrets-store-csi-driver https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
Code snippet copied
预期的输出应如下所示:
"secrets-store-csi-driver" has been added to your repositories
Code snippet copied
以下命令会将 Amazon Secrets and Configuration Provider (ASCP) Helm 图表存储库添加到本地 Helm 索引以允许安装:
helm repo add aws-secrets-manager https://aws.github.io/secrets-store-csi-driver-provider-aws
Code snippet copied
预期的输出应如下所示:
"aws-secrets-manager" has been added to your repositories
Code snippet copied
若要安装 Secrets Store CSI Driver,请运行以下 Helm 命令:
helm install -n kube-system csi-secrets-store secrets-store-csi-driver/secrets-store-csi-driver
Code snippet copied
预期的输出应如下所示:
NAME: csi-secrets-store
LAST DEPLOYED: Fri Sep 29 17:30:00 2023
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The Secrets Store CSI Driver is getting deployed to your cluster.
To verify that Secrets Store CSI Driver has started, run:
kubectl --namespace=kube-system get pods -l "app=secrets-store-csi-driver"
Now you can follow these steps https://secrets-store-csi-driver.sigs.k8s.io/getting-started/usage.html
to create a SecretProviderClass resource, and a deployment using the SecretProviderClass.
Code snippet copied
如输出内容所述,若要验证 Secrets Store CSI Driver 是否已启动,请运行以下命令:
kubectl --namespace=kube-system get pods -l "app=secrets-store-csi-driver"
Code snippet copied
您应当会看到以下输出结果。确保所有 Pod 的 STATUS 均为 Running:
NAME READY STATUS RESTARTS AGE
csi-secrets-store-secrets-store-csi-driver-5l4sr 3/3 Running 0 2m31s
csi-secrets-store-secrets-store-csi-driver-jhbnf 3/3 Running 0 2m31s
csi-secrets-store-secrets-store-csi-driver-qsdm6 3/3 Running 0 2m31s
Code snippet copied
若要安装 Amazon Secrets and Configuration Provider(ASCP),请运行以下 Helm 命令:
helm install -n kube-system secrets-provider-aws aws-secrets-manager/secrets-store-csi-driver-provider-aws
Code snippet copied
预期的输出应如下所示:
NAME: secrets-provider-aws
LAST DEPLOYED: Tue Sep 12 18:33:45 2023
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
Code snippet copied
您还可以运行以下 Helm 命令来验证安装是否已完成:
`helm list -n kube-system`
Code snippet copied
您会看到如下输出结果:
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
csi-secrets-store kube-system [1 2023-08-07 15](tel:12023080715):39:24.856932796 +0000 UTC deployed secrets-store-csi-driver-1.3.4 1.3.4
secrets-provider-aws kube-system [1 2023-08-07 15](tel:12023080715):39:55.851595668 +0000 UTC deployed secrets-store-csi-driver-provider-aws-0.3.4
Code snippet copied
步骤 6:创建 ASCP SecretProviderClass 资源
在这一步中,您将定义 SecretProviderClass Kubernetes 对象,该对象为 Kubernetes 工作负载中的无缝密钥管理奠定了基础。这个资源充当 Amazon Secrets and Configuration Provider (ASCP) 的一组指令,指定哪些密钥可以从 Amazon Secrets Manager 中获取以及如何将这些密钥挂载到 Pod 中。请注意,SecretProviderClass 必须部署在与引用它的工作负载相同的命名空间中。若要了解详细信息,请参阅 SecretProviderClass 文档。
创建名为 eksdemo-spc.yaml 的 Kubernetes 清单,并将以下内容粘贴到其中:
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
name: eks-demo-aws-secrets
namespace: default
spec:
provider: aws
parameters:
objects: |
- objectName: "eksSecret"
objectType: "secretsmanager"
Code snippet copied
应用 YAML 清单。
`kubectl apply -f eksdemo-spc.yaml`
Code snippet copied
若要验证 SecretProviderClass 是否已创建成功,请运行以下命令:
kubectl describe secretproviderclass eks-demo-aws-secrets
Code snippet copied
预期的输出应如下所示:
Name: eks-demo-aws-secrets
Namespace: default
Labels: <none>
Annotations: <none>
API Version: secrets-store.csi.x-k8s.io/v1
Kind: SecretProviderClass
Metadata:
Creation Timestamp: 2023-08-09T21:13:50Z
Generation: 1
Resource Version: 9853
UID: d11bbadc-f3c8-4e70-8b1e-effe72b1518e
Spec:
Parameters:
Objects: - objectName: "eksSecret"
objectType: "secretsmanager"
Provider: aws
Events: <none>
Code snippet copied
步骤 7:部署示例工作负载以使用密钥
在这一步中,您将部署一个示例工作负载,以桥接您的应用程序和 Amazon Secrets Manager。通过将密钥作为文件挂载到工作负载的文件系统上,您将完成在 Kubernetes 环境中安全管理和访问密钥的端到端过程。在 Pod 模板中,您将指定 Secrets Store CSI 作为卷驱动程序,然后指定挂载密钥的路径,操作方式与挂载传统卷相同。在此示例中,我们将在 /mnt/secrets-store 位置挂载密钥。
创建名为 eksdemo-app.yaml 的 Kubernetes 清单,并将以下内容粘贴到其中:
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: default
spec:
serviceAccountName: eksdemo-secretmanager-sa
volumes:
- name: secrets-store-inline
driver: secrets-store.csi.k8s.io
readOnly: true
volumeAttributes:
secretProviderClass: "eks-demo-aws-secrets"
containers:
- image: public.ecr.aws/docker/library/busybox:1.36
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
name: busybox
volumeMounts:
- name: secrets-store-inline
mountPath: "/mnt/secrets-store"
readOnly: true
restartPolicy: Always
Code snippet copied
应用 YAML 清单。
`kubectl apply ``-``f eksdemo-app.yaml`
Code snippet copied
若要验证 Pod 是否已创建成功,请运行以下命令:
kubectl get pod busybox
Code snippet copied
您应当会看到以下输出结果。确保 Pod STATUS 为 Running:
NAME READY STATUS RESTARTS AGE
busybox 1/1 Running 0 11s
Code snippet copied
# Delete the SecretProviderClass Resources
kubectl delete secretproviderclass eks-demo-aws-secrets
# Remove IAM Roles for Service Accounts (IRSA
`eksctl ``delete`` iamserviceaccount` --cluster="$CLUSTER_NAME" --name=eksdemo-secretmanager-sa --region="$CLUSTER_REGION"
# Delete AWS Secrets Manager Secret without recovery window
aws secretsmanager delete-secret --secret-id eksSecret --region "$CLUSTER_REGION" --force-delete-without-recovery
# Uninstall the AWS Secrets and Configuration Provider
helm uninstall -n kube-system csi-secrets-store
helm uninstall -n kube-system secrets-provider-aws
# Delete IAM Policy
aws iam delete-policy --policy-arn $POLICY_ARN