Kubernetes 中 AWS Secrets Manager 的环境变量

jon*_*nny 6 kubernetes aws-secrets-manager

在 EKS 中,我尝试使用 SecretProviderClass 将机密作为环境变量提供给容器。我可以看到安装在容器内的秘密,但没有键/名称的组合允许我将其用作环境变量。在容器中我可以 cat /mnt/secrets-store/awscredentials 看到输出:

{"accesskey":"ABCDE12345","secretkey":"a/long/redacted5tring"}
Run Code Online (Sandbox Code Playgroud)

我的 SecretProviderClass 如下

apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: aws-secrets
  namespace: default
spec:
  provider: aws
  parameters:
    objects: |
        - objectName: "path/to/service/awscredentials"
          objectType: secretsmanager
          objectAlias: awscredentials
  secretObjects:
  - secretName: awscredentials
    type: Opaque
    data: 
    - objectName: accesskeyalias
      key: accesskey
    - objectName: secretkeyalias
      key: secretkey

Run Code Online (Sandbox Code Playgroud)

和我的部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myservice
  labels:
    team: devops
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myservice
  template:
    metadata:
      labels:
        app: myservice
    spec:
      serviceAccountName: myservice
      volumes:
      - name: secrets-store-inline
        csi:
          driver: secrets-store.csi.k8s.io
          readOnly: true
          volumeAttributes:
            secretProviderClass: "aws-secrets"
      containers:
      - name: myservice
        image: someimage:2
        volumeMounts:
        - name: secrets-store-inline
          mountPath: "/mnt/secrets-store"
          readOnly: true
        env:
        - name: AWS_ACCESS_KEY
          valueFrom:
            secretKeyRef:
              name: awscredentials
              key: accesskey
Run Code Online (Sandbox Code Playgroud)

当我在不引用 SecretKeyRef 的情况下运行部署时,容器会运行,并且我可以在/mnt/secrets-store/awscredentials. 然而,尝试设置环境变量会导致 Pod 陷入待处理状态并显示消息: Error: secret "awscredentials" not found 我认为我在某处混淆了名称和键,但我花了几个小时尝试了我能想到的每种组合。我缺少什么?

jon*_*nny 9

我最终解决了这个问题。我已按照 AWS 文档安装驱动程序,其中包括使用舵图,即

helm install -n kube-system csi-secrets-store secrets-store-csi-driver/secrets-store-csi-driver
Run Code Online (Sandbox Code Playgroud)

但是,文档未能指出使用此舵图您需要专门设置一个值syncSecret.enabled=true- 如下面的代码所示。

helm install -n kube-system csi-secrets-store secrets-store-csi-driver/secrets-store-csi-driver --set syncSecret.enabled=true
Run Code Online (Sandbox Code Playgroud)

我使用 helm 卸载了 Secrets-store-csi-driver,然后重新安装syncSecret.enabled=true,然后我的 Secretsmanager 密钥立即可以通过kubectl get secrets -n default. 因此,如果您可以在已安装的卷中看到容器内的机密,但无法将它们设置为环境变量,则应检查您是否使用此值进行安装,以便创建 k8s 机密。否则,secretObjects > SecretName 部分不会被执行。