首页 > 解决方案 > 在 Kubernetes pod 的卷内创建一个空文件

问题描述

我有一个旧版应用程序,它会不断检查目录中的空文件,并在文件时间戳发生更改时执行某些操作。

我正在将此应用程序迁移到 Kubernetes,因此我想在 pod 中创建一个空文件。我尝试了像下面这样的子路径,但它没有创建任何文件。

apiVersion: v1
kind: Pod
metadata:
  name: demo-pod
spec:
  containers:
    - name: demo
      image: alpine
      command: ["sleep", "3600"]
      volumeMounts:
      - name: volume-name
        mountPath: '/volume-name-path'
        subPath: emptyFile
  volumes:
    - name: volume-name
      emptyDir: {} 

描述 pods 节目

Containers:
  demo:
    Container ID:  containerd://0b824265e96d75c5f77918326195d6029e22d17478ac54329deb47866bf8192d
    Image:         alpine
    Image ID:      docker.io/library/alpine@sha256:08d6ca16c60fe7490c03d10dc339d9fd8ea67c6466dea8d558526b1330a85930
    Port:          <none>
    Host Port:     <none>
    Command:
      sleep
      3600
    State:          Running
      Started:      Wed, 10 Feb 2021 12:23:43 -0800
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-4gp4x (ro)
      /volume-name-path from volume-name (rw,path="emptyFile")

卷上的 ls 也没有显示任何内容。 k8 exec -it demo-pod -c demo ls /volume-name-path

有什么建议吗??

PS:我不想使用 ConfigMap,只想创建一个空文件。

标签: kuberneteskubernetes-pod

解决方案


我想你可能对Container Lifecycle Hooks感兴趣。
在这种情况下,PostStart钩子可能有助于在容器启动后立即创建一个空文件:

这个钩子在容器创建后立即执行。


在下面的示例中,我将向您展示如何使用PostStart钩子创建一个空file-test文件。

首先,我创建了一个简单的清单文件:

# demo-pod.yml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: demo-pod
  name: demo-pod
spec:
  containers:
  - image: alpine
    name: demo-pod
    command: ["sleep", "3600"]
    lifecycle:
      postStart:
        exec:
          command: ["touch", "/mnt/file-test"]

创建后Pod,我们可以检查demo-pod容器是否有空file-test文件:

$ kubectl apply -f demo-pod.yml
pod/demo-pod created
$ kubectl exec -it demo-pod -- sh
/ # ls -l /mnt/file-test
-rw-r--r--    1 root     root             0 Feb 11 09:08 /mnt/file-test
/ # cat /mnt/file-test
/ #

推荐阅读