如何在Kubernetes ConfigMap中访问AWS Secrets Manager密钥
如何在Kubernetes ConfigMap中访问AWS Secrets Manager的密钥
Kubernetes ConfigMap本身无法直接读取AWS Secrets Manager的密钥,需通过以下两种常见方式实现需求:
方案一:部署时静态注入(适合无需动态更新的场景)
通过AWS CLI拉取Secrets Manager的密钥内容,手动填充到ConfigMap中,步骤如下:
拉取密钥内容
执行命令获取/app/dev/密钥的JSON格式内容:aws secretsmanager get-secret-value --secret-id /app/dev/ --query SecretString --output text > secret.json生成带密钥值的ConfigMap
使用jq工具提取对应键值,生成ConfigMap配置文件:cat << EOF > configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: your-configmap-name data: value1: $(jq -r '.value1' secret.json) Value2: $(jq -r '.Value2' secret.json) EOF应用ConfigMap到集群
kubectl apply -f configmap.yaml
方案二:运行时动态同步(支持密钥自动更新)
借助Secrets Store CSI Driver和AWS Secrets and Configuration Provider(ASCP),将Secrets Manager的密钥同步到Kubernetes Secret,再让Pod同时使用ConfigMap和Secret:
安装依赖组件
- 安装Secrets Store CSI Driver:通过kubectl部署官方提供的RBAC规则、CRD及CSI驱动组件。
- 安装AWS ASCP:部署AWS官方提供的组件,用于对接Secrets Manager。
创建SecretProviderClass
配置同步规则,将/app/dev/中的键值对同步到Kubernetes Secret:apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: aws-secrets-provider spec: provider: aws parameters: objects: | - objectName: "/app/dev/" objectType: "secretsmanager" jmesPath: - path: "value1" objectAlias: "value1" - path: "Value2" objectAlias: "Value2" secretObjects: - data: - key: value1 objectName: value1 - key: Value2 objectName: Value2 secretName: synced-aws-secrets type: Opaque部署Pod并引用资源
同时挂载ConfigMap和同步后的Secret,让应用通过环境变量读取:apiVersion: v1 kind: Pod metadata: name: your-app-pod spec: containers: - name: app-container image: your-app-image env: # 从ConfigMap读取普通配置 - name: APP_CONFIG_KEY valueFrom: configMapKeyRef: name: your-configmap-name key: your-config-key # 从同步后的Secret读取密钥 - name: SECRET_VALUE1 valueFrom: secretKeyRef: name: synced-aws-secrets key: value1 - name: SECRET_VALUE2 valueFrom: secretKeyRef: name: synced-aws-secrets key: Value2 # 可选:将Secret挂载为文件供应用读取 volumeMounts: - name: secrets-store-inline mountPath: "/mnt/secrets-store" readOnly: true volumes: - name: secrets-store-inline csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: "aws-secrets-provider"
注意:若要求ConfigMap的data字段直接包含密钥值,只能采用方案一的静态注入方式,因为ConfigMap的内容是静态存储的,无法动态引用Secret中的值。
内容的提问来源于stack exchange,提问作者megha
相关产品推荐
相关产品推荐

