Kubernetes Volumes 笔记
Volumes
介绍
Container 中的文件在磁盘上是临时存放的,这给 Container 中运行的较重要的应用程序带来一些问题。
- 当容器崩溃时文件丢失。 kubelet 会重新启动容器,但容器会以干净的状态重启。
- 当Pod中同时运行多个容器,容器之间需要共享文件时。
背景
Kubernetes 支持很多类型的卷。 Pod 可以同时使用任意数目的卷类型。 临时卷类型的生命周期与 Pod 相同,但持久卷可以比 Pod 的存活期长。 当 Pod 不再存在时,Kubernetes 也会销毁临时卷;不过 Kubernetes 不会销毁持久卷。 对于给定 Pod 中任何类型的卷,在容器重启期间数据都不会丢失。
卷的核心是一个目录,其中可能存有数据,Pod 中的容器可以访问该目录中的数据。 所采用的特定的卷类型将决定该目录如何形成的、使用何种介质保存数据以及目录中存放的内容。
使用卷时, 在 .spec.volumes 字段中设置为 Pod 提供的卷,并在 .spec.containers[*].volumeMounts 字段中声明卷在容器中的挂载位置。
容器中的进程看到的文件系统视图是由它们的容器镜像的初始内容以及挂载在容器中的卷(如果定义了的话)所组成的。
其中根文件系统同容器镜像的内容相吻合。 任何在该文件系统下的写入操作,如果被允许的话,都会影响接下来容器中进程访问文件系统时所看到的内容。
EmptyDir
使用emptyDir,当Pod分配到Node上时,将会创建emptyDir,并且只要Node上的Pod一直运行,Volume就会一直存。当Pod(不管任何原因)从Node上被删除时,emptyDir也同时会删除,存储的数据也将永久删除。注:删除容器不影响emptyDir。
pod_empydir.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-emptydir
namespace: default
spec:
containers:
- name: busybox1
image: busybox
imagePullPolicy: IfNotPresent
command: ["/bin/sh", "-c", "sleep 3600"]
volumeMounts:
- mountPath: /cache
name: cache-volume
- name: busybox2
image: busybox
imagePullPolicy: IfNotPresent
command: ["/bin/sh", "-c", "sleep 3600"]
volumeMounts:
- mountPath: /test/cache
name: cache-volume
volumes:
- name: cache-volume
emptyDir: {}
创建并查看结果
[root@master01 volumes]# kubectl apply -f pod_emptydir.yaml
pod/pod-emptydir created
[root@master01 volumes]# kubectl describe pod pod-emptydir
Name: pod-emptydir
Namespace: default
Priority: 0
Node: master02/192.168.44.11
Start Time: Thu, 15 Dec 2022 00:14:10 +0800
Labels: <none>
Annotations: <none>
Status: Pending
IP:
IPs: <none>
Containers:
busybox1:
Container ID:
Image: busybox
Image ID:
Port: <none>
Host Port: <none>
Command:
/bin/sh
-c
sleep 3600
State: Waiting
Reason: ContainerCreating
Ready: False
Restart Count: 0
Environment: <none>
Mounts:
/cache from cache-volume (rw) #挂载
/var/run/secrets/kubernetes.io/serviceaccount from default-token-c7jnm (ro)
busybox2:
Container ID:
Image: busybox
Image ID:
Port: <none>
Host Port: <none>
Command:
/bin/sh
-c
sleep 3600
State: Waiting
Reason: ContainerCreating
Ready: False
Restart Count: 0
Environment: <none>
Mounts:
/test/cache from cache-volume (rw)
/var/run/secrets/kubernetes.io/serviceaccount from default-token-c7jnm (ro)
Conditions:
Type Status
Initialized True
Ready False
ContainersReady False
PodScheduled True
Volumes:
cache-volume:
Type: EmptyDir (a temporary directory that shares a pod's lifetime)
Medium:
SizeLimit: <unset>
default-token-c7jnm:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-c7jnm
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 58s default-scheduler Successfully assigned default/pod-emptydir to master02
Normal Pulling 56s kubelet Pulling image "busybox"
测试Emptydir
[root@master01 volumes]# kubectl exec -it pod-emptydir -c busybox1 -- sh
/ # ls
bin cache dev etc home lib lib64 proc root sys tmp usr var
/ # cd cache/
/cache # touch create_busybox
/cache # ^C
/cache # exit
command terminated with exit code 130
[root@master01 volumes]# kubectl exec -it pod-emptydir -c busybox2 -- sh
/ # ls
bin dev etc home lib lib64 proc root sys test tmp usr var
/ # cd test/cache/
/test/cache # ls
create_busybox
Hostpath
hostPath允许挂载Node上的文件系统到Pod里面去。如果Pod需要使用Node上的文件,可以使用hostPath。
示例
- 运行一个需要访问 Docker 引擎内部机制的容器;请使用 hostPath 挂载 /var/lib/docker 路径。
- 在容器中运行 cAdvisor 时,以 hostPath 方式挂载 /sys。
- 允许 Pod 指定给定的 hostPath 在运行 Pod 之前是否应该存在,是否应该创建以及应该以什么方式存在
支持类型
取值 | 行为 |
---|---|
空字符串(默认)用于向后兼容,这意味着在安装 hostPath 卷之前不会执行任何检查 | |
DirectoryOrCreate | 如果指定的路径不存在,那么将根据需要创建空目录,权限设置为 0755,具有与 Kubelet 相同的组和所有权 |
Directory | 给定的路径必须存在 |
FileOrCreate | 如果给定路径的文件不存在,那么将在那里根据需要创建空文件,权限设置为 0644,具有与 Kubelet 相同的组和所有权【前提:文件所在目录必须存在;目录不存在则不能创建文件】 |
File | 给定路径上的文件必须存在 |
Socket | 在给定路径上必须存在的 UNIX 套接字 |
CharDevice | 在给定路径上必须存在的字符设备 |
BlockDevice | 在给定路径上必须存在的块设备 |
hostpath.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-hostpath
namespace: default
spec:
containers:
- name: busybox3
image: busybox
imagePullPolicy: IfNotPresent
command: ["/bin/sh", "-c", "sleep 3600"]
volumeMounts:
- name: hostpath-dir-volume
mountPath: /test-k8s/hostpath-dir
volumes:
- name: hostpath-dir-volume
hostPath:
path: /root/test_hostPath # 宿主机目录
type: DirectoryOrCreate # hostPath 卷指定 type,如果目录不存在则创建(可创建多层目录)
创建并查看结果
[root@master01 volumes]# kubectl apply -f hostpath.yaml
pod/pod-hostpath created
[root@master01 volumes]# kubectl get po -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-hostpath 1/1 Running 0 19s 172.20.59.237 master02 <none> <none>
[root@master01 volumes]# kubectl describe po pod-hostpath
Name: pod-hostpath
Namespace: default
Priority: 0
Node: master02/192.168.44.11
Start Time: Thu, 15 Dec 2022 00:29:49 +0800
Labels: <none>
Annotations: <none>
Status: Running
IP: 172.20.59.237
IPs:
IP: 172.20.59.237
Containers:
busybox3:
Container ID: docker://b5c41f3d14da84558f6298bf7967c3bf825cce19898f5cbb308a9b8fc6c78da4
Image: busybox
Image ID: docker-pullable://busybox@sha256:3b3128d9df6bbbcc92e2358e596c9fbd722a437a62bafbc51607970e9e3b8869
Port: <none>
Host Port: <none>
Command:
/bin/sh
-c
sleep 3600
State: Running
Started: Thu, 15 Dec 2022 00:29:50 +0800
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/test-k8s/hostpath-dir from hostpath-dir-volume (rw)
/var/run/secrets/kubernetes.io/serviceaccount from default-token-c7jnm (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
hostpath-dir-volume:
Type: HostPath (bare host directory volume)
Path: /root/test_hostPath
HostPathType: DirectoryOrCreate
default-token-c7jnm:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-c7jnm
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 94s default-scheduler Successfully assigned default/pod-hostpath to master02
Normal Pulled 93s kubelet Container image "busybox" already present on machine
Normal Created 93s kubelet Created container busybox3
Normal Started 93s kubelet Started container busybox3
[root@master01 volumes]# ssh master02
Last login: Wed Nov 23 04:15:58 2022 from 192.168.44.1
[root@master02 ~]# ls
test_hostPath
[root@master02 ~]# cd test_hostPath/
[root@master02 test_hostPath]# ls
[root@master02 test_hostPath]# pwd
/root/test_hostPath
测试hostpath
[root@master02 test_hostPath]# pwd
/root/test_hostPath
[root@master02 test_hostPath]# touch create_hostpath
[root@master02 test_hostPath]#
[root@master02 test_hostPath]# kubectl exec -ti pod-hostpath -- sh
/ # ls
bin dev etc home lib lib64 proc root sys test-k8s tmp usr var
[root@master02 test_hostPath]# ls
create_hostpath
[root@master02 test_hostPath]# kubectl exec -ti pod-hostpath -- sh
/ # ls
bin dev etc home lib lib64 proc root sys test-k8s tmp usr var
/ # cd test-k8s/hostpath-dir/
/test-k8s/hostpath-dir # ls
create_hostpath