在 Kubernetes pod 的卷内创建一个空文件
create an empty file inside a volume in 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,只想创建一个空文件。
如果objective是在Pod启动时创建一个空文件,那么最简单的方法就是使用docker镜像的入口点或者init容器。
使用 initContainer,您可以使用类似下面的东西(或者使用您构建并执行整个 bash 脚本或类似东西的更复杂的初始化映像):
apiVersion: v1
kind: Pod
metadata:
name: demo-pod
spec:
initContainers:
- name: create-empty-file
image: alpine
command: ["touch", "/path/to/the/directory/empty_file"]
volumeMounts:
- name: volume-name
mountPath: /path/to/the/directory
containers:
- name: demo
image: alpine
command: ["sleep", "3600"]
volumeMounts:
- name: volume-name
mountPath: /path/to/the/directory
volumes:
- name: volume-name
emptyDir: {}
基本上 init 容器首先被执行,运行它的命令,如果它成功,然后它终止并且主容器启动 运行。它们共享相同的卷(并且它们也可以将它们安装在不同的路径)因此在示例中,init 容器安装 emptyDir 卷,创建一个空文件然后完成。当主容器启动时,文件已经存在。
关于在 Kubernetes 上移植的遗留应用程序:
如果您控制了 Dockerfile,您可以简单地更改它,在您期望的路径创建一个空文件,这样当应用程序启动时,文件已经在那里创建,空的,从一开始,就像将应用程序添加到容器中一样,您还可以添加其他文件。
有关 init 容器的更多信息,请查看文档 (https://kubernetes.io/docs/concepts/workloads/pods/init-containers/)
我想你可能对 Container Lifecycle Hooks 感兴趣。
在这种情况下,PostStart 挂钩可能有助于在容器启动后立即创建一个空文件:
This hook is executed immediately after a container is created.
在下面的示例中,我将向您展示如何使用 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
/ #
我有一个遗留应用程序,它不断检查目录中的空文件,并在文件时间戳更改时执行特定操作。
我正在将此应用程序迁移到 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,只想创建一个空文件。
如果objective是在Pod启动时创建一个空文件,那么最简单的方法就是使用docker镜像的入口点或者init容器。
使用 initContainer,您可以使用类似下面的东西(或者使用您构建并执行整个 bash 脚本或类似东西的更复杂的初始化映像):
apiVersion: v1
kind: Pod
metadata:
name: demo-pod
spec:
initContainers:
- name: create-empty-file
image: alpine
command: ["touch", "/path/to/the/directory/empty_file"]
volumeMounts:
- name: volume-name
mountPath: /path/to/the/directory
containers:
- name: demo
image: alpine
command: ["sleep", "3600"]
volumeMounts:
- name: volume-name
mountPath: /path/to/the/directory
volumes:
- name: volume-name
emptyDir: {}
基本上 init 容器首先被执行,运行它的命令,如果它成功,然后它终止并且主容器启动 运行。它们共享相同的卷(并且它们也可以将它们安装在不同的路径)因此在示例中,init 容器安装 emptyDir 卷,创建一个空文件然后完成。当主容器启动时,文件已经存在。
关于在 Kubernetes 上移植的遗留应用程序:
如果您控制了 Dockerfile,您可以简单地更改它,在您期望的路径创建一个空文件,这样当应用程序启动时,文件已经在那里创建,空的,从一开始,就像将应用程序添加到容器中一样,您还可以添加其他文件。
有关 init 容器的更多信息,请查看文档 (https://kubernetes.io/docs/concepts/workloads/pods/init-containers/)
我想你可能对 Container Lifecycle Hooks 感兴趣。
在这种情况下,PostStart 挂钩可能有助于在容器启动后立即创建一个空文件:
This hook is executed immediately after a container is created.
在下面的示例中,我将向您展示如何使用 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
/ #