存储卷

分为四种:

  1. 有状态,需要存储
  2. 有状态,无需存储
  3. 无状态,需要存储
  4. 无状态,无需存储

Pod挂载在本地的磁盘或者内存,被称为emptyDIr ,称为临时空目录,随着Pod删除,也会被删除。

hostPath 主机目录,在Pod容器中能看到宿主机目录数据。

分布式存储:

glusterfs, ceph-rbd, cephfs

emptyDir 测试及使用

emptyDir 表示使用的是本地磁盘或者内存(如果是内存,则表示当做缓存来使用).

创建相应的清单文件如下:

[root@master volume]# cat pod-vol-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-demo
namespace: default
labels:
app: myapp
tier: frontend
annotations:
jubaozhu.com/created-by: "cluster admin"
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html/ # myapp 容器中,把名称为html的卷挂载到 /usr/share/nginx/html/ 目录下
- name: busybox
image: busybox:latest
imagePullPolicy: IfNotPresent
volumeMounts:
- name: html
mountPath: /data/ # busybox 容器中,,把名称为html的卷挂载到 /data/ 目录下
command: ["/bin/sh", "-c", "while true; do echo $$(date) >> /data/index.html; sleep 2; done"] # 这里的往 /data/index.html 写入时间,用于myapp容器中web访问使用
volumes:
- name: html # 创建一个名称为html的volumes
emptyDir: {} # 这里一个空字典,表示 emptyDir下的 medium 使用默认参数 和 sizeLimit 不限制空间大小。

创建

[root@master volume]# kubectl apply -f pod-vol-demo.yaml
pod/pod-demo created
[root@master volume]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-demo 2/2 Running 0 29s 10.244.2.25 node02.kubernetes <none> <none>

测试访问Pod 对应的 ip

[root@master volume]# curl 10.244.2.25
Thu Aug 1 08:41:18 UTC 2019
Thu Aug 1 08:41:20 UTC 2019
Thu Aug 1 08:41:22 UTC 2019
Thu Aug 1 08:41:24 UTC 2019
Thu Aug 1 08:41:26 UTC 2019
Thu Aug 1 08:41:28 UTC 2019
Thu Aug 1 08:41:30 UTC 2019
Thu Aug 1 08:41:32 UTC 2019
Thu Aug 1 08:41:34 UTC 2019
Thu Aug 1 08:41:36 UTC 2019
Thu Aug 1 08:41:38 UTC 2019
Thu Aug 1 08:41:40 UTC 2019
Thu Aug 1 08:41:42 UTC 2019
Thu Aug 1 08:41:44 UTC 2019
Thu Aug 1 08:41:46 UTC 2019
Thu Aug 1 08:41:48 UTC 2019
Thu Aug 1 08:41:50 UTC 2019
Thu Aug 1 08:41:52 UTC 2019

可以看到写如和访问都正常,达到了期望的效果。

Pod测试挂在共享NFS

本次测试,在master节点上安装了 NFS,配置如下

[root@master volume]# cat /etc/exports
/data/volumes *(rw,no_root_squash)

启动测试

[root@master data]# systemctl start rpcbind
[root@master data]# systemctl start nfs
[root@master data]# showmount -e localhost
Export list for localhost:
/data/volumes 0.0.0.0/0

注意

需要在所有节点安装 `nfs-utils` 组件,否则当Pod被分配到没有组件的节点,会启动失败,因为没有`mount.nfs`

写入测试页面

[root@master volume]# echo '<h1>NFS stor01</h1>' > /data/volumes/index.html

写测试清单

[root@master volume]# cat pod-vol-nfs.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-vol-nfs
namespace: default
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html/
volumes:
- name: html
nfs:
path: /data/volumes
server: 10.0.20.20

创建查看

[root@master volume]# kubectl apply -f pod-vol-nfs.yaml
pod/pod-vol-nfs created
[root@master volume]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-hostpath-vol 1/1 Running 0 88m 10.244.3.32 node01.kubernetes <none> <none>
pod-vol-nfs 1/1 Running 0 5s 10.244.1.29 node03.kubernetes <none> <none>

可以看到Pod分配在 node03 节点上

测试

测试访问

[root@master volume]# curl 10.244.1.29
<h1>NFS stor01</h1> # 访问正常

删除Pod后再次创建测试

[root@master volume]# kubectl delete -f pod-vol-nfs.yaml
pod "pod-vol-nfs" deleted
[root@master volume]# kubectl apply -f pod-vol-nfs.yaml
pod/pod-vol-nfs created
[root@master volume]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-hostpath-vol 1/1 Running 0 90m 10.244.3.32 node01.kubernetes <none> <none>
# 下面的数据可以看到Pod分配在 node02 上
pod-vol-nfs 1/1 Running 0 2s 10.244.2.27 node02.kubernetes <none> <none>
[root@master volume]# curl 10.244.2.27
<h1>NFS stor01</h1> # 测试访问正常

