【问题标题】:minikube shared volume not shows files after sometimeminikube 共享卷在一段时间后不显示文件
【发布时间】:2020-08-17 13:07:23
【问题描述】:

我必须将本地 .ssh 目录内容共享到 pod。我搜索帽子并从其中一个帖子中得到答案,以 --mount-string 开头。

$ minikube start --mount-string="$HOME/.ssh/:/ssh-directory" --mount
????  minikube v1.9.2 on Darwin 10.14.6
✨  Using the docker driver based on existing profile
????  Starting control plane node m01 in cluster minikube
????  Pulling base image ...
????  Restarting existing docker container for "minikube" ...
????  Preparing Kubernetes v1.18.0 on Docker 19.03.2 ...
    ▪ kubeadm.pod-network-cidr=10.244.0.0/16
E0426 23:44:18.447396   80170 kubeadm.go:331] Overriding stale ClientConfig host https://127.0.0.1:32810 with https://127.0.0.1:32813
????  Creating mount /Users/myhome/.ssh/:/ssh-directory ...
????  Enabling addons: default-storageclass, storage-provisioner
????  Done! kubectl is now configured to use "minikube"

❗  /usr/local/bin/kubectl is v1.15.5, which may be incompatible with Kubernetes v1.18.0.
????  You can also use 'minikube kubectl -- get pods' to invoke a matching version

当我检查给定 Minikube 的 docker 时,它会返回

$ docker ps
CONTAINER ID        IMAGE                                COMMAND                  CREATED             STATUS              PORTS                                                                           NAMES
5ad64f642b63        gcr.io/k8s-minikube/kicbase:v0.0.8   "/usr/local/bin/entr…"   3 weeks ago         Up 45 seconds       127.0.0.1:32815->22/tcp, 127.0.0.1:32814->2376/tcp, 127.0.0.1:32813->8443/tcp   minikube

并检查.ssh目录内容是否存在。

$ docker exec -it 5ad64f642b63 ls /ssh-directory
id_rsa  id_rsa.pub  known_hosts

我有部署 yml 为

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-deployment
  labels:
    stack: api
    app: api-web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: api-web
  template:
    metadata:
      labels:
        app: api-web
    spec:
      containers:
        - name: api-web-pod
          image: tiangolo/uwsgi-nginx-flask 
          ports:
            - name: api-web-port
              containerPort: 80
          envFrom:
            - secretRef:
                name: api-secrets
          volumeMounts:
            - name: ssh-directory
              mountPath: /app/.ssh
      volumes:
        - name: ssh-directory
          hostPath:
            path: /ssh-directory/
            type: Directory

运行时,/ssh-directory 出现错误。

$ kubectl describe pod/api-deployment-f65db9c6c-cwtvt
Name:           api-deployment-f65db9c6c-cwtvt
Namespace:      default
Priority:       0
Node:           minikube/172.17.0.2
Start Time:     Sat, 02 May 2020 23:07:51 -0500
Labels:         app=api-web
                pod-template-hash=f65db9c6c
