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

kwvwclae  于 5个月前  发布在  Kubernetes
关注(0)|答案(3)|浏览(67)

我无法在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

3b6akqbq

3b6akqbq1#

当您使用默认的docker驱动程序启动minikube时,您正在计算机内创建Docker VM

背景

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

user@nameofyourhost:~$

字符串
但如果你将ssh到你的Minikube VM终端看起来像下面:

docker@minikube:~$


在HostPath中,您可以获得以下信息:
hostPath卷将文件或目录从主机节点的文件系统挂载到Pod中。
minikube中,当您使用hostPath时,节点被认为不是您的machine,而是在minikube start期间创建的Minikube VM

测试

因为我没有你的文件,我用了nginx。请记住,你应该有适当的权限,你要挂载的目录。我用了tmp,因为在nginx这个目录有完全访问权的人。

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


在VM上创建docker.jar时。

user@nameOfMyVM:~$ pwd
/home/user
user@nameOfMyVM:~$ ls
docker.jar


当您将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 VM中创建此文件时,

$ 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时,您需要记住filesystem不是您的Machine,而是在minikube start期间创建的Minikube VM

iklwldmw

iklwldmw2#

如果您在多节点系统上运行,请确保在pod部署到的node上可以访问hostpath。
我在使用helm chart设置一个主节点和一个工作节点时也遇到了这个非常类似的问题。
Helm将所有Pod部署到worker节点,即使从master节点完成部署,也无法从worker节点访问hostPath。复制并验证worker节点上的hostpath解决了我的错误类型。

1dkrff03

1dkrff033#

如果您验证了Minikube VM(minikube ssh ls -la /home/user)上存在该文件/目录,则您没有像预期的那样在minikube k8s上下文上部署
使用kubectx --current检查您当前使用的上下文。
然后通过kubectx minikubekubectl use-context minikube设置Minikube。

相关问题