pv, pvc

PV 是属于集群资源, 在集群中所有名称空间都可用, 全程 PersistentVolume.

PVC 是名称空间级别, 也就是一个标准资源类,全程 PersistentVolumeClaim.

在Pod定义PVC, 之后会根据定义的容量大小,PVC会自动绑定对应大于等于某一个PV.

创建几个PV

[root@master volumes]# mkdir /data/volumes/v{1,2,3,4,5} -p
[root@master volume]# cat pv-demo.yaml
apiVersion: v1
kind: PersistentVolume # 资源名称
metadata:
name: pv001 # PV 的名称
labels:
name: pv001 # 标签
spec:
nfs:
path: /data/volumes/v1 # PV所对应的目录
server: 10.0.20.20
accessModes: ["ReadWriteMany", "ReadWriteOnce"] # 权限
capacity:
storage: 2Gi # PV空间大小
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv002
labels:
name: pv002
spec:
nfs:
path: /data/volumes/v2
server: 10.0.20.20
accessModes: ["ReadWriteMany"]
capacity:
storage: 5Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv003
labels:
name: pv003
spec:
nfs:
path: /data/volumes/v3
server: 10.0.20.20
accessModes: ["ReadWriteMany", "ReadWriteOnce"]
capacity:
storage: 20Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv004
labels:
name: pv004
spec:
nfs:
path: /data/volumes/v4
server: 10.0.20.20
accessModes: ["ReadWriteMany", "ReadWriteOnce"]
capacity:
storage: 10Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv005
labels:
name: pv005
spec:
nfs:
path: /data/volumes/v5
server: 10.0.20.20
accessModes: ["ReadWriteMany", "ReadWriteOnce"]
capacity:
storage: 10Gi

创建查看

[root@master volume]# kubectl apply -f pv-demo.yaml
persistentvolume/pv001 created
persistentvolume/pv002 created
persistentvolume/pv003 created
persistentvolume/pv004 created
persistentvolume/pv005 created
[root@master volume]# kubectl get pv -o wide
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE VOLUMEMODE
pv001 2Gi RWO,RWX Retain Available 51s Filesystem
pv002 5Gi RWX Retain Available 29s Filesystem
pv003 20Gi RWO,RWX Retain Available 29s Filesystem
pv004 10Gi RWO,RWX Retain Available 29s Filesystem
pv005 10Gi RWO,RWX Retain Available 51s Filesystem

创建测试的Pod 和 PVC

[root@master volume]# cat pod-vol-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim # PVC资源
metadata:
name: mypvc
namespace: default # 名称空间
spec:
accessModes: ["ReadWriteMany"] # 权限
resources:
requests:
storage: 6Gi # 定义的磁盘空间带下
---
apiVersion: v1
kind: Pod
metadata:
name: pod-vol-pvc
namespace: default
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html/
volumes:
- name: html
persistentVolumeClaim:
claimName: mypvc

创建和查看 PVC PV 状态

[root@master volume]# kubectl apply -f pod-vol-pvc.yaml
persistentvolumeclaim/mypvc created
pod/pod-vol-pvc created
[root@master volume]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod-vol-pvc 1/1 Running 0 3s
[root@master volume]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mypvc Bound pv005 10Gi RWO,RWX 36s # 这里看到PVC 已经正常绑定了一个PV,PV名称是 pv005, 空间是 10G
[root@master volume]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv001 2Gi RWO,RWX Retain Available 9m37s
pv002 5Gi RWX Retain Available 9m15s
pv003 20Gi RWO,RWX Retain Available 9m15s
pv004 10Gi RWO,RWX Retain Available 9m15s
pv005 10Gi RWO,RWX Retain Bound default/mypvc 9m37s # 这里看到状态是 Bound, 回收策略是 Retain

