容器的磁盘的生命周期是短暂的,这就带来了许多问题;第一:当一个容器损坏了,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

Kubernetes --(k8s)volume 数据管理的更多相关文章

  1. Kubernetes K8S之存储Volume详解

    K8S之存储Volume概述与说明,并详解常用Volume示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7.7 2C ...

  2. 《两地书》--Kubernetes(K8s)基础知识(docker容器技术)

    大家都知道历史上有段佳话叫“司马相如和卓文君”.“皑如山上雪,皎若云间月”.卓文君这么美,却也抵不过多情女儿薄情郎. 司马相如因一首<子虚赋>得汉武帝赏识,飞黄腾达之后便要与卓文君“故来相 ...

  3. Docker Kubernetes(K8s)简介

    入职了新公司,使用了Docker和K8s,需要有一个基础的了解,对网络上相关信息进行了简单总结. 一Docker 1简介: Docker 将应用程序与该程序的依赖,打包在一个文件里面.运行这个文件,就 ...

  4. Kubernetes(k8s) docker集群搭建

    原文地址:https://blog.csdn.net/real_myth/article/details/78719244 一.Kubernetes系列之介绍篇   •Kubernetes介绍 1.背 ...

  5. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之集群部署环境规划(一)

    0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.环境规划 软件 版本 ...

  6. k8s volume存储卷(四)

    介绍 volume存储卷是Pod中能够被多个容器访问的共享目录,kubernetes的volume概念,用途和目的与docker的volume比较类似,但两者不能等价,首先,kubernetes中的v ...

  7. Kubernetes(K8s)基础知识(docker容器技术)

    今天谈谈K8s基础知识关键词: 一个目标:容器操作:两地三中心:四层服务发现:五种Pod共享资源:六个CNI常用插件:七层负载均衡:八种隔离维度:九个网络模型原则:十类IP地址:百级产品线:千级物理机 ...

  8. kubernetes(k8s)容器编排工具基础概念

    Kubernetes (K8s): 中文社区:https://www.kubernetes.org.cn/replication-controller-kubernetes 官网:https://ku ...

  9. Kubernetes K8S之通过yaml文件创建Pod与Pod常用字段详解

    YAML语法规范:在kubernetes k8s中如何通过yaml文件创建pod,以及pod常用字段详解 YAML 语法规范 K8S 里所有的资源或者配置都可以用 yaml 或 Json 定义.YAM ...

  10. k8s volume存储卷

    k8s volume存储卷   介绍 volume存储卷是Pod中能够被多个容器访问的共享目录,kubernetes的volume概念,用途和目的与docker的volume比较类似,但两者不能等价, ...

随机推荐

  1. Turtlebot3新手教程-应用-跟随

    本文针对如何利用Turtlebot3可实现的各种应用进行讲解 具体步骤如下: [Remote PC]安装应用包 cd ~/catkin_ws/src git clone https://github. ...

  2. python 虾米停服了...用python爬取虾米最近播放的1000首歌

    1. 虾米关服 在这里插入图片描述 用了5年多的音乐软件就这么说关就关了,确实让人心里不好受 ,虽然再去一个新的app里,让它们的算法熟悉你的喜好也不是很困难,可我还是习惯虾米的界面.虾米现在可以支持 ...

  3. 关于.NET中的控制反转(三)- 依赖注入之 Autofac

    一.Autofac简介 Autofac和其他容器的不同之处是它和C#语言的结合非常紧密,在使用过程中对你的应用的侵入性几乎为零,更容易与第三方的组件集成.Autofac的主要特性如下: 组件侵入性为零 ...

  4. sql查询速度慢分析及如何优化查询

    原因分析后台数据库中数据过多,未做数据优化数据请求-解析-展示处理不当 网络问题提高数据库查询的速度方案SQL 查询速度慢的原因有很多,常见的有以下几种:1.没有索引或者没有用到索引(查询慢最常见的问 ...

  5. MyISAM与InnoDB两者之间区别与选择(转)

    Mysql在V5.1之前默认存储引擎是MyISAM:在此之后默认存储引擎是InnoDB MyISAM:默认表类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Acces ...

  6. 【Oracle】将数据库设为开机自启

    由于某些特殊条件,需要将oracle数据库设置为开机自己,其实很简单 环境:oracle10gR2 1.修改/etc/oratab # This file is used by ORACLE util ...

  7. os-Bytes环境变量劫持

    信息收集 netdiscovery -i eth0 nmap -sV -sC 192.168.43.74 -oA os-Bytes gobuster -u 192.168.43.74 -w /usr/ ...

  8. Empire

    Empire 内网渗透神器 一 基本渗透 安装 git clone https://github.com/BC-SECURITY/Empire/ ./setup/install.sh 启动 ./emp ...

  9. 深入解析vue响应式原理

    摘要:本文主要通过结合vue官方文档及源码,对vue响应式原理进行深入分析. 1.定义 作为vue最独特的特性,响应式可以说是vue的灵魂了,表面上看就是数据发生变化后,对应的界面会重新渲染,那么响应 ...

  10. SAP demo包 示例程序

    在SAP的这个开发类中SABAPDEMOS,存放了N多的demo程序 有空的时候,可以看看.