k8s存储卷(empyDir;hostPath;nfs)

一: emptyDir 存储卷

1.1 为什么使用存储卷

容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃时, kubelet会重启它,但是容器中的文件将丢失一容器以干净的状态(镜像最初的状态)重新启动。

其次,在Pod中同时运行多个容器时,这些容器之间通常需要共享文件。Kubernetes中的Volume抽象就很好的解决了这些问题。Pod中的容器通过Pause容器共享Volume。

1.2 emptyDir 存储卷的作用

emptyDir存储卷当Pod被分配给节点时,首先创建emptyDir卷,并且只要该Pod在该节点上运行,该卷就会存在。正如卷的名字所述,它最初是空的。Pod中的容器可以读取和写入emptyDir卷中的相同文件,尽管该卷可以挂载到每个容器中的相同或不同路径上。当出于任何原因从节点中删除Pod时, emptyDir中的数据将被永久删除

1.3 示例

[root@master demo]# mkdir /opt/volumes
[root@master demo]# cd /opt/volumes/
[root@master volumes]# vim pod-emptydir.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-emptydir
  namespace: default
  labels:
    app: myapp
    tier: frontend
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    imagePullPolicy: IfNotPresent
    ports:
    - name: http
      containerPort: 80
    #定义容器挂载的内容
    volumeMounts:
    #使用的存储卷名称,如果跟下面的volume字段name值相同,则表示使用volume的这个卷
    - name: html
      #挂载到容器的哪个目录
      mountPath: /usr/share/nginx/html/
  - name: busybox
    image: busybox:latest
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: html
      #在容器内定义挂载存储名称和挂载路径
      mountPath: /data/
    command: ['/bin/sh','-c','while true;do echo $(date) >> /data/index.html;sleep 5;done']
  #定义存储卷
  volumes:
  #定义存储卷的名称
  - name: html
    #定义存储卷的类型
    emptyDir: {}
[root@master volumes]# kubectl  apply -f pod-emptydir.yaml

[root@master volumes]# kubectl get pods -o wide 
NAME           READY   STATUS    RESTARTS   AGE   IP             NODE     NOMINATED NODE   READINESS GATES
pod-emptydir   2/2     Running   0          3s    10.244.1.146   node01   <none>           <none>

#在上面定义了两个容器,其中一个容器输入日期到index.html中,然后验证范围nginx的htmnl是否可以获取日期
#同时,在进入两个容器里,查看挂载数据卷的目录的数据,以验证两个容器之间挂载的emptyDir实现共享

[root@master volumes]# curl  10.244.1.146
Tue Nov 9 09:56:53 UTC 2021
Tue Nov 9 09:56:58 UTC 2021
Tue Nov 9 09:57:03 UTC 2021
Tue Nov 9 09:57:08 UTC 2021
Tue Nov 9 09:57:13 UTC 2021
Tue Nov 9 09:57:18 UTC 2021
[root@master volumes]# kubectl  exec  -it  pod-emptydir -c busybox
error: you must specify at least one command for the container
[root@master volumes]# kubectl  exec  -it  pod-emptydir -c busybox sh
/ # cat /data/index.html 
Tue Nov 9 09:56:53 UTC 2021
Tue Nov 9 09:56:58 UTC 2021
Tue Nov 9 09:57:03 UTC 2021
Tue Nov 9 09:57:08 UTC 2021
Tue Nov 9 09:57:13 UTC 2021
Tue Nov 9 09:57:18 UTC 2021
[root@master volumes]# kubectl  exec  -it  pod-emptydir -c myapp sh
/ # cat /usr/share/nginx/html/index.html 
Tue Nov 9 09:56:53 UTC 2021
Tue Nov 9 09:56:58 UTC 2021
Tue Nov 9 09:57:03 UTC 2021
Tue Nov 9 09:57:08 UTC 2021
Tue Nov 9 09:57:13 UTC 2021
Tue Nov 9 09:57:18 UTC 2021
Tue Nov 9 09:57:23 UTC 2021
Tue Nov 9 09:57:28 UTC 2021
Tue Nov 9 09:57:33 UTC 2021
Tue Nov 9 09:57:38 UTC 2021

image-20211109180314937

image-20211109180247388

image-20211109180100198

二: hostPath卷

2.1 作用

hostPath卷将node节点的文件系统中的文件或者目录挂载到集群中

hostPath可以实现持久存储,但是在node节点故障时,也会导致数据的丢失

2.2 示例

