如何在Minikube本地集群中挂载AWS Secrets Manager密钥?
在Mac上使用Minikube运行本地Kubernetes集群,想要将AWS Secrets Manager中的密钥挂载到Pod中。按照AWS官方教程(针对EKS)操作,已完成以下步骤:
- 安装Secrets Store CSI Driver:
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 - 安装AWS Provider服务账号:
kubectl apply -f https://raw.githubusercontent.com/aws/secrets-store-csi-driver-provider-aws/main/deployment/aws-provider-installer.yaml - 应用自定义SecretProviderClass:
apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: mypod-aws-secrets namespace: default spec: provider: aws parameters: objects: | - objectName: "testSecret" objectType: "secretsmanager" jmesPath: - path: testSecretKey objectAlias: testSecretKey - 在Deployment中配置挂载(仅相关部分):
spec: replicas: 1 selector: matchLabels: component: myPod template: metadata: labels: component: myPod spec: serviceAccountName: application-pod-sa volumes: - name: secrets-store-inline csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: mypod-aws-secrets
Pod启动失败,报错:
MountVolume.SetUp failed for volume "secrets-store-inline" : rpc error: code = Unknown desc = failed to mount secrets store objects for pod default/myPod-579bdf9b57-dd9tq, err: rpc error: code = Unknown desc = failed to retrieve region from node. error Region not found
已知问题:未告知集群AWS Secrets Manager的区域信息,也未授予集群访问AWS账号Secrets Manager的权限。
提问:
- 应在何处/如何添加这些信息?
- 要实现功能还缺少哪些步骤?
一、配置AWS区域信息
报错核心是无法获取AWS区域,可通过以下任意一种方式解决:
1. 在SecretProviderClass中直接指定区域
修改你的SecretProviderClass,在parameters里添加region字段:
apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: mypod-aws-secrets namespace: default spec: provider: aws parameters: region: "us-east-1" # 替换为你的Secrets Manager所在区域 objects: | - objectName: "testSecret" objectType: "secretsmanager" jmesPath: - path: testSecretKey objectAlias: testSecretKey
应用修改后的配置:kubectl apply -f your-secret-provider-class.yaml
2. 给AWS Provider DaemonSet添加区域环境变量
编辑AWS Provider的DaemonSet:
kubectl edit daemonset -n kube-system secrets-store-csi-driver-provider-aws
在spec.template.spec.containers[0].env中添加:
- name: AWS_REGION value: "us-east-1" # 替换为你的区域
保存退出后,DaemonSet会自动重启Pod加载新配置。
3. 在Minikube节点配置默认区域
通过minikube ssh进入节点,配置AWS默认区域:
minikube ssh aws configure set region us-east-1 # 替换为你的区域 exit
二、配置AWS访问权限
本地Minikube没有EKS的IRSA(IAM Roles for Service Accounts)机制,需通过以下方式赋予访问权限:
方法1:在Minikube节点配置AWS凭证
进入Minikube节点,配置具有Secrets Manager访问权限的AWS账号凭证:
minikube ssh aws configure # 依次输入AWS Access Key ID、AWS Secret Access Key、默认区域、输出格式 exit
确保该账号拥有SecretsManagerReadOnlyAccess权限(或更精细的权限,比如仅允许访问testSecret)。
方法2:通过K8s Secret挂载凭证到AWS Provider
- 创建存储AWS凭证的K8s Secret:
kubectl create secret generic aws-credentials -n kube-system \ --from-file=credentials=$HOME/.aws/credentials \ --from-file=config=$HOME/.aws/config
- 编辑AWS Provider的DaemonSet,挂载该Secret到容器的
/root/.aws/目录:
kubectl edit daemonset -n kube-system secrets-store-csi-driver-provider-aws
在spec.template.spec.volumes中添加:
- name: aws-credentials secret: secretName: aws-credentials
在spec.template.spec.containers[0].volumeMounts中添加:
- name: aws-credentials mountPath: /root/.aws/ readOnly: true
保存后等待DaemonSet重启。
三、补充缺失的部署步骤
- 确保应用ServiceAccount存在
如果application-pod-sa还未创建,执行:
kubectl create serviceaccount application-pod-sa -n default
- 完成Pod的Volume挂载配置
你的Deployment仅定义了Volume,但未将其挂载到容器内的具体路径。修改Deployment的spec.template.spec.containers部分,添加volumeMounts:
spec: # ... 其他配置 ... containers: - name: your-container-name # 替换为你的容器名称 # ... 其他容器配置 ... volumeMounts: - name: secrets-store-inline mountPath: "/mnt/secrets-store" # 替换为你想要挂载的路径 readOnly: true
应用修改后的Deployment:kubectl apply -f your-deployment.yaml
- 验证AWS Provider状态
确保AWS Provider的Pod正常运行:
kubectl get pods -n kube-system -l app=secrets-store-csi-driver-provider-aws
所有Pod状态应为Running。
内容的提问来源于stack exchange,提问作者Noam