08-kubernetes 存储卷的更多相关文章

  1. kubernetes 存储卷

    kubernetes 存储卷    数据卷用于实现容器持久化数据,Kubernetes对于数据卷重新定义,提供了丰富强大的功能.在Kubernetes系统中,当Pod重建的时候,数据卷会丢失,Kube ...

  2. (九)Kubernetes 存储卷

    Kubernetes存储卷概述 Pod本身具有生命周期,这就带了一系列的问题,第一,当一个容器损坏之后,kubelet会重启这个容器,但是文件会丢失-这个容器会是一个全新的状态:第二,当很多容器在同一 ...

  3. Kubernetes 存储卷详解

    转载自:https://mp.weixin.qq.com/s/Ywx3ju6FP0IShOgI757XYA Volumes 默认情况下容器中的磁盘文件是非持久化的,对于运行在容器中的应用来说面临两个问 ...

  4. Kubernetes 学习12 kubernetes 存储卷

    一.概述 1.我们此前讲过根据应用本身是否需要持久存储数据以及某一次请求和之前的请求是否有联系,可以分为四类应用 a.有状态,要存储 b.有状态,无持久存储 c.无状态,要存储 d.无状态,无持久存储 ...

  5. Kubernetes 存储卷管理 PV&PVC(十)

    目录 一.emptyDir 二.hostPath 三.PV & PVC 1.NFS PersistentVolume 2.创建 PVC 3.创建 Pod 进行挂载 为了持久化保存容器的数据,可 ...

  6. 从零开始入门 K8s | Kubernetes 存储架构及插件使用

    本文整理自<CNCF x Alibaba 云原生技术公开课>第 21 讲. 导读:容器存储是 Kubernetes 系统中提供数据持久化的基础组件,是实现有状态服务的重要保证.Kubern ...

  7. 第21 章 : Kubernetes 存储架构及插件使用

    Kubernetes 存储架构及插件使用 本文将主要分享以下三方面的内容: Kubernetes 存储体系架构: Flexvolume 介绍及使用: CSI 介绍及使用. Kubernetes 存储体 ...

  8. 八,kubernetes集群存储卷基础。

    目录 存储卷 存储的分类 emptyDir 测试及使用 hostpath实例 Pod测试挂在共享NFS 写测试清单 测试 pv, pvc 创建几个PV 创建测试的Pod 和 PVC 存储卷 pod运行 ...

  9. kubernetes系列12—二个特色的存储卷configmap和secret

    本文收录在容器技术学习系列文章总目录 1.configmap 1.1 认识configmap ConfigMap用于保存配置数据的键值对,可以用来保存单个属性,也可以用来保存配置文件.ConfigMa ...

  10. kubernetes系列10—存储卷详解

    本文收录在容器技术学习系列文章总目录 1.认识存储卷 1.1 背景 默认情况下容器中的磁盘文件是非持久化的,容器中的磁盘的生命周期是短暂的,这就带来了一系列的问题:第一,当一个容器损坏之后,kubel ...

随机推荐

  1. Java基础系列二:Java泛型

    该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 一.泛型概述 1.定 ...

  2. Jenkins 结合 ANT 发送测试报告

    全局变量配置 点击 ManageJenkins进入Jenkins 管理 点击 Global Tool Configuration 进入全局变量配置 配置 Ant ,Name 自己定义一个比较好理解的名 ...

  3. 学习笔记51_MongoDB使用

    MongoDB的包: 例如:设置Mongodb端口 在命令行: F:\MongoDB>mongod.exe --port:3306 做集群: 安装和使用: 1.在服务中添加MongoDB ( 指 ...

  4. [考试反思]1011csp-s模拟测试68:守恒

    在RP守恒定律的持续作用下, 不出所料,这场稍炸 还有10分钟就是下一场了,但愿继续守恒? 改题太慢了,连写博的时间都没有了 然而最后还是在吃饭前彻彻底底改出来了 的确是个菜鸡 所以今天的题解只能先咕 ...

  5. Oracle“ORA-00911: 无效字符”解决方式

    在工作中碰到ORA-00911:无效字符的问题, 代码如下: <select id="querySendMsg" parameterType="map" ...

  6. 使用Typescript重构axios(二十三)——添加withCredentials属性

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  7. P3097 [USACO13DEC]最优挤奶(线段树优化dp)

    盲猜dp系列... 题意:给定序列,选了i就不能选与i相邻的两个,求最大值,带修改 蒟蒻在考场上10min打完以为只有两种情况的错解...居然能骗一点分... 先讲下当时的思路吧. f[i][0/1] ...

  8. 大数据之路day01_3--JAVA语言基础(1)

    从这里开始,正式进入正轨 1.关键字  2.main main是关键字吗? 不是,他只是一个标识符,只不过有点特殊,虚拟机可以识别. main(主函数)的作用 1:可以保证程序的独立运行 2:是程序的 ...

  9. Python基本数据结构之字典嵌套(例子)

    北京城市地区之间的嵌套 # coding=gbk #Created on 2019/5/20 #@author: XiaoHu menu = { '北京': { '朝阳': { '国贸': { 'CI ...

  10. docker监控容器

    Weave Scope: 是能够自动生成一张 Docker 容器web动态图的监控软件,能够让我们直观地理解.监控和控制容器. 监控一台主机: 第一步:安装 [root@localhost ~]# c ...