Kubernetes——存储卷(empyDirhostPathnfs)

【Kubernetes——存储卷(empyDirhostPathnfs)】非淡泊无以明志,非宁静无以致远。这篇文章主要讲述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.yamlapiVersion: 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: ========================================================== kubectlapply -f pod-emptydir.yamlkubectl get pods -o wide #在上面定义了两个容器,其中一个容器输入日期到index.html中,然后验证范围nginx的htmnl是否可以获取日期 #同时,在进入两个容器里,查看挂载数据卷的目录的数据,以验证两个容器之间挂载的emptyDir实现共享kubectlexec-itpod-emptydir -c busybox sh cat /data/index.html kubectlexec-itpod-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

kubectlget pods -o wide #访问测试 curl 10.244.2.112#删除pod后,再重建,验证是否依旧可以访问原来的内容 kubectl delete -f pod-hostpath.yaml kubectl apply -f pod-hostpath.yaml kubectlget pods -o widecurl 10.244.1.147

nfs共享存储 另起服务器nfs01节点
#在stor01(192.168.80.15)节点上安装nfs,并配置nfs服务 1.设置主机名 hostnamectl set-hostname nfs01 su2.关闭防火墙和安全功能 systemctl stop firewalld setenforce 03.创建共享目录并给权限 mkdir -p /data/volume chmod 777 /data/volume4.安装nfs,并配置nfs服务 yum install -y rpcbind nfs-utilsvim /etc/exports /data/volume 192.168.80.0/24(rw,sync,no_root_squash)5.启动nfs服务并查看本机共享目录 systemctl start rpcbind systemctl start nfsshowmount -e6.在共享目录写入网页文件 echo 123456789 > /data/volume/index.html7.在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: stor01kubectl 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.yamlapiVersion: 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: stor01kubectl apply -f pod-nfs-vo1.yaml kubectl get pods -o wide#访问测试 curl10.244.2.114


    推荐阅读