容器的磁盘的生命周期是短暂的,这就带来了许多问题;第一:当一个容器损坏了,kubelet会重启这个容器,但是数据会随着container的死亡而丢失;第二:当很多容器在同一Pod中运行的时候,经常需要数据共享。kubernets Volume解决了这些问题

kubernets volume的四种类型

  1. emtyDir
  2. hostPath
  3. NFS
  4. pv/pvc

https://www.kubernetes.org.cn/kubernetes-volumes


emtyDir

第一步:编写yml文件

╭─root@node1 ~
╰─➤ vim nginx-empty.yml apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
volumeMounts:
- name: du # 对应
mountPath: /usr/share/nginx/html
volumes:
- name: du # 对应
emptyDir: {}

第二步:运行yml文件

╭─root@node1 ~
╰─➤ kubectl apply -f nginx-empty.yml

第三步:查看pod

╭─root@node1 ~
╰─➤ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 7m18s 10.244.2.14 node3 <none> <none>

第四步:到node3节点查看容器详细信息

# docker ps 

╭─root@node3 ~
╰─➤ docker inspect 9c3ed074fb29| grep "Mounts" -A 8
"Mounts": [
{
"Type": "bind",
"Source": "/var/lib/kubelet/pods/2ab6183c-eddd-44eb-9e62-ded5106d1d1a/volumes/kubernetes.io~empty-dir/du",
"Destination": "/usr/share/nginx/html",
"Mode": "Z",
"RW": true,
"Propagation": "rprivate"
},

第五步:写入内容

╭─root@node3 ~
╰─➤ cd /var/lib/kubelet/pods/2ab6183c-eddd-44eb-9e62-ded5106d1d1a/volumes/kubernetes.io~empty-dir/du
╭─root@node3 /var/lib/kubelet/pods/2ab6183c-eddd-44eb-9e62-ded5106d1d1a/volumes/kubernetes.io~empty-dir/du
╰─➤ ls
╭─root@node3 /var/lib/kubelet/pods/2ab6183c-eddd-44eb-9e62-ded5106d1d1a/volumes/kubernetes.io~empty-dir/du
╰─➤ echo "empty test" >> index.html

第六步:访问

╭─root@node1 ~
╰─➤ curl 10.244.2.14
empty test

第七步:停掉容器

╭─root@node3 ~
╰─➤ docker stop 9c3ed074fb29
9c3ed074fb29

第八步:查看新起来的容器

╭─root@node3 ~
╰─➤ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
14ca410ad737 5a3221f0137b "nginx -g 'daemon of…" About a minute ago Up About a minute k8s_nginx_nginx_default_2ab6183c-eddd-44eb-9e62-ded5106d1d1a_1

第九步:查看pod 信息 并访问

╭─root@node1 ~
╰─➤ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 1 40m 10.244.2.14 node3 <none> <none>
╭─root@node1 ~
╰─➤ curl 10.244.2.14
empty test

第十步:删除pod

╭─root@node1 ~
╰─➤ kubectl delete pod nginx
pod "nginx" deleted

第十一步:查看emptyDir

╭─root@node3 ~
╰─➤ ls /var/lib/kubelet/pods/2ab6183c-eddd-44eb-9e62-ded5106d1d1a/volumes/kubernetes.io~empty-dir/du ls: cannot access /var/lib/kubelet/pods/2ab6183c-eddd-44eb-9e62-ded5106d1d1a/volumes/kubernetes.io~empty-dir/du: No such file or directory

emptyDir实验总结

  1. 写入文件可以访问说明文件已经同步
  2. 停到原容器后,kubelet新建一容器。
  3. 访问仍成功说明数据没有随容器的死亡而丢失
  4. emptyDir 寿命与pods 同步

hostPath

效果相当于执行: docker run -v /tmp:/usr/share/nginx/html

第一步:编写yml文件

apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
volumeMounts:
- name: du # 对应
mountPath: /usr/share/nginx/html
volumes:
- name: du # 对应
hostPath:
path: /tmp

第二步:运行yml文件

╭─root@node1 ~
╰─➤ kubectl apply -f nginx-hostP.yml
pod/nginx2 created

第三步:查看pods

╭─root@node1 ~
╰─➤ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx2 1/1 Running 0 55s 10.244.2.15 node3 <none> <none>

第四步:pod所在节点写入测试文件

╭─root@node3 ~
╰─➤ echo "hostPath test " >> /tmp/index.html

第五步: 访问

╭─root@node1 ~
╰─➤ curl 10.244.2.15
hostPath test

第六步:删除pods

╭─root@node1 ~
╰─➤ kubectl delete -f nginx-hostP.yml
pod "nginx2" deleted

第七步:查看测试文件

╭─root@node3 ~
╰─➤ cat /tmp/index.html
hostPath test

hostPath实验总结

  1. 一个hostPath类型的磁盘就是挂在了主机的一个文件或者目录
  2. 注意:从模版文件中创建的pod可能会因为主机上文件夹目录的不同而导致一些问题,因为挂载的目录是pod宿主机的某个目录。

NFS

第一步:部署nfs (每个节点安装nfs)

╭─root@node1 ~
╰─➤ yum install nfs-utils rpcbind -y
╭─root@node1 ~
╰─➤ cat /etc/exports
/tmp *(rw)
╭─root@node1 ~
╰─➤ chown -R nfsnobody: /tmp
╭─root@node1 ~
╰─➤ systemctl restart nfs rpcbind ----------------------------------------------
╭─root@node2 ~
╰─➤ yum install nfs-utils -y
----------------------------------------------
╭─root@node3 ~
╰─➤ yum install nfs-utils -y

第二步:编写yml文件

apiVersion: v1
kind: Pod
metadata:
name: nginx2
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
volumeMounts:
- name: du # 对应
mountPath: /usr/share/nginx/html
volumes:
- name: du # 对应
nfs:
path: /tmp
server: 192.168.137.3

第三步:运行yml文件

╭─root@node1 ~
╰─➤ kubectl apply -f nginx-nfs.yml
pod/nginx2 created

第四步:查看pod信息

╭─root@node1 ~
╰─➤ kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx2 1/1 Running 0 5m46s 10.244.2.16 node3 <none> <none>

第五步:编写测试文件

╭─root@node1 ~
╰─➤ echo "nfs-test" >> /tmp/index.html

第六步:访问

╭─root@node1 ~
╰─➤ curl 10.244.2.16
nfs-test

pv/pvc

第一步:部署NFS

第二步:编写pv的yml文件

apiVersion: v1
kind: PersistentVolume
metadata:
name: mypv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
nfs:
path: /tmp
server: 192.168.137.3
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc1
spec:
accessModes:
- ReadWriteMany
volumeName: mypv
resources:
requests:
storage: 1Gi

accessModes有三类

  • ReadWriteOnce – 可以被单个节点进行读写挂载
  • ReadOnlyMany – 可以被多个节点进行只读挂载
  • ReadWriteMany – 可以被多个节点进行读写挂载

reclaim policy有三类

  • retain – pvc被删除之后,数据保留
  • recyle- 删除pvc之后会删除数据(被废弃)
  • delete – 删除pvc之后会删除数据

第三步:执行yml文件 创建pv/pvc

╭─root@node1 ~
╰─➤ vim pv-pvc.yml
╭─root@node1 ~
╰─➤ kubectl apply -f pv-pvc.yml
persistentvolume/mypv created
persistentvolumeclaim/mypvc1 created

第四步:查看

╭─root@node1 ~
╰─➤ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
mypv 1Gi RWX Retain Bound default/mypvc1 68s
╭─root@node1 ~
╰─➤ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mypvc1 Bound mypv 1Gi RWX 78s

使用pvc

第五步:编写nginx的yml文件

apiVersion: v1
kind: Pod
metadata:
name: nginx3
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
volumeMounts:
- name: du # 对应
mountPath: /usr/share/nginx/html
volumes:
- name: du # 对应
persistentVolumeClaim:
claimName: mypvc1

第六步:执行yml文件

╭─root@node1 ~
╰─➤ kubectl apply -f nginx-pv.yml
pod/nginx3 created

第七步:查看pod

╭─root@node1 ~
╰─➤ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx3 1/1 Running 0 3m45s 10.244.2.17 node3 <none> <none>

第八步:编写访问文件并访问

╭─root@node1 ~
╰─➤ echo "pv test" > /tmp/index.html ╭─root@node1 ~
╰─➤ curl 10.244.2.17
pv test

删除一直处于terminating状态的pod

我这里的pod是与nfs有关,nfs挂载有问题导致pod有问题,执行完删除命令以后看到pod一直处于terminating的状态。

这种情况下可以使用强制删除命令:

kubectl delete pod [pod name] --force --grace-period=0 -n [namespace]

# 注意:必须加-n参数指明namespace,否则可能报错pod not found

演示:

╭─root@node1 ~
╰─➤ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx3 0/1 Terminating 0 7d17h ╭─root@node1 ~
╰─➤ kubectl delete pod nginx3 --force --grace-period=0 -n default
warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
pod "nginx3" force deleted

最新文章

  1. Spring容器深入(li)
  2. RecyclerView因版本问题无法加载
  3. 转 nutch网页快照乱码解决方法
  4. CSS 伪元素&amp;伪类
  5. 正则表达式(http://tieba.baidu.com/p/882391125)
  6. KVM虚拟机virsh常用参数
  7. crossdomain.xml的配置详解
  8. iOS使用静态变量
  9. 关于VS2012下安装破解文件Visual Assit X的一点说明
  10. xerox Network system
  11. Android ListView列表控件的简单使用
  12. paramiko 模块安装
  13. 使用vue-cli构建多页面应用+vux(一)
  14. Python数据分析(二): Numpy技巧 (4/4)
  15. 调用脚本的方式自动的创建或者是更新oracle数据库自带的Seq序列号的值
  16. MongoDB - Indexes
  17. JS 如何将 HTML 页面导出为多页 PDF
  18. JVM内存区域的划分(内存结构或者内存模型)
  19. DNA计算机及DNA存储
  20. 第3章 文件I/O(2)_文件I/O系统调用及文件描述符

热门文章

  1. CentOS8设置网络镜像安装源
  2. 浅入 .NET Core 中的内存和GC知识
  3. 深入了解MySQL主从复制的原理
  4. PHP 清除缓存文件
  5. 【Vue】Vue开发环境搭建
  6. 【ORACLE】删除表空间,没有删除数据文件怎么办?解决办法
  7. 【Oracle】10.2.0.1升级到10.2.0.5
  8. 企业项目迁移go-zero全攻略(一)
  9. Eclipse中给jar包导入JavaDoc的方法
  10. SparkStreaming和Kafka基于Direct Approach如何管理offset实现exactly once