【问题标题】:kubernetes deployment mounts secret as a folder instead of a filekubernetes 部署将秘密挂载为文件夹而不是文件
【发布时间】:2021-04-25 06:40:11
【问题描述】:

我在 kubernetes 中有一个配置文件作为机密文件,我想将它挂载到容器内的特定位置。问题是在容器内创建的卷是一个文件夹,而不是其中包含机密内容的文件。有什么办法解决吗? 我的部署如下所示:

kind: Deployment
apiVersion: apps/v1
metadata:
  name: jetty
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jetty
  template:
    metadata:
      labels:
        app: jetty
    spec:
      containers:
        - name: jetty
          image: quay.io/user/jetty
          ports:
            - containerPort: 8080
          volumeMounts:
          - name: config-properties
            mountPath: "/opt/jetty/config.properties"
            subPath: config.properties
          - name: secrets-properties
            mountPath: "/opt/jetty/secrets.properties"
          - name: doc-path
            mountPath: /mnt/storage/
          resources:
            limits:
              cpu: '1000m'
              memory: '3000Mi'
            requests:
              cpu: '750m'
              memory: '2500Mi'
      volumes:
      - name: config-properties
        configMap:
          name: jetty-config-properties
      - name: secrets-properties
        secret: 
          secretName: jetty-secrets
      - name: doc-path
        persistentVolumeClaim:
          claimName: jetty-docs-pvc
      imagePullSecrets:
      - name: rcc-quay

【问题讨论】:

  • 是否检查过它不适用于秘密。
  • 只能挂载目录。如果您使用它是否有效?只挂载 ConfigMap?还是那个目录上已经有其他东西了?
  • 我需要挂载多个配置文件,其中一些具有密码和哈希值,其他配置文件进入 ConfigMap。 configmaps 与 subPath 配合得很好,但 secrets 不起作用。

标签: kubernetes volumes kubernetes-secrets


【解决方案1】:

Secrets 与 ConfigMaps

Secrets 可让您存储和管理敏感信息(例如密码、私钥),ConfigMaps 用于存储非敏感配置数据。
正如您在 SecretsConfigMaps 文档中看到的那样:

Secret 是包含少量敏感数据(例如密码、令牌或密钥)的对象。

ConfigMap 允许您将特定于环境的配置与容器映像分离,以便您的应用程序易于移植。

将 Secret 挂载为文件

可以创建Secret 并将其作为文件 或多个文件 传递给Pods
我为您创建了一个简单的示例来说明它是如何工作的。 您可以在下面看到使用此 Secret 的示例 Secret 清单文件和 Deployment
注意:我将 subPathSecrets 一起使用,它按预期工作。

---
apiVersion: v1
kind: Secret
metadata:
  name: my-secret
data:
  secret.file1: |
    c2VjcmV0RmlsZTEK
  secret.file2: |
    c2VjcmV0RmlsZTIK
---
apiVersion: apps/v1
kind: Deployment
metadata:
...
    spec:
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: secrets-files
          mountPath: "/mnt/secret.file1"  # "secret.file1" file will be created in "/mnt" directory
          subPath: secret.file1
        - name: secrets-files
          mountPath: "/mnt/secret.file2"  # "secret.file2" file will be created in "/mnt" directory
          subPath: secret.file2
      volumes:
        - name: secrets-files
          secret:
            secretName: my-secret # name of the Secret
            

注意:Secret 应该在Deployment 之前创建。

创建SecretDeployment后,我们可以看看它是如何工作的:

$ kubectl get secret,deploy,pod
NAME                         TYPE                                  DATA   AGE
secret/my-secret             Opaque                                2      76s

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   1/1     1            1           76s

NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-7c67965687-ph7b8   1/1     Running   0          76s

$ kubectl exec nginx-7c67965687-ph7b8 -- ls /mnt
secret.file1
secret.file2
$ kubectl exec nginx-7c67965687-ph7b8 -- cat /mnt/secret.file1
secretFile1
$ kubectl exec nginx-7c67965687-ph7b8 -- cat /mnt/secret.file2
secretFile2

预计体积

我认为实现目标的更好方法是使用projected volume

一个投影卷将多个现有卷源映射到同一个目录中。

Projected Volume documentation 中,您可以找到详细的解释,但另外我创建了一个示例,可以帮助您了解它的工作原理。 使用我从Secretconfig.file1ConfigMap 安装的secret.file1secret.file2config.file1 的投影卷作为文件到Pod

---
apiVersion: v1
kind: Secret
metadata:
  name: my-secret
data:
  secret.file1: |
    c2VjcmV0RmlsZTEK
  secret.file2: |
    c2VjcmV0RmlsZTIK
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
data:
  config.file1: |
    configFile1  
---
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: all-in-one
      mountPath: "/config-volume"
      readOnly: true
  volumes:
  - name: all-in-one
    projected:
      sources:
      - secret:
          name: my-secret
          items:
            - key: secret.file1
              path: secret-dir1/secret.file1
            - key: secret.file2
              path: secret-dir2/secret.file2
      - configMap:
          name: my-config
          items:
            - key: config.file1
              path: config-dir1/config.file1

我们可以检查它是如何工作的:

$ kubectl exec nginx -- ls /config-volume
config-dir1
secret-dir1
secret-dir2    
$ kubectl exec nginx -- cat /config-volume/config-dir1/config.file1
configFile1
$ kubectl exec nginx -- cat /config-volume/secret-dir1/secret.file1
secretFile1
$ kubectl exec nginx -- cat /config-volume/secret-dir2/secret.file2
secretFile2

如果此回复没有回答您的问题,请提供有关您的Secret 的更多详细信息以及您想要实现的具体目标。

【讨论】:

  • 我放弃使用秘密主要是因为它不符合我的要求。我需要将完整的配置文件存储在机密中,然后将这些配置文件写到我所看到的文件中它们在同一个文件中。理想情况下,我会在 configMaps 中设置密钥并从秘密中填充它们的值,但这也不起作用。
  • @zozo6015 我更新了我的答案以更适合您的情况。它回答了你的问题吗?如果没有,请提供有关您的期望/要求的更多信息。
猜你喜欢
  • 2021-05-15
  • 2019-11-27
  • 2019-04-10
  • 2016-08-21
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
  • 2023-03-14
  • 2020-03-23
相关资源
最近更新 更多