k8s数据卷

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s数据卷相关的知识,希望对你有一定的参考价值。

为什么需要数据卷

容器中的文件在磁盘上是临时存在,这给容器中运行一些重要的程序的时候有影响

  • 问题1: 当容器升级或者崩溃的时候,kubelet会重建容器,容器内的文件丢失
  • 问题2: 一个容器中运行多个容器,可能需要文件共享

k8s的卷(volumn)这一抽象概念可以解决这个问题

常用的数据卷类型

  • 节点本地 hostPath emptyDir
  • 网络 NFS Ceph ClusterFs
  • 公有云 AWS EBS
  • k8s资源 configMap Secret

emptyDir卷类型

emptyDir是一个临时存储卷,与pod的生命周期绑在一起,删除pod,emptyDir卷也会被随之删除。

应用场景: pod容器之间数据共享

apiVersion: v1
kind: Pod
metadata:
name: test
spec:
containers:
- name: write
image: centos
command: ["bash","-c","for i in 1..100;do echo $i >> /data/hello;sleep 1;done"]
volumeMounts:
- name: data
mountPath: /data
- name: read
image: centos
command: ["bash","-c","tail -f /data/hello"]
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
emptyDir:

寻找emptyDir在宿主机上挂载的位置的方式:

1、查看pod分布在哪个节点上

# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test 2/2 Running 0 64s 10.244.169.141 k8s-node2 <none> <none>

2、到相应的节点查看docker 容器

# docker ps -a |grep "podName"

k8s数据卷_docker

3、查看挂载目录

k8s数据卷_数据卷_02

hostPath卷类型

hostPath卷:挂载的是node节点(pod所在节点)上的文件或目录到容器中

应用场景:pod中容器需要访问宿主机上的文件

缺点:挂载的是pod所在节点上的目录或者文件,如果节点挂了,pod在其他节点上创建,那么写的内容会丢失

apiVersion: v1
kind: Pod
metadata:
name: test
spec:
containers:
- name: write
image: centos
command: ["bash","-c","for i in 1..100;do echo $i >> /data/hello;sleep 1;done"]
volumeMounts:
- name: data
mountPath: /data
- name: read
image: centos
command: ["bash","-c","tail -f /data/hello"]
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
hostPath:
path: /tmp # 将宿主机的/tmp目录挂载到容器中的/data目录下
type: Directory

网络数据卷:NFS

k8s支持挂载nfs,nfs提供一个共享目录,pod都挂载这个目录,这样pod无论如何重建,都不会影响共享目录中的内容

nfs挂载小测试

1、安装nfs环境

yum -y install nfs-utils # 每个节点都安装

2、配置nfs 服务端 (任意一个节点)

vim /etc/exports
/ifs/kubernetes *(rw,no_root_squash) # 共享目录

mkdir -p /ifs/kubernetes
systemctl start nfs
systemctl enable nfs

3、验证nfs是否正常工作

在其他节点挂载共享目录测试

mount -t nfs 192.168.3.33:/ifs/kubernetes /mnt
在/mnt目录下添加删除文件目录,测试共享目录也会同步 即可

4、pod挂载共享目录

apiVersion: apps/v1
kind: Deployment
metadata:
name: web
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: portal
template:
metadata:
labels:
app: portal
spec:
containers:
- name: web
image: nginx:1.18
volumeMounts:
- name: wwwroot
mountPath: /usr/share/nginx/html
volumes:
- name: wwwroot
nfs:
server: 192.168.3.33
path: /ifs/kubernetes

以上是关于k8s数据卷的主要内容,如果未能解决你的问题,请参考以下文章

19,k8s 之 Volume

k8s文件挂载权限分析

Docker的mysql集群节点可以正常创建,但无法正常连接到宿主机的mysql应该如何解决?

8kubernetes之存储卷资源

Docker 容器数据卷

Docker 容器数据卷