Kubernetes ConfigMap 只能由 root 写入

qui*_*tin 4 permissions kubernetes

我用来ConfigMap公开一个 php 文件,该文件旨在跨 pod 共享并可由www-data(Apache) 用户写入。

配置映射表

apiVersion: v1
kind: ConfigMap
metadata:
  name: magento-config
data:
  env.php: |
    <?php
    return array ( ...
Run Code Online (Sandbox Code Playgroud)

部署

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: apache-deployment
spec:
    ...
    spec:
      containers:
        - name: apache
          image: apache:2.4
          ...
          volumeMounts:
          - name: magento-configs
            mountPath: /var/www/html/etc
          imagePullPolicy: Always
      volumes:
        - name: magento-configs
          configMap:
            name: magento-config
Run Code Online (Sandbox Code Playgroud)

root该文件看起来只能写入

root@apache-deployment-79c8548cdc-r6qhs:/# realpath /var/www/html/etc/env.php
/var/www/html/etc/..2018_04_23_16_21_10.435323593/env.php
root@apache-deployment-79c8548cdc-r6qhs:/# ls -l /var/www/html/etc/..2018_04_23_16_21_10.435323593/env.php
-rw-r--r-- 1 root root 909 Apr 23 16:21
Run Code Online (Sandbox Code Playgroud)

有什么办法可以改变这个吗?我注意到VolumeMount有一个readOnly属性默认为false. 事实上,该卷是可写的,但只能通过root.

我尝试在 Apache 中设置APACHE_RUN_USERroot,但它要求我重新编译(当前使用 apt 构建)哈哈,这感觉像是错误的方向。ConfigMap如果可能的话,我想弄清楚如何正确使用。

小智 6

更新:

因此,您必须使用 Kubernetes < 1.13 之前的版本,该版本仍然允许该数据卷行为。我会告诉你,在 1.13+ 及更高版本中,你将无法进行这样的读写挂载。然而,有一个解决方法,它可能是“Kubernetes”的做事方式(尽管我很难理解为什么它更好)。

解决办法:

在您的 POD/部署中,创建一个安装两个卷的 init 容器。第一个卷是您的 configmap(file),第二个卷是一个 emptyDir 容器。我们将把第一个 (configmap) 卷视为您的源,而将后者视为您的目的地。然后,您在新的初始化容器中所需要做的就是将源卷的内容复制到目标卷。

然后在你的普通应用程序容器部分,从上面挂载目标容器,然后你就拥有完整的读/写能力,而不必处理 Kubernetes 的 API 更改。这也应该能够承受他们计划在未来进行的大部分 API 更改。