Kubernetes 不允许将文件挂载到容器

Posted

技术标签:

【中文标题】Kubernetes 不允许将文件挂载到容器【英文标题】:Kubernetes doesn't allow to mount file to container 【发布时间】:2018-06-02 21:25:26 【问题描述】:

尝试在 kubernetes 集群中部署应用程序时遇到以下错误。 kubernetes 好像不允许将文件挂载到容器,你知道可能的原因吗?

部署配置文件

apiVersion:扩展/v1beta1 种类:部署 元数据: 名称:模型加载器服务 命名空间:“ .Values.nsPrefix -aai” 规格: 选择器: 匹配标签: 应用程序:模型加载器服务 模板: 元数据: 标签: 应用程序:模型加载器服务 名称:模型加载器服务 规格: 容器: - 名称:模型加载器服务 图片:“ .Values.image.modelLoaderImage : .Values.image.modelLoaderVersion ” imagePullPolicy: .Values.pullPolicy 环境: - 名称:CONFIG_HOME 值:/opt/app/model-loader/config/ 卷装: - 挂载路径:/etc/localtime 名称:当地时间 只读:真 - 安装路径:/opt/app/model-loader/config/ 名称:aai-model-loader-config - 挂载路径:/var/log/onap 名称:aai-model-loader-logs - 安装路径:/opt/app/model-loader/bundleconfig/etc/logback.xml 名称:aai-model-loader-log-conf 子路径:logback.xml 端口: - 容器端口:8080 - 容器端口:8443 - 名称:filebeat-onap-aai-model-loader 图片: .Values.image.filebeat imagePullPolicy: .Values.pullPolicy 卷装: - 挂载路径:/usr/share/filebeat/filebeat.yml 名称:filebeat-conf - 挂载路径:/var/log/onap 名称:aai-model-loader-logs - 挂载路径:/usr/share/filebeat/data 名称:aai-model-loader-filebeat 卷: - 名称:当地时间 主机路径: 路径:/etc/localtime - 名称:aai-model-loader-config 主机路径: 路径:“/dockerdata-nfs/ .Values.nsPrefix /aai/model-loader/appconfig/” - 名称:filebeat-conf 主机路径: 路径:/dockerdata-nfs/ .Values.nsPrefix /log/filebeat/logback/filebeat.yml

本期详细信息:

message: 'invalid header field value "oci runtime error: container_linux.go:247:

        starting container process caused \"process_linux.go:359: container init

        caused \\\"rootfs_linux.go:53: mounting \\\\\\\"/dockerdata-nfs/onap/log/filebeat/logback/filebeat.yml\\\\\\\"

        to rootfs \\\\\\\"/var/lib/docker/aufs/mnt/7cd32a29938e9f70a727723f550474cb5b41c0966f45ad0c323360779f08cf5c\\\\\\\"

        at \\\\\\\"/var/lib/docker/aufs/mnt/7cd32a29938e9f70a727723f550474cb5b41c0966f45ad0c323360779f08cf5c/usr/share/filebeat/filebeat.yml\\\\\\\"

        caused \\\\\\\"not a directory\\\\\\\"\\\"\"\n"'

....

$ docker version
Client:
 Version:      1.12.6
 API version:  1.24
 Go version:   go1.6.4
 Git commit:   78d1802
 Built:        Tue Jan 10 20:38:45 2017
 OS/Arch:      linux/amd64

Server:
 Version:      1.12.6
 API version:  1.24
 Go version:   go1.6.4
 Git commit:   78d1802
 Built:        Tue Jan 10 20:38:45 2017
 OS/Arch:      linux/amd64

$ kubectl version
Client Version: version.InfoMajor:"1", Minor:"7", GitVersion:"v1.7.4", GitCommit:"793658f2d7ca7f064d2bdf606519f9fe1229c381", GitTreeState:"clean", BuildDate:"2017-08-17T08:48:23Z", GoVersion:"go1.8.3", Compiler:"gc", Platform:"linux/amd64"
Server Version: version.InfoMajor:"1", Minor:"8+", GitVersion:"v1.8.3-rancher3", GitCommit:"772c4c54e1f4ae7fc6f63a8e1ecd9fe616268e16", GitTreeState:"clean", BuildDate:"2017-11-27T19:51:43Z", GoVersion:"go1.8.3", Compiler:"gc", Platform:"linux/amd64"

【问题讨论】:

【参考方案1】:

caused "not a directory" 有点不言自明。您使用的确切 volume 和 volumeMount 定义是什么?你在声明中使用subPath 吗?

编辑:改变

- name: filebeat-conf
  hostPath:
    path: /dockerdata-nfs/ .Values.nsPrefix /log/filebeat/logback/filebeat.yml

- name: filebeat-conf
  hostPath:
    path: /dockerdata-nfs/ .Values.nsPrefix /log/filebeat/logback/

并将subPath: filebeat.yml 添加到volumeMount

【讨论】:

在帖子中添加了部署配置。 你为什么不使用配置映射?【参考方案2】:

SELinux 也可能是这里的罪魁祸首。登录节点,执行sestatus。如果该策略被禁用,您将看到输出为 SELINUX=disabled 否则它将类似于以下内容:

SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             mcs
Current mode:                   permissive
Mode from config file:          permissive
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      31

第一个选项: 您可以通过编辑/etc/selinux/config 文件来禁用selinux,并将SELINUX=permissive 更新为SELINUX=disabled。完成后,重新启动机器并部署以查看是否已修复。但是,这不是推荐的方式,可以看作是一种临时解决方法。

第二个选项: 登录到节点并执行ps -efZ | grep kubelet,这将给出类似的内容。

system_u:system_r:kernel_t:s0   root      1592     1  2 May23 ?        09:58:18 /usr/local/bin/kubelet --anonymous-auth=false

现在,从此输出中捕获字符串 system_u:system_r:kernel_t:s0,可以在部署中将其更改为安全上下文,如下所示。

securityContext:
    seLinuxOptions:
      user: system_u
      role: system_r
      type: spc_t
      level: s0

部署您的应用程序并检查日志是否已修复。如果这对您有用或需要任何进一步的帮助,请告诉我。

【讨论】:

【参考方案3】:

这是一个多节点集群吗?如果是这样,则该文件需要存在于所有 Kubernetes 节点上,因为 pod 通常安排在随机可用的主机上。无论如何,ConfigMaps 是向容器提供静态/只读文件的更好方法。

【讨论】:

以上是关于Kubernetes 不允许将文件挂载到容器的主要内容,如果未能解决你的问题,请参考以下文章

如何在 kubernetes 中使用 windows 容器挂载卷?

Kubernetes存储

KUBERNETES05_NFS坏境搭建PVPVC挂载目录ConfigMap挂载文件Secret挂载敏感信息

KUBERNETES05_NFS坏境搭建PVPVC挂载目录ConfigMap挂载文件Secret挂载敏感信息

如何运行多进程Docker容器

hostpath底层原理