更改计划卷上装载的kubernetes机密文件的默认文件所有者和组所有者
我是K8S的新手。我有一个yaml文件,它生成安装在投影卷上的kubernetes秘密。执行时,我发现机密文件(包含机密)显示“root”为文件所有者和组所有者。我想将文件所有者和组所有者更改为相同的特定用户(例如450) 我曾尝试使用init容器中的“chown”(尝试过,但失败),但出现了“只读文件系统”错误,无法修改文件和组所有者。 我不想在securitycontext下使用“fsGroup”。我观察到,当使用fsGroup时,“items”下的“mode:”选项的行为不可预测 是否有任何方法可以修改通过投影卷装载的kubernetes机密文件的默认文件和组所有者 我在下面提供示例代码。假设我想在下面的示例中更改“password”文件(在“mysecret2”下)的文件和组所有者。如何实现更改计划卷上装载的kubernetes机密文件的默认文件所有者和组所有者,kubernetes,mounted-volumes,kubernetes-secrets,Kubernetes,Mounted Volumes,Kubernetes Secrets,我是K8S的新手。我有一个yaml文件,它生成安装在投影卷上的kubernetes秘密。执行时,我发现机密文件(包含机密)显示“root”为文件所有者和组所有者。我想将文件所有者和组所有者更改为相同的特定用户(例如450) 我曾尝试使用init容器中的“chown”(尝试过,但失败),但出现了“只读文件系统”错误,无法修改文件和组所有者。 我不想在securitycontext下使用“fsGroup”。我观察到,当使用fsGroup时,“items”下的“mode:”选项的行为不可预测 是否有任
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
据我所知,没有办法更改所有者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/
....
正如Alexey所说,在github.com/kubernetes/kubernetes/issues/81089完成之前,目前不可能这样做 他的解决方案工作得很好,除非您设置了
securitycontaint.runAsNonRoot
set,在这种情况下,容器将无权获取机密
就我而言,我必须做以下几点:
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会将其复制到另一个临时文件夹并更改此新文件的所有权
总的来说,但至少它可以工作。很惊讶没有办法设置所有者,而且默认情况下任何人都可以阅读这些秘密。感谢您的解决方案。事实上,做这样的事真是太差劲了。此功能仍在等待中:此解决方案并非在所有情况下都能可靠工作。特别是,如果机密在任何时候都有可能更改,则您将复制原始版本,并且永远不会看到任何更新。使用
fsGroup
和defaultMode
不会遇到这个问题。虽然很老练,但很聪明