Kubernetes卷装载设置类型检查失败

Kubernetes卷装载设置类型检查失败,kubernetes,Kubernetes,我无法在kubernetes中部署应用程序,这是部署yaml apiVersion: apps/v1 kind: Deployment metadata: name: test labels: app: test spec: replicas: 1 selector: matchLabels: app: test template: metadata: labels: app: test spec:

我无法在kubernetes中部署应用程序,这是部署yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test
  labels:
    app: test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test
  template:
    metadata:
      labels:
        app: test
    spec:
      containers:
      - name: test
        image: openjdk:14
        ports:
        - containerPort: 8080
        volumeMounts: 
        - name: testing
          mountPath: "/usr/src/myapp/docker.jar"
        workingDir: "/usr/src/myapp"
        command: ["java"]
        args: ["-jar", "docker.jar"]        
      volumes: 
      - hostPath: 
          path: /home/user/docker.jar
          type: File
        name: testing
这是我收到的错误,我可以验证该文件是否存在以及是否在该文件夹中。 我尝试删除该类型,但它只上载一个空目录,它似乎无法识别该文件是否存在

MountVolume.SetUp failed for volume "testing" : hostPath type check failed: /home/user/docker.jar is not a file
当您使用默认的
docker
驱动程序启动时,您正在您的机器内创建
docker-VM

背景 当您使用VM时,您的终端看起来像:

user@nameofyourhost:~$
但是如果您将
ssh
连接到您的
Minikube VM
终端,则如下所示:

docker@minikube:~$ 
在这方面,您有以下信息:

hostPath卷将文件或目录从主机节点的文件系统装载到Pod中

minikube
中,当您使用
hostPath
时,节点不是您的
机器
,而是在
minikube启动期间创建的
minikube虚拟机

测验 因为我没有你的文件,所以我使用了
nginx
。请记住,您应该对要装载的目录具有适当的权限。我在
nginx
中使用了
tmp
,每个人都可以完全访问该目录

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test
  labels:
    app: test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test
  template:
    metadata:
      labels:
        app: test
    spec:
      containers:
      - name: test
        image: nginx
        ports:
        - containerPort: 8080
        volumeMounts:
        - name: testing
          mountPath: "/tmp/docker.jar"   #this is path to the file
      volumes:
      - hostPath:
          path: <path to docker.jar file> #should be on Minikube VM
          type: File
        name: testing
当您在
hostpath.path
中切换到
/home/user/docker.jar
时,它将返回警告

Warning  FailedMount  4s (x4 over 7s)  kubelet            MountVolume.SetUp failed for volume "testing" : hostPath type check failed: /home/sekreta/docker.jar is not a file`
因为Kubernetes没有找到这个文件

但是当您将在
Minikube虚拟机中创建此文件时

$ minikube ssh
docker@minikube:~$ pwd
/home/docker
docker@minikube:~$ ls
docker.jar
并将创建部署
hostPath.path
更改为
/home/docker/docker.jar
pod

$ kubectl get po
NAME                   READY   STATUS    RESTARTS   AGE
test-c68d959c6-kb275   1/1     Running   0          13s
文件可以在YAML中设置的目录中找到,即
tmp

$ kubectl exec -ti test-c68d959c6-kb275 -- bin/bash
root@test-c68d959c6-kb275:/# cd /tmp
root@test-c68d959c6-kb275:/tmp# ls
docker.jar
结论
当您在
Minikube
上使用
HostPath
时,您需要记住
文件系统
不是您的
机器
,而是
Minikube虚拟机
,它是在
Minikube启动
期间创建的,如果您在多节点系统上运行,确保主机路径在部署POD的节点上可访问

在使用helm图表设置一个主节点和一个工作节点时,我也遇到了类似的问题

Helm将所有POD部署到工作者节点,并且即使从主节点部署,也无法从工作者节点访问主机路径。
复制并验证工作节点上已解决的hostpath是否为我的错误类型。

如果Kubernetes找不到此文件,您可能会遇到此问题。您使用的是minikube还是某些云环境?是的,我使用的是MinikubeId。您是在您的虚拟机中创建此文件,还是通过ssh连接到您的minikube虚拟机并安装在那里?不在虚拟机中,我现在非常感谢您的帮助!!!!
$ kubectl exec -ti test-c68d959c6-kb275 -- bin/bash
root@test-c68d959c6-kb275:/# cd /tmp
root@test-c68d959c6-kb275:/tmp# ls
docker.jar