【问题标题】:Changing default file owner and group owner of kubernetes secrets files mounted on projected volumes更改挂载在投影卷上的 kubernetes 机密文件的默认文件所有者和组所有者
【发布时间】:2018-10-01 09:28:57
【问题描述】:

我是 K8S 的新手。我有一个 yaml 文件,它生成安装在投影卷上的 kubernetes 机密。执行后,我发现机密文件(与机密一起打包)显示为“root”作为文件所有者和组所有者。我想将文件所有者和组所有者更改为同一特定用户(例如 450)。

我曾尝试使用 init 容器中的“chown”(尝试过但失败),但出现“只读文件系统”错误,无法修改文件和组所有者。 我不想在 securitycontext 下使用“fsGroup”。我观察到,当使用 fsGroup 时,“items”下的“mode:”选项会以不可预知的方式表现。

有没有办法修改通过投影卷挂载的 kubernetes 机密文件的默认文件和组所有者?

我在下面提供示例代码。假设我想在下面的示例中更改“密码”文件(在“mysecret2”下)的文件和组所有者。如何实现?

apiVersion: v1
kind: Pod
metadata:
  name: volume-test
spec:
  containers:
  - name: container-test
    image: busybox
    volumeMounts:
    - name: all-in-one
      mountPath: "/projected-volume"
      readOnly: true
  volumes:
  - name: all-in-one
    projected:
      sources:
      - secret:
          name: mysecret
          items:
            - key: username
              path: username
      - secret:
          name: mysecret2
          items:
            - key: password
              path: password
              mode: 511

【问题讨论】:

  • 惊讶的是无法设置所有者,并且默认情况下任何人都可以读取秘密。

标签: kubernetes mounted-volumes kubernetes-secrets


【解决方案1】:

据我所知,无法更改机密的所有者 UID。

解决方法是将密钥复制到普通文件,然后更改其所有权和模式,如下所示:

apiVersion: v1
kind: Pod
metadata:
  name: volume-test
spec:
  containers:
  - name: container-test
    image: busybox
    command: |
      - "/bin/bash"
      - "-exc"
        cp /etc/secrets-mount/*_pgpass /etc/secrets
        chown my-user /etc/*_pgpass
        chmod 600 /etc/*_pgpass
        exec su-exec my-user /entrypoint.sh
    volumeMounts:
    - name: secrets
      mountPath: /etc/secrets-mount/

....

【讨论】:

  • 感谢您的解决方法。实际上,不得不做这样的事情实在是太蹩脚了。此功能仍在等待中:github.com/kubernetes/kubernetes/issues/81089
  • 此解决方法并非在所有情况下都可靠地工作。特别是,如果秘密有可能随时更改,您将复制原始版本并且永远不会看到任何更新。使用fsGroupdefaultMode 不会遇到这个问题。
【解决方案2】:

正如 Alexey 所说,目前不可能,直到 github.com/kubernetes/kubernetes/issues/81089 完成。

他的解决方案运行良好,除非您设置了securityContraint.runAsNonRoot,在这种情况下,容器将不会拥有该密钥的权限。

就我而言,我必须执行以下操作:

apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      ##########################################
      #         Volumes definitions
      volumes:
      - name: key-volume
        emptyDir:
          sizeLimit: "8k"
      - name: root-owned-key-volume
        secret:
          secretName: my-secret
          items:
            - key: a_key_file
              path: a_key_file
              mode: 0600
      ##########################################
      #         initContainers definitions
      initContainers:
        - name: set-key-ownership
          image: alpine:3.6
          command: ["sh", "-c", "cp /root-key/* /key && chown -R 33:33 /key"]
          volumeMounts:
          - mountPath: /key
            name: key-volume
          - mountPath: /root-key
            name: root-owned-key-volume
      ##########################################
      #         Containers definitions
      containers:
      - name: my-main-container
        (...)
        securityContext:
          runAsNonRoot: true
          runAsUser: 33
        (...)
        volumeMounts:
        - mountPath: /key
          name: key-volume

基本上,知道无法更改机密文件的所有权,initContainer 会将其复制到另一个临时文件夹并更改此新文件的所有权。

很糟糕,但至少它是有效的。

【讨论】:

  • 笨拙但出色
猜你喜欢
  • 1970-01-01
  • 2019-08-04
  • 2022-09-28
  • 2016-02-04
  • 1970-01-01
  • 2021-08-30
  • 1970-01-01
  • 2018-08-29
相关资源
最近更新 更多