K8s存储之简单存储
1.K8s存储
Volume是Pod中能够被多个container访问的共享目录。
K8s基于Volume实现:
(1)同一个Pod中不同容器之间的数据共享;
(2)数据的持久化存储。Volume生命周期与容器的生命周期相互独立,Volume不受容器的启停影响,数据不丢失。
Volumn支持的类型:
简单存储:EmptyDir、HostPath、NFS
高级存储:PV、PVC
配置存储:ConfigMap、Secret
2 简单存储
简单存储包括EmptyDir、HostPath、NFS。
2.1 EmptyDir
EmptyDir是在Pod分配到Node时创建的,初始内容为空,由 k8s自动分配一个目录。当Pod销毁时,EmptyDir中的数据也会被永久删除。仅适用于单节点。
EmptyDir应用场景:
(1)临时空间,应用程序运行时所需的临时目录,且无需永久保留。
(2)容器间共享数据(多容器共享目录)
(3)缓存空间,例如基于磁盘的归并排序。
(4)为耗时较长的计算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行。
(5)在 Web 服务器容器服务数据时,保存内容管理器容器获取的文件。
配置示例
test-demo-web的日志目录/var/log/ test-demo-web和test-demo-service的日志目录/var/log/ test-demo-service设置为EmptyDir,容器配置如下,关键配置见红色字体:
apiVersion: v1
kind: Pod
metadata:
name: volume-emptydir
namespace: default
spec:
containers:
- name: test-demo-web
image: test-demo-web:1.0.0
ports:
- containerPort: 80
volumeMounts:
- name: logs-volume
mountPath: /var/log/test-demo-web
- name: test-demo-service
image: test-demo-service1.0.0
ports:
- containerPort: 8888
volumeMounts:
- name: logs-volume
mountPath: /var/log/test-demo-service
volumes:
- name: logs-volume ## 与volumeMounts.name必需保持一致,否则配置无效
emptyDir: {}
2.2 HostPath
HostPath将节点的实际目录挂载到Pod中,供容器使用,即使Pod销毁,数据依然存在于节点目录上。仅适用于单节点;多节点场景,需使用网络存储系统实现目录共享,如NFS,CIFS。
配置示例
test-demo-web的日志目录/var/log/ test-demo-web和test-demo-service的日志目录/var/log/ test-demo-service设置为HostPath,容器配置如下,关键配置见红色字体:
apiVersion: v1
kind: Pod
metadata:
name: volume-emptydir
namespace: default
spec:
containers:
- name: test-demo-web
image: test-demo-web:1.0.0
ports:
- containerPort: 80
volumeMounts:
- name: logs-volume
mountPath: /var/log/test-demo-web
- name: test-demo-service
image: test-demo-service1.0.0
ports:
- containerPort: 8888
volumeMounts:
- name: logs-volume
mountPath: /var/log/test-demo-service
volumes:
- name: logs-volume ## 与volumeMounts.name必需保持一致,否则配置无效
hostPath:
path: /data/logs/test-demo-app
type: DirectoryOrCreate ##目录不存在则创建目
hostPath.type值说明如下:
类型 | 说明 |
DirectoryOrCreate | 目录存在就使用,不存在就先创建 |
Directory | 目录必须存在 |
FileOrCreate | 文件存在就使用,不存在就先创建 |
File | 文件必须存在 |
Socket | unix套接字必须存在 |
CharDevice | 字符设备必须存在 |
BlockDevice | 块设备必须存在 |
2.3 NFS
在多节点场景下,如果Pod漂移到其他节点, Pod容器运行存储的数据在其他服务器没有,数据丢失,引入NFS网络文件系统可解决该问题。
在主节点和备份节点均需安装nfs服务,主节点安装nfs-kernel-server和rpcbind服务,从节点安装nfs-common服务,具体操作如下:
step 1:主节点配置并创建共享目录
------主节点A在线下载依赖包-----------
sudo apt-get install nfs-kernel-server
sudo apt-get install rpcbind
----查看是否已安装
sudo dpkg -l | grep nfs-kernel-server
sudo dpkg -l | grep rpcbind
----- master节点-------
mkdir /share_dir
----共享目录配置------------
vim /etc/exports
/share_dir *(rw,sync,no_root_squash,no_subtree_check)
exportfs -a
-------启动nfs服务-------------------------
systemctl restart nfs-kernel-server
systemctl restart rpcbind
----------查看共享目录
showmount -e
step 2:挂在从节点B配置
sudo apt-get install nfs-common
sudo showmount -e 主节点A的IP
mkdir share_dir
mount -t nfs 主节点A的ip:/share_dir /root/share_dir
----------开机自启动-----------------------
vim /etc/fstab
主节点A的ip:/share_dir /root/share_dir nfs defaults 0 0
Pod的Yaml配置如下:
test-demo-web的日志目录/var/log/ test-demo-web和test-demo-service的日志目录/var/log/ test-demo-service设置为HostPath,容器配置如下,关键配置见红色字体:
apiVersion: v1
kind: Pod
metadata:
name: volume-emptydir
namespace: default
spec:
containers:
- name: test-demo-web
image: test-demo-web:1.0.0
ports:
- containerPort: 80
volumeMounts:
- name: logs-volume
mountPath: /var/log/test-demo-web
- name: test-demo-service
image: test-demo-service1.0.0
ports:
- containerPort: 8888
volumeMounts:
- name: logs-volume
mountPath: /var/log/test-demo-service
volumes:
- name: logs-volume
nfs:
server: 192.168.16.100 #nfs服务器地址
path: /mnt/share/nfs #共享文件路径