Kubernetes配置映射符号链接(…data/):有没有办法避免它们?
我注意到,当我创建并挂载包含一些文本文件的配置映射时,容器会将这些文件视为指向Kubernetes配置映射符号链接(…data/):有没有办法避免它们?,kubernetes,configmap,Kubernetes,Configmap,我注意到,当我创建并挂载包含一些文本文件的配置映射时,容器会将这些文件视为指向。/data/myfile.txt的符号链接 例如,如果我的配置映射名为tc configs,并且包含两个名为stripe1.xml和stripe2.xml的xml文件,那么如果我将此配置映射装载到容器中的/configs,则在容器中,我将具有: bash-4.4# ls -al /configs/ total 12 drwxrwxrwx 3 root root 4096 Jun 4
。/data/myfile.txt
的符号链接
例如,如果我的配置映射名为tc configs,并且包含两个名为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不要生成所有这些符号链接并直接挂载文件?我不知道您是否可以告诉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):
显然,您可以随意更改配置卷的卷类型。我认为这个解决方案是令人满意的:在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>
小心不要忘记子路径
,否则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
非常感谢on让我走上了正确的道路(他们很快在中被提到)感谢@iomv:这可能是一个解决办法,没错-尽管我希望有一个“更干净”的解决方案来做到这一点!我在Grafana容器中也有同样的问题,我想将一些东西装载到插件子文件夹中。这导致Grafana无法加载相应的插件,并显示错误消息
无法扫描目录\“/var/lib/Grafana/plugins\”错误:lstat..2020\u 10\u 02\u 06\u 45\u 20.1588884790:没有此类文件或目录“
。不幸的是,子路径
属性的解决方案对我来说不是解决方案,因为我需要configmap装载的自动更新功能。。。我想目前除了重新启动pod和不使用任何自动更新机制外,我没有其他选择。但是,如果您的configMap包含多个文件,这些文件应该完全作为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