Kubernetes配置映射符号链接(..data/):有没有避免它们的方法?

34

我注意到当我创建和挂载一个包含一些文本文件的配置映射时,容器会将这些文件视为符号链接指向../data/myfile.txt

例如,如果我的配置映射名称为tc-configs,其中包含2个名为stripe1.xml和stripe2.xml的xml文件,如果我将此配置映射挂载到容器中的/configs目录中,则在我的容器中将有:

bash-4.4# ls -al /configs/
total 12
drwxrwxrwx    3 root     root          4096 Jun  4 14:47 .
drwxr-xr-x    1 root     root          4096 Jun  4 14:47 ..
drwxr-xr-x    2 root     root          4096 Jun  4 14:47 ..2018_06_04_14_47_03.291041453
lrwxrwxrwx    1 root     root            31 Jun  4 14:47 ..data -> ..2018_06_04_14_47_03.291041453
lrwxrwxrwx    1 root     root            18 Jun  4 14:47 stripe1.xml -> ..data/stripe1.xml
lrwxrwxrwx    1 root     root            18 Jun  4 14:47 stripe2.xml -> ..data/stripe2.xml

我猜 Kubernetes 需要这些符号链接和 ../data 和 ..timestamp/ 文件夹,但我知道有些应用程序如果看到非预期的文件或文件夹可能会启动失败。

有没有方法告诉 Kubernetes 不要生成所有这些符号链接,直接挂载文件?


我在Grafana容器中遇到了同样的问题,想将某些东西挂载到插件子文件夹中。这会导致Grafana无法加载适当的插件,并显示错误消息“Could not scan dir "/var/lib/grafana/plugins" error: lstat ..2020_10_02_06_45_20.158884790: no such file or directory"。不幸的是,subPath属性的解决方法对我来说不可行,因为我需要configmap mount的自动更新功能...我想暂时没有其他选择,只能重启pod并且不使用任何自动更新机制。 - Tobias
2个回答

23

我认为这个解决方案是令人满意的:在 mountPath 中指定确切的文件路径,将消除对 ..data 和 ..2018_06_04_19_31_41.860238952 符号链接的依赖。

因此,如果我应用这样一个清单:

apiVersion: v1
kind: Pod
metadata:
  name: my-lamp-site
spec:
    containers:
    - name: php
      image: php:7.0-apache
      volumeMounts:
      - mountPath: /var/www/html/users.xml
        name: site-data
        subPath: users.xml
    volumes:
    - name: site-data
      configMap:
        name: users

---

apiVersion: v1
kind: ConfigMap
metadata:
  name: users
data:
  users.xml: |
      <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <users>
      </users>

显然,我在明确使用子路径,而它们不是来自ConfigMaps的“自动更新魔法”的一部分,因此我将不再看到任何符号链接:

$ kubectl exec  my-lamp-site -c php -- ls -al /var/www/html
total 12
drwxr-xr-x 1 www-data www-data 4096 Jun  4 19:18 .
drwxr-xr-x 1 root     root     4096 Jun  4 17:58 ..
-rw-r--r-- 1 root     root       73 Jun  4 19:18 users.xml

一定要小心不要忘记subPath,否则users.xml将成为一个目录!

回到我的初始清单:

spec:
    containers:
    - name: php
      image: php:7.0-apache
      volumeMounts:
      - mountPath: /var/www/html
        name: site-data
    volumes:
    - name: site-data
      configMap:
        name: users

我会看到那些符号链接回来:

$ kubectl exec  my-lamp-site -c php -- ls -al /var/www/html
total 12
drwxrwxrwx 3 root root 4096 Jun  4 19:31 .
drwxr-xr-x 3 root root 4096 Jun  4 17:58 ..
drwxr-xr-x 2 root root 4096 Jun  4 19:31 ..2018_06_04_19_31_41.860238952
lrwxrwxrwx 1 root root   31 Jun  4 19:31 ..data -> ..2018_06_04_19_31_41.860238952
lrwxrwxrwx 1 root root   16 Jun  4 19:31 users.xml -> ..data/users.xml

非常感谢psycotica0K8s Canada slack上为我指明了方向,让我了解到subpath(它们在configmap文档中被快速提到)的使用。


3
但是如果您的configMap包含多个文件,这些文件应该像“users.xml”一样被包含,该怎么办? - Ildar Zaripov
如果configMap包含多个文件,则该解决方案将无法工作。也就是说,将主changelog文件明确挂载为具有子路径的文件时,将其定义为目录。 - m19v

0

很抱歉,我不确定您是否可以告诉Kubernetes不生成这些符号链接,尽管我认为这是一种本地行为。

如果拥有这些文件和链接是一个问题,我能想到的解决方法是在一个文件夹上挂载configmap,并在初始化容器时将文件复制到另一个文件夹中:

  initContainers:
    - name: copy-config
      image: busybox
      command: ['sh', '-c', 'cp /configmap/* /configs']
      volumeMounts:
        - name: configmap
          mountPath: /configmap
        - name: config
          mountPath: /configs

但是您需要声明两个卷,一个用于configMap(configmap),另一个用于最终目录(config):

  volumes:
    - name: config
      emptyDir: {}
    - name: configmap
      configMap:
        name: myconfigmap

根据您的需要,显然可以更改配置卷的音量类型。


谢谢@iomv:这可能是一个解决方法,没错 - 尽管我希望有一种“更清晰”的解决方案来完成这个! - Anthony Dahanne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接