Kubernetes——存储卷(empyDirhostPathnfs)

Posted 封玖FJ

tags:

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

存储卷

为什么使用存储卷

  • 容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃时,kubelet会重启它,但是容器中的文件将丢失—容器以干净的状态(镜像最初的状态)重新启动。
  • 其次,在Podt中同时运行多个容器时,这些容器之间通常需要共享文件。Kubernetes中的volume抽象就很好的解决了这些问题。Pod中的容器通过Pause容器共享Volume。

emptyDir存储卷作用

  • 当pod被分配给节点时,首先创建emptyDir卷,并且只要该Pod在该节点上运行,该卷就会存在。正如卷的名字所述,它最初是空的。Pod中的容器可以读取和写入emptyDir卷中的相同文件,尽管该卷可以挂载到每个容器中的相同或不同路径上。当出于任何原因从节点中删除 pod时,emptyDir中的数据将被永久删除
mkdir /opt/volumes
cd /opt/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: 
==========================================================
kubectl  apply -f pod-emptydir.yaml

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

kubectl  exec  -it  pod-emptydir -c busybox sh
cat /data/index.html 
kubectl  exec  -it  pod-emptydir -c myapp sh
cat /usr/share/nginx/html/index.html 

hostPath卷

作用

  • hostPath卷将node节点的文件系统中的文件或者目录挂载到集群中
  • hostPath可以实现持久存储,但是在node节点故障时,也会导致数据的丢失
#在node01节点上创建挂载目录
mkdir -p /data/pod/volume1
echo node01.myweb.com > /data/pod/volume1/index.html

#在node02 节点上创建挂载目录
mkdir -p /data/pod/volume1
echo node02.myweb.com > /data/pod/volume1/index.html
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               
kubectl  get pods -o wide
#访问测试
curl 10.244.2.112

#删除pod后,再重建,验证是否依旧可以访问原来的内容
kubectl delete -f pod-hostpath.yaml 

kubectl apply -f pod-hostpath.yaml 

kubectl  get pods -o wide

curl 10.244.1.147

nfs共享存储

另起服务器nfs01节点

#在stor01(192.168.80.15)节点上安装nfs,并配置nfs服务
1.设置主机名
hostnamectl set-hostname nfs01
su

2.关闭防火墙和安全功能
systemctl stop firewalld
setenforce 0

3.创建共享目录并给权限
mkdir -p /data/volume
chmod 777 /data/volume

4.安装nfs,并配置nfs服务
yum install -y rpcbind nfs-utils

vim /etc/exports
/data/volume 192.168.80.0/24(rw,sync,no_root_squash)

5.启动nfs服务并查看本机共享目录
systemctl start rpcbind
systemctl start nfs

showmount -e

6.在共享目录写入网页文件
echo 123456789 > /data/volume/index.html

7.在master节点和node节点配置映射
echo 192.168.80.15 nfs01 >> /etc/hosts

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

kubectl apply -f pod-nfs-vo1.yaml 

kubectl get pods -o wide

#访问cluster ip 
curl 10.244.1.148
kubectl delete pod pod-vo1-nfs 

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

kubectl apply -f pod-nfs-vo1.yaml 

kubectl get pods -o wide

#访问测试
curl  10.244.2.114

以上是关于Kubernetes——存储卷(empyDirhostPathnfs)的主要内容,如果未能解决你的问题,请参考以下文章

如何为kubernetes提供ceph类型的动态存储卷

Kubernetes 学习12 kubernetes 存储卷

在 Kubernetes 的工作节点之间共享存储/卷?

Kubernetes——存储卷(empyDirhostPathnfs)

8kubernetes之存储卷资源

kubernetes的这几种存储卷,别再傻傻分不清了