如何从 Kubernetes 中的秘密挂载单个文件?

Chr*_*ski 8 kubernetes kubernetes-secrets

如何从秘密挂载“单个”文件?

我创建了一个秘密:

kubectl create secret generic oauth \
        --from-file=./.work-in-progress/oauth_private.key \
        --from-file=./.work-in-progress/oauth_public.key \
Run Code Online (Sandbox Code Playgroud)

如何将oauth_private.key文件作为单个文件挂载,而不是使用仅包含两个文件的目录覆盖整个路径(并可能删除最初存在于容器上的文件)?

Emr*_*ain 11

你可以这样做:

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: redis
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: mysecret
      items:
      - key: username
        path: my-group/my-username
Run Code Online (Sandbox Code Playgroud)

假设mysecret包含usernamepassword。上面的 yaml 只会挂载username/etc/foo/my-group/my-username目录中。

有关更多详细信息,请查看:使用机密作为 Pod 中的文件

  • 在这种情况下,`subPath` 可能会有所帮助。检查这个问题的答案:/sf/ask/2339113941/ (4认同)
  • 我假设这会将 /etc/foo 作为一个新的空卷挂载 - 它会覆盖容器中的现有文件?不幸的是,它产生了意想不到的效果。 (3认同)

Art*_*lin 7

在我浪费了一些时间后提供了一个答案,在部署运行的k8s 中创建秘密非常重要namespace,因为秘密与名称空间相关联,并且所有示例都只使用默认名称空间,但您的部署可能不会!

Secret 可以通过多种方式创建,我将展示两种常见的方式:

  1. 从文字字符串
kubectl create secret generic my-secret --from-literal some_key='some_value' --namespace my-namespace
Run Code Online (Sandbox Code Playgroud)
  1. 从文件内容来看
kubectl create secret generic my-secret --from-file myfile --namespace my-namespace
Run Code Online (Sandbox Code Playgroud)

请注意,文件名本质上就是“some_key”的名称,正确--from-literal设置它很重要,因为它将出现在您的 k8s 配置中!

您现在可以调试它是如何膨胀的:

kubectl describe secrets my-secret --namespace my-namespace
Run Code Online (Sandbox Code Playgroud)

请注意 Secret 如何存储多个键值对,在上面的部署示例中,我将只挂载一个单独的密钥。

现在我们已经在正确的命名空间中创建了秘密,我们可以将其挂载为文件。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test
  namespace: my-namespace
spec:
  selector:
    matchLabels:
      app: test
  replicas: 1
  template:
    metadata:
      labels:
        app: test
    spec:
      volumes:
        - name: my-secret
          secret:
            secretName: my-secret
            items:
              - key: my_key
                path: my_key
      containers:
        - name: test
          image: ubuntu:jammy
          volumeMounts:
            - name: my-secret
              mountPath: "/tmp/my_key"
              subPath: my_key
              readOnly: true
Run Code Online (Sandbox Code Playgroud)

这会将秘密作为单个文件安装,而不/tmp/my_key覆盖整个目录。