K8S 持久化存储

时间:2023-02-13 07:56:56

在 k8s 中部署的应用都是以 pod 容器的形式运行的,而 Pod 是有生命周期的,如果不挂载数据卷,那 pod 被删除或重启后,数据会随之消失,如果想要长久的保留这些数据就要用到 pod 数据持久化存储。

一、emptyDir

emptyDir 类型的卷是在 Pod 分配到节点上时被创建,k8s会在节点上自动分配一个目录,因此无需指定宿主机节点上对应的目录文件。 这个目录的初始内容为空,当 Pod 从节点上移除时,emptyDir 中的数据会被永久删除。

emptyDir类型主要用于某些应用程序无需永久保存的临时目录,或多个容器的共享目录等。


  • 创建一个 pod 挂载 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