第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