在 k8s 中部署的应用都是以 pod 容器的形式运行的,而 Pod 是有生命周期的,如果不挂载数据卷,那 pod 被删除或重启后,数据会随之消失,如果想要长久的保留这些数据就要用到 pod 数据持久化存储。
一、emptyDir
emptyDir 类型的卷是在 Pod 分配到节点上时被创建,k8s会在节点上自动分配一个目录,因此无需指定宿主机节点上对应的目录文件。 这个目录的初始内容为空,当 Pod 从节点上移除时,emptyDir 中的数据会被永久删除。
emptyDir类型主要用于某些应用程序无需永久保存的临时目录,或多个容器的共享目录等。
apiVersion: v1
kind: Pod
metadata:
name: pod-emptydir
spec:
containers:
- name: pod-emptydir
image: myharbor.belkuy.top/base/nginx:1.22.0-alpine
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- emptyDir: {}
name: cache-volume
# 查看 pod 在哪个节点上
# kubectl get pods -o wide | grep empty
pod-empty 1/1 Running 0 106s 10.168.205.82 192.168.33.132 <none> <none>
# 查看 pod 的uid
# kubectl get pods pod-empty -o yaml | grep uid
uid: bbda141d-42a2-4e95-9712-9cd7000de76f
进入工作节点:
# tree /var/lib/kubelet/pods/bbda141d-42a2-4e95-9712-9cd7000de76f/
/var/lib/kubelet/pods/bbda141d-42a2-4e95-9712-9cd7000de76f/
├── containers
│ └── container-empty
│ └── cb1869c7
├── etc-hosts
├── plugins
│ └── kubernetes.io~empty-dir
│ ├── cache-volume
│ │ └── ready
│ └── wrapped_kube-api-access-9rv97
│ └── ready
└── volumes
├── kubernetes.io~empty-dir
│ └── cache-volume
└── kubernetes.io~projected
└── kube-api-access-9rv97
├── ca.crt -> ..data/ca.crt
├── namespace -> ..data/namespace
└── token -> ..data/token
11 directories, 7 files
即临时目录为:
/var/lib/kubelet/pods/bbda141d-42a2-4e95-9712-9cd7000de76f/volumes/kubernetes.io~empty-dir/cache-volume/
二、hostPath
hostPath 类型的卷是指 Pod 挂载宿主机上的目录或文件。hostPath 卷使得容器可以使用宿主机的文件系统进行存储,在 pod 被删除,这个存储卷还是存在的,不会被删除,所以只要同一个 pod 被调度到同一个节点上,对应的数据依然是存在的。
apiVersion: v1
kind: Pod
metadata:
name: pod-hostpath
spec:
containers:
- image: myharbor.belkuy.top/base/nginx:1.22.0-alpine
name: pod-hostpath
volumeMounts:
- name: test-hostpath
mountPath: /tmp/
volumes:
- name: test-hostpath
hostPath:
path: /tmp/
type: DirectoryOrCreate
注:DirectoryOrCreate 表示本地有,就用本地的,本地没有就会在 pod 调度到的节点自动创建一个。
三、NFS
3.1 搭建NFS
# 安装 NFS 服务端
apt-get install nfs-kernel-server -y
# 创建 NFS 共享目录
mkdir /data/nfsdata
# 配置 NFS 共享服务器上的/data/nfsdata目录
echo '/data/nfsdata 192.168.33.0/24(rw,no_root_squash)' >> /etc/exports
# 使 NFS 配置生效
exportfs -arv
3.2 创建 pod 挂载
3.2.1 NFS
apiVersion: v1
kind: Pod
metadata:
name: test-nfs-volume
spec:
containers:
- name: test-nfs
image: myharbor.belkuy.top/base/nginx:1.22.0-alpine
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
protocol: TCP
volumeMounts:
- name: nfs-volumes
mountPath: /usr/share/nginx/html
volumes:
- name: nfs-volumes
nfs:
path: /data/nfsdata
server: 192.168.33.110