Annotations:    <none>
Status:         Pending
IP:
Controlled By:  ReplicaSet/api-deployment-f65db9c6c
Containers:
  api-web-pod:
    Container ID:
    Image:          tiangolo/uwsgi-nginx-flask
    Image ID:
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Waiting
      Reason:       ContainerCreating
    Ready:          False
    Restart Count:  0
    Environment Variables from:
      api-secrets  Secret  Optional: false
    Environment:      <none>
    Mounts:
      /app/.ssh from ssh-directory (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-9shz5 (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             False
  ContainersReady   False
  PodScheduled      True
Volumes:
  ssh-directory:
    Type:          HostPath (bare host directory volume)
    Path:          /ssh-directory/
    HostPathType:  Directory
  default-token-9shz5:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-9shz5
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type     Reason       Age                 From               Message
  ----     ------       ----                ----               -------
  Normal   Scheduled    <unknown>           default-scheduler  Successfully assigned default/api-deployment-f65db9c6c-cwtvt to minikube
  Warning  FailedMount  11m                 kubelet, minikube  Unable to attach or mount volumes: unmounted volumes=[ssh-directory], unattached volumes=[default-token-9shz5 ssh-directory]: timed out waiting for the condition
  Warning  FailedMount  2m13s (x4 over 9m)  kubelet, minikube  Unable to attach or mount volumes: unmounted volumes=[ssh-directory], unattached volumes=[ssh-directory default-token-9shz5]: timed out waiting for the condition
  Warning  FailedMount  62s (x14 over 13m)  kubelet, minikube  MountVolume.SetUp failed for volume "ssh-directory" : hostPath type check failed: /ssh-directory/ is not a directory

当我在docker中检查/ssh-directory的内容时。

它给出了 IO 错误。

$ docker exec -it 5ad64f642b63 ls /ssh-directory
ls: cannot access '/ssh-directory': Input/output error

我知道 Minikube 有默认的挂载点。正如https://minikube.sigs.k8s.io/docs/handbook/mount/ 中提到的,

+------------+----------+---------------+----------------+
| Driver     |    OS    | HostFolder    | VM             |
+------------+----------+---------------+----------------+
| VirtualBox | Linux    | /home         |/hosthome       |
+------------+----------+---------------+----------------+
| VirtualBox | macOS    | /Users        |/Users          |
+------------+----------+---------------+----------------+
| VirtualBox | Windows  |C://Users      | /c/Users       |
+------------+----------+---------------+----------------+
|VMware Fusio|  macOS   |/Users         |/Users          |
+------------+----------+---------------+----------------+
| KVM        | Linux    | Unsupported.  |                |
+------------+----------+---------------+----------------+
| HyperKit   | Linux    | Unsupported   |(see NFS mounts)|  
+------------+----------+---------------+----------------+

但我将 minikube 安装为 brew install minikube 并将其设置为 driverdocker

$ cat ~/.minikube/config/config.json
{
    "driver": "docker"
}

在挂载点没有docker驱动的映射。

最初,这个目录有文件,但不知何故,当我尝试创建 pod 时,它被删除或出现问题。

【问题讨论】:

  • 您是否尝试直接在 yml 文件中引用您的主机?在您的情况下,此“hosthome/.ssh”有一个特殊的键名,请在此处查看驱动程序部分(页面底部):minikube.sigs.k8s.io/docs/handbook/mount
  • 如果你这样做,你就不必在 minikube start 中挂载--mount-string="$HOME/.ssh/:/ssh-directory"
  • 一般来说你不能用 Kubernetes 挂载这样的文件。 (对于 Minikube 或 Kind 之类的桌面安装可能是可能的,但对于更典型的集群安装则不是。)您可以将此密钥放入 Secret 中,而不依赖于文件系统内容吗?
  • @yAzou 我有 MacOS minikube destop。
  • @DavidMaze 我按照stackoverflow.com/questions/48534980/… 中的答案共享本地文件夹,

标签: docker kubernetes minikube


【解决方案1】:

在 ubuntu 上复制此内容时,我遇到了确切的问题。

该目录确实看起来像已安装但缺少文件,这使我认为这是使用 docker 驱动程序安装目录的一般问题。

在 github 上有关于相同问题 (mount directory empty) 和开放功能请求 to mount host volumes into docker driver 的未解决问题。

检查 minikube 容器没有显示该已安装卷的记录,并确认 github 请求中提到的信息,即目前与主机共享的唯一卷是默认安装的卷(即 /var/lib/docker/volumes/minikube/_data 安装到 minikube 的 /var目录)。

$ docker inspect minikube
"Mounts": [ 
  { 
    "Type": "volume", 
    "Name": "minikube", 
    "Source": "/var/lib/docker/volumes/minikube/_data", 
    "Destination": "/var", 
    "Driver": "local", 
    "Mode": "z", 
    "RW": true, 
    "Propagation": ""
  }

作为解决方法,您可以使用以下命令将 .ssh 目录复制到正在运行的 minikube docker 容器中:

docker cp  $HOME/.ssh minikube:<DESIRED_DIRECTORY> 

然后将这个想要的目录挂载到 pod 中。

【讨论】:

  • 谢谢,我可能更喜欢秘密中的 ssh 密钥。这样,就没有手动步骤。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-21
  • 1970-01-01
  • 1970-01-01
  • 2017-10-14
  • 1970-01-01
  • 2021-09-24
  • 2023-03-29
相关资源
最近更新 更多