容器的磁盘的生命周期是短暂的,这就带来了许多问题;第一:当一个容器损坏了,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. 一次mongo查询不存在字段引发的事故

    话说今天的一个小小的查询失误给了我比较深刻的教训,也让我对mongo有了更深刻的理解,下面我们来说说这个事情的原委: 我们经常使用阿里云子账号在DMS上查询线上数据库数据,今天也是平常的一次操作 集合 ...

  2. VMware虚拟机安装黑群晖DSM6.2 (转)

    安装DSM6.2.和安装5.1的过程大致相同,只是在虚拟机的配置时有所不同. 需要用到的工具 Roadkil's Disk Image – 写镜像工具:http://www.roadkil.net/p ...

  3. APACHE如何里一个站点绑定多个域名?用ServerAlias 转

    APACHE2如何里一个站点绑定多个域名?用ServerAlias以前很笨,要使多个域名指向同一站点总是这样写:<VirtualHost *:80>ServerAdmin i@kuigg. ...

  4. C#:使用连接字符串连接数据库

    前言:在上学期选择专业时候,选择的是互联网(还有物联网),这学期相关课程便是使用c#完成一个管理系统:最近的作业是完成一个对数据库操作类,操作数据库?虽然是很简单的一个作业,但也是懵逼了很久,在网上找 ...

  5. 3.k8s存储之ConfigMap、Secret

    1.ConfigMap ConfigMap 功能在 Kubernetes1.2 版本中引入,许多应用程序会从配置文件.命令行参数或环境变量中读取配置信息.ConfigMap API 给我们提供了向容器 ...

  6. lcobucci/jwt的安装和使用

    安装 composer require lcobucci/jwt 3.3 封装 <?php namespace tools\jwt; use Lcobucci\JWT\Builder; use ...

  7. 【SpringMVC】SpringMVC 入门

    SpringMVC 入门 文章源码 SpringMVC 基本概念 在 JavaEE 开发中,几乎全都是基于 B/S 架构的开发.在 B/S 架构中,系统标准的三层架构包括:表现层.业务层.持久层. 表 ...

  8. python模块/文件/日期时间

    文件操作:

  9. 【Linux】rsync中sending incremental file list时间优化

    每次使用rsync的时候,前面出现sending incremental file list 这句之后要等待很长时间 查了很多帖子和官方文档后,发现是-c这个选项的问题, -v, --verbose ...

  10. 【VNC】vnc安装oracle的时候不显示图形化界面

    背景: 在虚拟机搭建了一个环境,准备安装oracle.但是环境都配置完成后,执行./runInstaller的时候,没有界面显示,只显示下面的界面 多次尝试后,发现,还是这样,期初是因为没有配置DIS ...