Kubernetes向Pod中添加本地文件

19
我正在尝试在 Kubernetes 中构建一个 Pod,使该 Pod 中的文件可以从我的本地系统挂载到 Pod 中,类似于在 docker-compose 文件中挂载卷的方式。
我已经尝试了以下内容,试图将本地文件夹./test和文件挂载到位于/blah/文件夹下的 Pod 中。但是 Kubernetes 正在抱怨:MountVolume.SetUp failed for volume "config-volume" : hostPath type check failed: ./test/ is not a directory 以下是我的 yaml 文件。我是否漏掉了什么?
kind: Service
metadata:
  name: vol-test
  labels:
    app: vol-test
spec:
  type: NodePort
  ports:
    - port: 8200
      nodePort: 30008
  selector:
    app: vol-test

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: vol-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: vol-test
  template:
    metadata:
      labels:
        app: vol-test
    spec:
      containers:
        - name: vol-test
          image: nginx
          imagePullPolicy: "IfNotPresent"
          volumeMounts:
            - name: config-volume
              mountPath: /blah/
          ports:
            - containerPort: 8200
      volumes:
        - name: config-volume
          hostPath:
            path: ./test/
            type: Directory

你是如何部署集群的? - Discombobulate
是的,集群运行良好。 - Colonel Mustard
你期望 path: 相对于哪个目录进行解释?你将如何将源代码复制到集群中的每个节点?(这不是 Kubernetes 模式,出于类似的原因,我会不鼓励它作为 Docker 模式。) - David Maze
我假设 ./test 是相对于我运行 kubectl apply 的目录的。这是一个用于测试的 pod,只会有一个实例。 - Colonel Mustard
5个回答

19

如果您只是想将文件或目录传递给Pod以读取配置值(我从您选择的卷挂载config-volume中推断),并且不需要更新文件/目录,则可以将文件放在ConfigMap中,如下所示:

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-router-config
data:
  nginx.conf: |
    worker_processes 2;
    user nginx;
    events {
        worker_connections  1024;
    }

    http {
        include       mime.types;
        charset       utf-8;
        client_max_body_size 8M;

        server {
            server_name _;
            listen 80 default_server;

            location / {
                proxy_set_header Host $host;
                proxy_set_header X-Forwarded-Host $host;
                proxy_set_header X-Forwarded-Proto https;
                proxy_pass http://drupal:80/ ;
                proxy_redirect default;
            }

            location /api/ {
                proxy_pass http://api-gateway:8080/ ;
                proxy_redirect default;
            }
        }
    }  

或者您可以将文件内容从运行 kubectl 命令的位置导入并执行(假设文件名为 nginx.conf):

或者你可以在运行kubectl命令的位置导入文件内容并执行(假设文件名为nginx.conf):

kubectl create configmap nginx-router-config --from-file=nginx.conf

然后,您可以通过在部署规范中添加 volumesvolumeMount 来挂载文件:

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: nginx-router
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
        volumeMounts:
        - name: nginx-router-config
          mountPath: /etc/nginx/nginx.conf
          subPath: nginx.conf
      volumes:
        - name: nginx-router-config
          configMap:
            name: nginx-router-config
            items:
              - key: nginx.conf
                path: nginx.conf

如果您实际上想要对文件进行读写访问,则可以像其他答案建议的那样使用PersistentVolume和PersistentVolumeClaim,尽管如果您有多个工作节点,我不建议使用hostPath


1
volumeMounts/subPath:就是我一直在寻找的技巧,可以让我获取单个文件而不是整个目录。谢谢! - undefined

5

如果您想从主机添加本地文件,则以下内容将起作用。

apiVersion: v1
kind: Pod
metadata:
  name: test-webserver
spec:
  containers:
  - name: test-webserver
    image: k8s.gcr.io/test-webserver:latest
    volumeMounts:
    - mountPath: /var/local/aaa/1.txt
      name: myfile
      readOnly: true
  volumes:
  - name: myfile
    hostPath:
      path: /var/local/aaa/1.txt
      type: File

3

你可以这样做

kind: PersistentVolume
apiVersion: v1
metadata:
  name: config-volume-pv
  labels:
    type: local
spec:
  storageClassName: generic
  capacity:
    storage: 100Mi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/path/to/volume"

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  creationTimestamp: null
  name: config-volume-pvc
spec:
  storageClassName: generic
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 100Mi
status: {}

---
kind: Service
metadata:
  name: vol-test
  labels:
    app: vol-test
spec:
  type: NodePort
  ports:
    - port: 8200
      nodePort: 30008
  selector:
    app: vol-test

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: vol-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: vol-test
  template:
    metadata:
      labels:
        app: vol-test
    spec:
      containers:
        - name: vol-test
          image: nginx
          imagePullPolicy: "IfNotPresent"
          volumeMounts:
          - mountPath: /blah/
            name: ng-data
          ports:
            - containerPort: 8200
      volumes:
      - name: ng-data
        persistentVolumeClaim:
          claimName: config-volume-pvc

/path/to/volume 需要是绝对路径还是可以是相对路径? - Colonel Mustard
最好使用绝对路径,但相对路径也可以工作。 - Al-waleed Shihadeh
请问您能否为上述配置添加注释? - mr.zog
可以在任何资源上添加注释,这是可以接受的。 - Al-waleed Shihadeh

2
kubectl cp /my/local/file namespace/podname:/tmp/file

1

工作负载资源(例如服务、部署等)无法将卷挂载到在 Pod 中不存在的文件夹中。

确保在挂载之前在 Pod 中创建了该文件夹。最好的方法是在 Docker 文件中定义一个此项,如果您正在创建自己的映像,则可以使用脚本在 Pod 开始时创建所需的文件夹。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接