简体   繁体   中英

Are you trying to mount a directory onto a file (or vice-versa) with kuberneters/configMap?

I followed this post Kubernetes configMap - only one file to pass a config file to a deployment, but got an error. Why?

The config file config-prom-prometheus.yml :

scrape_configs:
- job_name: job-leo-prometheus
  kubernetes_sd_configs:
  - role: endpoints

The .yaml file prom-prometheus.yaml :

apiVersion: apps/v1
kind: Deployment
metadata:
  name: prom-prometheus-deployment
spec:
  selector:
    matchLabels:
      app: prom-prometheus
  replicas: 1
  template:
    metadata:
      labels:
        app: prom-prometheus
    spec:
      containers:
      - name: prom-prometheus
        image: 127.0.0.1:30400/prom/prometheus
        ports:
        - name: port9090
          containerPort: 9090
        volumeMounts:
        - name: volume-prometheus
          mountPath: /etc/prometheus/prometheus.yml
          subPath: prometheus.yml
      volumes:
      - name: volume-prometheus
        configMap:
          name: config-prom

---
apiVersion: v1
kind: Service
metadata:
  name: prom-prometheus
spec:
  type: NodePort
  ports:
  - name: port9090
    protocol: TCP
    port: 9090
    targetPort: 9090
    nodePort: 30090
  selector:
    app: prom-prometheus

Commands:

kubectl create configmap config-prom --from-file=config-prom-prometheus.yml
kubectl -f prom-prometheus.yaml apply

Results:

Events:
  Type     Reason                 Age               From               Message
  ----     ------                 ----              ----               -------
  Normal   Scheduled              17s               default-scheduler  Successfully assigned prom-prometheus-deployment-66887dcdbf-bfqd4 to minikube
  Normal   SuccessfulMountVolume  17s               kubelet, minikube  MountVolume.SetUp succeeded for volume "default-token-ml6w5"
  Normal   SuccessfulMountVolume  17s               kubelet, minikube  MountVolume.SetUp succeeded for volume "volume-prometheus"
  Warning  Failed                 9s                kubelet, minikube  Error: failed to start container "prom-prometheus": Error response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused "process_linux.go:402: container init caused \"rootfs_linux.go:58: mounting \\\"/var/lib/kubelet/pods/ec99da92-e994-11e8-a578-08002742f2a3/volume-subpaths/volume-prometheus/prom-prometheus/0\\\" to rootfs \\\"/var/lib/docker/overlay2/12c7da1c07c55fe2ec5dff61e5c457fa8aeaa32d47232c28a1d7e127c4f81bf0/merged\\\" at \\\"/var/lib/docker/overlay2/12c7da1c07c55fe2ec5dff61e5c457fa8aeaa32d47232c28a1d7e127c4f81bf0/merged/etc/prometheus/prometheus.yml\\\" caused \\\"not a directory\\\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
  Normal   Pulling                7s (x2 over 13s)  kubelet, minikube  pulling image "127.0.0.1:30400/prom/prometheus"
  Normal   Pulled                 7s (x2 over 13s)  kubelet, minikube  Successfully pulled image "127.0.0.1:30400/prom/prometheus"
  Normal   Created                6s (x2 over 10s)  kubelet, minikube  Created container
  Warning  Failed                 4s                kubelet, minikube  Error: failed to start container "prom-prometheus": Error response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused "process_linux.go:402: container init caused \"rootfs_linux.go:58: mounting \\\"/var/lib/kubelet/pods/ec99da92-e994-11e8-a578-08002742f2a3/volume-subpaths/volume-prometheus/prom-prometheus/0\\\" to rootfs \\\"/var/lib/docker/overlay2/7b07728ae4439e4d479386eab6b042948e2cb586c54171941f24d03352a7c8b4/merged\\\" at \\\"/var/lib/docker/overlay2/7b07728ae4439e4d479386eab6b042948e2cb586c54171941f24d03352a7c8b4/merged/etc/prometheus/prometheus.yml\\\" caused \\\"not a directory\\\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type

This is not well documented but as per my experience name of configmap yaml (config-prom-prometheus.yml in your case) should be the same as mountPath and subPath in Deployment .

If you use subPath: prometheus.yml - rename config-prom-prometheus.yml to prometheus.yml and try again.

This is probably slightly rewording the accepted answer, but one thing that confused me was that the mount path expected full path of to the target file.

subPath is the key in the volume (eg config map) for the source.

mountPath is target full path for the file.

For some reason my brain was thinking mountPath was the target directory and the subPath would infer the target file name. All I had to do was add the filename at the end of the mountPath .

For example:

Bad:

- name: config-volume
  mountPath: "/opt/config/path/"
  subPath: "config-file.json"

Good:

- name: config-volume
  mountPath: "/opt/config/path/config-file.json"
  subPath: "config-file.json"

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM