跳到主要内容

第15章 数据持久化

1.k8s存储介绍

容器内部的的存储在生命周期是短暂的,会随着容器环境的销毁而销毁,具有不稳定性。在k8s里将对容器应用所需的存储资源抽象为存储卷(Volume)概念来解决这些问题。

k8s目前支持的Volume类型包括k8s的内部资源对象类型,开源共享存储类型和公有云存储等。分类如下:

k8s特定的资源对象:

ConfigMap   应用配置
Secret 加密数据
ServiceAccountToken token数据

k8s本地存储类型:

EmptDir: 临时存储
HostPath: 宿主机目录

持久化存储(PV)和网络共享存储:

CephFS: 开源共享存储系统
GlusterFS: 开源共享存储系统
NFS: 开源共享存储
PersistentVolumeClaim: 简称PVC,持久化存储的申请空间

2.EmptyDir类型

cat > emptyDir.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: busybox-empty
spec:
containers:
- name: busybox-pod
image: busybox
volumeMounts:
- mountPath: /data/busybox/
name: cache-volume
command: ["/bin/sh","-c","while true;do echo $(date) >> /data/busybox/index.html;sleep 3;done"]
volumes:
- name: cache-volume
emptyDir: {}
EOF

3.hostPath类型

3.1 type类型说明

https://kubernetes.io/docs/concepts/storage/volumes/#hostpath

DirectoryOrCreate  目录不存在就自动创建
Directory 目录必须存在
FileOrCreate 文件不存在则创建
File 文件必须存在

3.2 创建hostPath类型volume资源配置清单

apiVersion: v1
kind: Pod
metadata:
name: busybox-nodename
spec:
nodeName: node2
volumes:
- name: hostpath-volume
hostPath:
path: /data/node/
type: DirectoryOrCreate
containers:
- name: busybox-pod
image: busybox
volumeMounts:
- mountPath: /data/pod/
name: hostpath-volume
command: ["/bin/sh","-c","while true;do echo $(date) >> /data/pod/index.html;sleep 3;done"]

4.NFS类型

4.1 NFS类型说明

我们也可以直接使用Node节点自己本身的nfs软件将共享目录挂载到Pod里,前提是NFS服务已经安装配置好,并且Node节点上安装了NFS客户端软件。

4.2 创建NFS服务

yum install nfs-utils -y
cat > /etc/exports << 'EOF'
/data/nfs-volume/blog *(rw,sync,no_root_squash)
EOF
mkdir -p /data/nfs-volume/blog
systemctl restart nfs

4.3 创建NFS类型资源清单

apiVersion: v1
kind: Pod
metadata:
name: liveness-pod
spec:
nodeName: node2

volumes:
- name: nfs-data
nfs:
server: 10.0.0.11
path: /data/nfs-volume/
containers:
- name: liveness
image: nginx
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
volumeMounts:
- name: nfs-data
mountPath: /usr/share/nginx/html/

5.根据Node标签选择POD创建在指定的Node上

5.1 方法1: 直接选择Node节点名称

apiVersion: v1
kind: Pod
metadata:
name: busybox-nodename
spec:
nodeName: node2
containers:
- name: busybox-pod
image: busybox
volumeMounts:
- mountPath: /data/pod/
name: hostpath-volume
command: ["/bin/sh","-c","while true;do echo $(date) >> /data/pod/index.html;sleep 3;done"]
volumes:
- name: hostpath-volume
hostPath:
path: /data/node/
type: DirectoryOrCreate

5.2 方法2: 根据Node标签选择Node节点

节点添加标签

kubectl label nodes node3 disktype=SSD

资源配置清单

apiVersion: v1
kind: Pod
metadata:
name: busybox-nodename
spec:
nodeSelector:
disktype: SSD
containers:
- name: busybox-pod
image: busybox
volumeMounts:
- mountPath: /data/pod/
name: hostpath-volume
command: ["/bin/sh","-c","while true;do echo $(date) >> /data/pod/index.html;sleep 3;done"]
volumes:
- name: hostpath-volume
hostPath:
path: /data/node/
type: DirectoryOrCreate

6.编写mysql的持久化deployment

apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-dp
namespace: default
spec:
selector:
matchLabels:
app: mysql
replicas: 1
template:
metadata:
name: mysql-pod
namespace: default
labels:
app: mysql
spec:
volumes:
- name: mysql-volume
hostPath:
path: /data/mysql
type: DirectoryOrCreate
nodeSelector:
disktype: SSD
containers:
- name: mysql-pod
image: mysql:5.7
ports:
- name: mysql-port
containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"
volumeMounts:
- mountPath: /var/lib/mysql
name: mysql-volume

更新: 2024-09-02 08:57:08