#在node01节点上创建挂载目录
[root@node01 ~]#  mkdir -p /data/pod/volume1
[root@node01 ~]#  echo 'node01.myweb.com' > /data/pod/volume1/index.html

#在node02 节点上创建挂载目录
[root@node02 ~]#  mkdir -p /data/pod/volume1
[root@node02 ~]#  echo 'node02.myweb.com' > /data/pod/volume1/index.html
[root@master volumes]# vim pod-hostpath.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-hostpath
  namespace: default
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    #定义容器你挂载内容
    volumeMounts:
    #使用的存储卷名称,如果跟下面volume字段name值相同,则表示使用volume的这个存储卷
    - name: html
      #挂载值容器中哪个目录
      mountPath: /usr/share/nginx/html
      readOnly: false
  #volumes字段定义了paues容器关联的宿主机或分布式文件系统存储卷    
  volumes:
   #存储卷名称
    - name: html
      #路径,为宿主机存储路径
      hostPath:
        #在宿主机上目录的路径
        path: /data/pod/volume1
        #定义类型,这表示如果宿主机没有此目录则会自动创建
        type: DirectoryOrCreate                              
[root@master volumes]# kubectl  get pods -o wide
NAME           READY   STATUS    RESTARTS   AGE   IP             NODE     NOMINATED NODE   READINESS GATES
pod-hostpath   1/1     Running   0          14m   10.244.2.112   node02   <none>           <none>
#访问测试
[root@master volumes]# curl 10.244.2.112
node02.myweb.com


#删除pod后,再重建,验证是否依旧可以访问原来的内容
[root@master volumes]# kubectl delete -f pod-hostpath.yaml 
pod "pod-hostpath" deleted
[root@master volumes]# kubectl apply -f pod-hostpath.yaml 
pod/pod-hostpath created
[root@master volumes]# kubectl  get pods -o wide
NAME           READY   STATUS    RESTARTS   AGE   IP             NODE     NOMINATED NODE   READINESS GATES
pod-hostpath   1/1     Running   0          6s    10.244.1.147   node01   <none>           <none>
[root@master volumes]# curl 10.244.1.147
node01.myweb.com

image-20211109185644906

image-20211109185624216

三: nfs共享存储

3.1 安装配置nfs服务

#在stor01(192.168.23.10)节点上安装nfs,并配置nfs服务
mkdir /data/volumes -p
echo 'this is OTZ' >> /data/volumes/index.html
chmod 777 /data/volumes/

yum -y install nfs-utils rpcbind

vim /etc/exports
/data/volumes 192.168.23.0/24(rw,no_root_squash,sync)

systemctl  start  rpcbind nfs

Export list for host10:
/data/volumes 192.168.23.0/24

#所有节点配置hosts映射,或者配置DNS解析
echo '192.168.23.10 stor01' >> /etc/hosts

image-20211109190742224

3.2 master 节点操作

apiVersion: v1
kind: Pod
metadata:
  name: pod-vo1-nfs
  namespace: default
spec:
  #指定pod到 node01节点
  nodeName: node01
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
  volumes:
    - name: html
      nfs:
        path: /data/volumes
        server: stor01
[root@master volumes]# kubectl apply -f pod-nfs-vo1.yaml 
pod/pod-vo1-nfs created
[root@master volumes]# kubectl get pods -o wide
NAME          READY   STATUS    RESTARTS   AGE   IP             NODE     NOMINATED NODE   READINESS GATES
pod-vo1-nfs   1/1     Running   0          8s    10.244.1.148   node01   <none>           <none>
#访问cluster ip 
[root@master volumes]# curl 10.244.1.148
this is OTZ

image-20211109191854582

[root@master volumes]# kubectl delete pod pod-vo1-nfs 
pod "pod-vo1-nfs" deleted

[root@master volumes]# vim pod-nfs-vo1.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-vo1-nfs
  namespace: default
spec:
  #指定pod在node02节点
  nodeName: node02
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
  volumes:
    - name: html
      nfs:
        path: /data/volumes
        server: stor01
[root@master volumes]# kubectl apply -f pod-nfs-vo1.yaml 
pod/pod-vo1-nfs created
[root@master volumes]# kubectl get pods -o wide
NAME          READY   STATUS    RESTARTS   AGE   IP             NODE     NOMINATED NODE   READINESS GATES
pod-vo1-nfs   1/1     Running   0          3s    10.244.2.114   node02   <none>           <none>
#访问测试
[root@master volumes]# curl  10.244.2.114
this is OTZ
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YJ Thoreau

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值