使用单个卷从 secrets 或 configmaps 挂载多个文件

Hed*_*dge 6 kubernetes kubernetes-secrets

我使用一个秘密来存储多个数据项,如下所示:

apiVersion: v1
kind: Secret
metadata:
  name: my-certs
  namespace: my-namespace
data:
  keystore.p12: LMNOPQRSTUV
  truststore.p12: ABCDEFGHIJK
Run Code Online (Sandbox Code Playgroud)

在我的Deployment我将它们安装到这样的文件中:

volumeMounts:
- mountPath: /app/truststore.p12
    name: truststore-secret
    subPath: truststore.p12
- mountPath: /app/keystore.p12
    name: keystore-secret
    subPath: keystore.p12
volumes:
- name: truststore-secret
secret:
    items:
    - key: truststore.p12
    path: truststore.p12
    secretName: my-certs
- name: keystore-secret
secret:
    items:
    - key: keystore.p12
    path: keystore.p12
    secretName: my-certs
Run Code Online (Sandbox Code Playgroud)

这按预期工作,但我想知道是否可以实现将这两个秘密安装为具有较少 Yaml 的文件的相同结果?例如volumes使用,items但我不知道如何使用一个卷和多个卷items并安装它们。

Wil*_*.F. 8

是的,您可以使用Projected Volume减少 yaml 。

目前,secretconfigMapdownwardAPIserviceAccountToken可以预测体积。

TL;DR 在您的Deployment

spec:
  containers:
  - name: {YOUR_CONTAINER_NAME}
    volumeMounts:
    - name: multiple-secrets-volume
      mountPath: "/app"
      readOnly: true
  volumes:
  - name: multiple-secrets-volume
    projected:
      sources:
      - secret:
          name: my-certs
Run Code Online (Sandbox Code Playgroud)

这是您的案例的完整复制,首先我注册了您的my-certs秘密:

user@minikube:~/secrets$ kubectl get secret my-certs -o yaml
apiVersion: v1
data:
  keystore.p12: TE1OT1BRUlNUVVY=
  truststore.p12: QUJDREVGR0hJSks=
kind: Secret
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","data":{"keystore.p12":"TE1OT1BRUlNUVVY=","truststore.p12":"QUJDREVGR0hJSks="},"kind":"Secret","metadata":{"annotations":{},"name":"my-certs","namespace":"default"}}
  creationTimestamp: "2020-01-22T10:43:51Z"
  name: my-certs
  namespace: default
  resourceVersion: "2759005"
  selfLink: /api/v1/namespaces/default/secrets/my-certs
  uid: d785045c-2931-434e-b6e1-7e090fdd6ff4
Run Code Online (Sandbox Code Playgroud)

然后创建一个pod来测试对的访问secret,这是projected.yaml

user@minikube:~/secrets$ cat projected.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: test-projected-volume
spec:
  containers:
  - name: test-projected-volume
    image: busybox
    args:
    - sleep
    - "86400"
    volumeMounts:
    - name: multiple-secrets-volume
      mountPath: "/app"
      readOnly: true
  volumes:
  - name: multiple-secrets-volume
    projected:
      sources:
      - secret:
          name: my-certs

user@minikube:~/secrets$ kubectl apply -f projected.yaml 
pod/test-projected-volume created
Run Code Online (Sandbox Code Playgroud)

然后测试了对按键的访问:

user@minikube:~/secrets$ kubectl exec -it test-projected-volume -- /bin/sh
/ # ls
app   bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ # cd app
/app # ls
keystore.p12    truststore.p12
/app # cat keystore.p12 
LMNOPQRSTUV/app # 
/app # cat truststore.p12 
ABCDEFGHIJK/app # 
/app # exit
Run Code Online (Sandbox Code Playgroud)

您可以根据需要选择使用secret具有多个数据线的单个数据线,也可以在以下模型中的部署中使用来自基地的多个机密:

    volumeMounts:
    - name: all-in-one
      mountPath: "/projected-volume"
      readOnly: true
  volumes:
  - name: all-in-one
    projected:
      sources:
      - secret:
          name: SECRET_1
      - secret:
          name: SECRET_2
Run Code Online (Sandbox Code Playgroud)

  • @YuraHoy 我也有同样的问题。万一其他人遇到它,我的问题是我将“secret:”和“name:”左对齐,因此“name:”中的“n”直接位于“secret:”中的“s”下方。我通过使其右对齐来修复它,因此“secret:”中的“:”直接位于“name:”中的“:”下方。 (2认同)