目录

Rancher-FileOrCreate的问题

概述

最近在 Rancher 集群上部署一个应用的时候,因为使用了 Hostpath,并且创建了一个文件,按照 FileOrCreate 的模式创建的,常理来说,如果母机上没有这个文件,应该是可以创建出来的,但是在 Rancher 的集群上部署的时候就出了一个比较奇怪的情况,预期的文件,竟然变成了文件夹,一开始以为是参数有问题,反复看了几遍官方文档,感觉还是没啥问题。于是检索一下相关的 issue,果然发现了 HostPath volume type: FileOrCreate creates a directory not a file in RKE provisioned clusters

问题研究

这个 issue 快一年了,还是 Open,Rancher 团队和社区也没太关心,这个可能跟这种 Hostpath 使用的场景比较少有关。因为以前使用过,但从来没有发现过类似的问题,仔细考虑了一下,可能跟以前管理的集群都是物理机/VM 部署的 kubelet,这个可能会跟 Rancher 是以 Docker 方式来运行 kubelet 有关。

Bind mounts may be stored anywhere on the host system. They may even be important system files or directories. Non-Docker processes on the Docker host or a Docker container can modify them at any time.

下面是容器化的 kubelet 的 docker inspect 的结果,从结果上看,猜测是 mount 参数的一些问题, 因为 Rancher RKE 是通过调用 Docker Engine 的 /containers/create 接口来创建容器化的 kubelet 的,所以如果要修改这个问题,可能还需要仔细看下容器创建的时候,相关的参数应该怎么传递,按照 Docker 的文档看,这个接口在创建容器的时候可能是使用了 -v 这个选项来挂载目录。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
"Binds": [
    "/etc/kubernetes:/etc/kubernetes:z",
    "/etc/cni:/etc/cni:rw,z",
    "/opt/cni:/opt/cni:rw,z",
    "/var/lib/cni:/var/lib/cni:z",
    "/var/lib/calico:/var/lib/calico:z",
    "/etc/resolv.conf:/etc/resolv.conf",
    "/sys:/sys:rprivate",
    "/var/lib/docker:/var/lib/docker:rw,rslave,z",
    "/var/lib/kubelet:/var/lib/kubelet:shared,z",
    "/var/lib/rancher:/var/lib/rancher:shared,z",
    "/var/run:/var/run:rw,rprivate",
    "/run:/run:rprivate",
    "/etc/ceph:/etc/ceph",
    "/dev:/host/dev:rprivate",
    "/var/log/containers:/var/log/containers:z",
    "/var/log/pods:/var/log/pods:z",
    "/usr:/host/usr:ro",
    "/etc:/host/etc:ro"
],

暂时没有时间深入去看,所以如果只是想简单解决的话,可以手动在母机上创建需要的文件。

参考资料

  1. HostPath volume type: FileOrCreate creates a directory not a file in RKE provisioned clusters
警告
本文最后更新于 2022年2月19日,文中内容可能已过时,请谨慎参考。