存储卷

pod运行状态分为四种:

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

存储的分类

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

gitrepo:本质上还是一个emptyDir,创建的那一刻从git上clone下来文件,不会在更新,所以会借助sidecar容器来更新或者推送目录中的文件代码

hostPath :挂载到宿主机目录,

  • 应用场景

一. 某些应用需要用到docker的内部文件,这个时候只需要挂在本机的/var/lib/docker作为hostPath!!!!!!

二. 在容器中运行cAdvisor,这个时候挂在/dev/cgroups!!!!!!

传统的SAN或者NAS设备:SAN(iSCSI...),NAS(nfs,cifs)

分布式存储:glusterfs, ceph-rbd, cephfs。

云存储:EBS,Azure Disk

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的卷挂载到该pod的 /usr/share/nginx/html/ 目录下
- name: busybox
image: busybox:latest
imagePullPolicy: IfNotPresent
volumeMounts:
- name: html
mountPath: /data/ # busybox 容器中,,把名称为html的卷挂载到该pod的 /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 不限制空间大小。

由于事例中myapp容器和busybox容器共用同一个卷(html卷),所以当busybox容器生成了新index.html时,myapp容器就能访问到,配置中的mountPath只是针对该容器内的挂载

创建

[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

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

hostpath实例

可实现针对某一节点的数据持久化,如果节点宕机了,那数据就丢失了

apiVersion: v1
kind: Pod
metadata:
name: pod-volume-hostpath
namespace: default
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: html
hostPath:
path: /data/pod/volume1
type: DirectoryOrCreate

Pod测试挂在共享NFS

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

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

启动测试

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

注意

需要在所有节点安装 `nfs-utils` 组件,否则当Pod被分配到没有组件的节点,会启动失败,因为没有`mount.nfs`
[root@node2 ~]# yum install -y nfs-utils
[root@node2 ~]# mount -t nfs node1:/data/volumes /mnt #在每个节点上执行挂载 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: 172.27.1.241

创建查看

[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: 172.27.1.241
accessModes: ["ReadWriteMany", "ReadWriteOnce"] # 权限
capacity:
storage: 2Gi # PV空间大小
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv002
labels:
name: pv002
spec:
nfs:
path: /data/volumes/v2
server: 172.27.1.241
accessModes: ["ReadWriteMany"]
capacity:
storage: 5Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv003
labels:
name: pv003
spec:
nfs:
path: /data/volumes/v3
server: 172.27.1.241
accessModes: ["ReadWriteMany", "ReadWriteOnce"]
capacity:
storage: 20Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv004
labels:
name: pv004
spec:
nfs:
path: /data/volumes/v4
server: 172.27.1.241
accessModes: ["ReadWriteMany", "ReadWriteOnce"]
capacity:
storage: 10Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv005
labels:
name: pv005
spec:
nfs:
path: /data/volumes/v5
server: 172.27.1.241
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

八,kubernetes集群存储卷基础。的更多相关文章

  1. 二进制文件方式安装kubernetes集群

    所有操作全部用root使用者进行,高可用一般建议大于等于3台的奇数,我们使用3台master来做高可用 练习环境说明: 参考GitHub master: kube-apiserver,kube-con ...

  2. 二,kubernetes集群的安装初始化

    目录 部署 集群架构示意图 部署环境 kubernetes集群部署步骤 基础环境 基础配置 安装基础组件 配置yum源 安装组件 初始化 master 设置docker和kubelet为自启动(nod ...

  3. k8s教程:Kubernetes集群使用网络存储NFS

    NFS存储 NFS即网络文件系统Network File System,它是一种分布式文件系统协议,最初是由Sun MicroSystems公司开发的类Unix操作系统之上的一款经典网络存储方案,其功 ...

  4. 使用Minikube部署本地Kubernetes集群(二十八)

    前言 使用Minikube部署本地k8s集群相对比较简单,非常推荐将其用于本地k8s开发环境,唯一麻烦点的仅仅是网络问题. 在本篇教程中,我们使用了国内的镜像来完成本地k8s集群的搭建.如果搭建过程中 ...

  5. 高可用Kubernetes集群-15. 部署Kubernetes集群统一日志管理

    参考文档: Github:https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/fluentd-elasticsear ...

  6. 基于kubernetes集群的Vitess最佳实践

    概要 本文主要说明基于kubernetes集群部署并使用Vitess; 本文假定用户已经具备了kubernetes集群使用环境,如果不具备请先参阅基于minikube的kubernetes集群搭建, ...

  7. 基于minikube的kubernetes集群部署及Vitess最佳实践

    简介 minikube是一个可以很容易在本地运行Kubernetes集群的工具, minikube在电脑上的虚拟机内运行单节点Kubernetes集群,可以很方便的供Kubernetes日常开发使用: ...

  8. Kubernetes集群的部署方式及详细步骤

    一.部署环境架构以及方式 第一种部署方式 1.针对于master节点 将API Server.etcd.controller-manager.scheduler各组件进行yum install.编译安 ...

  9. 阿里巴巴大规模神龙裸金属 Kubernetes 集群运维实践

    作者 | 姚捷(喽哥)阿里云容器平台集群管理高级技术专家 本文节选自<不一样的 双11 技术:阿里巴巴经济体云原生实践>一书,点击即可完成下载. 导读:值得阿里巴巴技术人骄傲的是 2019 ...

随机推荐

  1. delphi读写INI系统配置文件

    delphi读写INI系统配置文件 一.调用delphi内建单元 uses System.IniFiles; .使用类TIniFile .类TIniFile的主要方法和函数: {$IFDEF MSWI ...

  2. vue中打包之后的dist文件不放在服务器的根目录下

    在工作当中,我使用webpack打包的dist,由于管理的问题,无法被放在服务器根目录下 ,但在目前的vue配置,dist不放在根目录下,访问页面会成为一片空白,于是便要对vue框架的config进行 ...

  3. #学习笔记:CentOS7学习之十三(2):磁盘介绍与管理

    1.磁盘分区工具与挂载 1.1 硬盘分区符认识: MBR概述:全称为Master Boot Record,即硬盘的主引导记录. 硬盘的0柱面.0磁头.1扇区称为主引导扇区(也叫主引导记录MBR).它由 ...

  4. 智能指针分析及auto_ptr源码

    简介 C++没有内存自动回收机制,对堆内存的管理就是简单的new和delete,每次new出来的内存都需要手动delete释放.但由于忘记.流程复杂或者异常退出等,都有可能导致没有执行delete释放 ...

  5. 基于SpringBoot从零构建博客网站 - 整合ehcache和开发注册登录功能

    对于程序中一些字典信息.配置信息应该在程序启动时加载到缓存中,用时先到缓存中取,如果没有命中,再到数据库中获取同时放到缓存中,这样做可以减轻数据库层的压力.目前暂时先整合ehcache缓存,同时预留了 ...

  6. java水题集

    POJ - 1220 进制转换 import java.io.*; import java.util.*; import java.math.*; public class Main { public ...

  7. jQuert DOM操作

    DOM操作 1 内部插入 append(content|fn) 向每个匹配的元素内部追加内容 appendTo(content) 把所有匹配的元素追加到另一个指定的元素元素集合中 prepend(co ...

  8. AI面试必备/深度学习100问1-50题答案解析

    AI面试必备/深度学习100问1-50题答案解析 2018年09月04日 15:42:07 刀客123 阅读数 2020更多 分类专栏: 机器学习   转载:https://blog.csdn.net ...

  9. C#中判断文件夹或文件是否存在的方法

    一.根据虚拟路径获取文件物理路径: string savePath = Server.MapPath("~/Uploads/RemoteDatum/"); 二.判断文件夹是否存在 ...

  10. [转载]java的传值和传引用

    本文转载自:https://blog.csdn.net/weixin_36759405/article/details/82764339 基本类型(byte,short,int,long,double ...