理解 Kubernetes volume 和 共享存储
1. Kubernetes volume
文章 介绍了 Docker volume。与 docker volume 类似的,在 kubernetes 中存在 Pod 级别的 volume,Pod 的 container 可共享 volume,不同 Pod 可以共享同一 volume。
首先看一看单机上的 volume 类型 emptyDir 和 hostPath。
1.1 emptyDir volume
emptyDir volume 将 node 上的目录挂载到容器中,容器对该目录的读写将映射到 node 上。创建 emptyDir volume 类型的 Pod:
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpd
spec:
replicas: 2
selector:
matchLabels:
app: web_server
template:
metadata:
labels:
app: web_server
spec:
volumes:
- name: logs
emptyDir: {}
containers:
- name: httpd-chunqiu
image: docker.io/jocatalin/kubernetes-bootcamp:v1
volumeMounts:
- name: logs
mountPath: /mnt/log
创建了一个名为 logs 的 emptyDir volume,并将该 volume 映射到 node 上的 /mnt/log 目录。查看容器信息:
[root@k8s-master-node-1 kubernetes]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
httpd-6b55656b88-2xdsf 1/1 Running 0 18m 10.40.0.3 k8s-worker-node-1.novalocal <none> <none>
httpd-6b55656b88-7mfzc 1/1 Running 0 18m 10.32.0.4 k8s-worker-node-2.novalocal <none> <none>
部署的两个 Pod 分别建在 node1 和 node2 上,根据前面 emptyDir volume 的描述,两个 pod 应该是使用不同 node 上的 volume 目录。登陆到 node 上查看 volume 详情:
// 登陆到 node1
[root@k8s-master-node-1 centos]# kubectl exec -it httpd-6b55656b88-2xdsf /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@httpd-6b55656b88-2xdsf:/mnt/log# touch node1
[root@k8s-worker-node-1 centos]# docker inspect 769ed953f27d
{
"Type": "bind",
"Source": "/var/lib/kubelet/pods/aa5e141d-2999-4b13-8641-270d6fe13023/volumes/kubernetes.io~empty-dir/logs",
"Destination": "/mnt/log",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
...
[root@k8s-worker-node-1 logs]# ls /var/lib/kubelet/pods/aa5e141d-2999-4b13-8641-270d6fe13023/volumes/kubernetes.io~empty-dir/logs
node1
// 登陆到 node2
[root@k8s-master-node-1 centos]# kubectl exec -it httpd-6b55656b88-7mfzc /bin/bash
root@httpd-6b55656b88-7mfzc:/mnt/log# touch node2
[root@k8s-worker-node-2 centos]# docker inspect 7944a981a7f4
{
"Type": "bind",
"Source": "/var/lib/kubelet/pods/bceba261-210d-465d-9774-15ba1a22dbe1/volumes/kubernetes.io~empty-dir/logs",
"Destination": "/mnt/log",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
...
[root@k8s-worker-node-2 logs]# ls /var/lib/kubelet/pods/bceba261-210d-465d-9774-15ba1a22dbe1/volumes/kubernetes.io~empty-dir/logs
node2
从上例可以看出,node1 和 node2 的 emptyDir volume 对应的目录是 /var/lib/kubelet/pods/<>/volumes/kubernetes.io~empty-dir/。Pod 之间是不共享 volume 的。
1.2 hostPath volume
类似于 emptyDir volume,hostPath 是宿主机上的指定目录,创建 hostPath volume:
[root@k8s-master-node-1 kubernetes]# cat httpd-hostpath-volume.yaml
apiVersion: apps/v1
kind: Deployment
...
volumes:
- name: logs
hostPath:
path: /var/log
containers:
- name: httpd-chunqiu
image: docker.io/jocatalin/kubernetes-bootcamp:v1
volumeMounts:
- name: logs
mountPath: /mnt/log
查看 container 的挂载目录信息:
"Mounts": [
{
"Type": "bind",
"Source": "/var/log",
"Destination": "/mnt/log",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
},
...
相比于 emptyDir,hostPath 的持久性更强,当 Pod 被删除 hostPath 对应的目录还是会保留。
2. Kubernetes PersistentVolume
除了 emptyDir 和 hostPath 两种 kubernetes volume,kubernetes 还提供 PersistentVolume 和 PersistentVolumeClaim 资源对象实现更可靠的资源存储,下面介绍 HostPath 和 CephFS 两种 PV 类型。
2.1 HostPath PersistentVolume
HostPath 顾名思义是宿主机上的目录,其仅用于单机测试。
创建 HostPath PersistentVolume:
apiVersion: v1
kind: PersistentVolume
metadata:
name: chunqiuhostpath
labels:
type: local
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Delete
storageClassName: manualself
hostPath:
path: "/opt/bin"
简要介绍三种参数:
- persistentVolumeReclaimPolicy 包含三种回收策略:Retain,Delete 和 Recycle。
- storageClassName 可自定义,也可使用 node 支持的 storageClass name。
- accessModes 访问模式有三种:ReadWriteOnce(RWO),ReadOnlyMany(ROX)和 ReadWriteMany(RWX)。
创建 PersistentVolumeClaim:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: chunqiupvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: manualself
调用 PVC 创建 volume,PVC 会根据 storageClassName 查找是否有符合条件的 volume。 如果有,则绑定该 volume,如果没有则根据 storageClass 类型创建 PV。查看 PVC 和 PV 是否绑定:
[root@k8s-master-node-1 kubernetes]# kubectl get persistentvolumeclaims
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
hostpathpvc Bound chunqiuhostpath 2Gi RWO manualself 9s
PVC 和创建的 PV 成功绑定,不过也看到了资源浪费:PV 只能和一个 PVC 绑定在一起,如果该 PVC 请求的容量要比 PV 小则将造成 PV 存储资源的浪费。
如果 PV 没有创建,那么 PVC 将根据 storageClassName 按需创建 PV(动态模式),这种方式不会造成资源的浪费。以 CephFS storageClass 为例。
2.2 CephFS storageClass
node 上事先创建好 CephFS 的 storageClass:
[root@chunqiu ~ (Master)]# kubectl get storageclasses.storage.k8s.io csi-cephfs
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
csi-cephfs cephfs.csi.ceph.com Delete Immediate true 44d
[root@chunqiu ~ (Master)]# kubectl describe storageclasses.storage.k8s.io csi-cephfs
Name: csi-cephfs
IsDefaultClass: No
Annotations: <none>
Provisioner: cephfs.csi.ceph.com
Parameters: clusterID=f6fef4ec-fb60-4d46-899b-38fa33f4604c,csi.storage.k8s.io/controller-expand-secret-name=csi-cephfs,csi.storage.k8s.io/controller-expand-secret-namespace=ncms,csi.storage.k8s.io/node-stage-secret-name=csi-cephfs,csi.storage.k8s.io/node-stage-secret-namespace=ncms,csi.storage.k8s.io/provisioner-secret-name=csi-cephfs,csi.storage.k8s.io/provisioner-secret-namespace=ncms,fsName=cephfs,mounter=kernel,pool=cephfs_data,provisionVolume=true
AllowVolumeExpansion: True
MountOptions: <none>
ReclaimPolicy: Delete
VolumeBindingMode: Immediate
Events: <none>
创建 PVC,并且指定 storageClassName 为 csi-cephfs:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: chunqiupvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: csi-cephfs
创建 PVC:
[root@chunqiu pv (Master)]# kubectl get persistentvolumeclaims
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
chunqiupvc Bound pvc-f50ce096-aa5a-4924-a2a7-16e2f9a3f404 1Gi RWO csi-cephfs 34h
kubernetes 创建了 PV 类型为 CephFS 的 volume 并且将其与 PVC 绑定。
当然 PVC 是拿来用的,创建 Pod 使其引用到前面创建的 PVC:
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpdchunqiu
spec:
replicas: 1
selector:
matchLabels:
app: web_server
template:
metadata:
labels:
app: web_server
spec:
volumes:
- name: chunqiupvc
persistentVolumeClaim:
claimName: chunqiupvc
containers:
- name: httpd-chunqiu
image: docker.io/jocatalin/kubernetes-bootcamp:v1
volumeMounts:
- name: chunqiupvc
mountPath: /mnt/services
需要注意的是,删除 Pod, PVC 和 PV 还是绑定状态。使 PV 与其它 PVC 绑定,需要先删除已绑定 PVC(PV 状态标记为“已释放”),然后清除该 PVC 在 PV 中的数据。
理解 Kubernetes volume 和 共享存储的更多相关文章
- Kubernetes创建挂载共享存储的容器
原文链接:https://www.58jb.com/html/135.html 在上一次的Mysql容器中,已经使用过了配置宿主机目录挂载的方式,这样虽然方便但是不够安全:一般都是把数据存储在远程服务 ...
- 011.Kubernetes使用共享存储持久化数据
本次实验是以前面的实验为基础,使用的是模拟使用kubernetes集群部署一个企业版的wordpress为实例进行研究学习,主要的过程如下: 1.mysql deployment部署, wordpre ...
- k8s入坑之路(15)kubernetes共享存储与StatefulSet有状态
共享存储 docker默认是无状态,当有状态服务时需要用到共享存储 为什么需要共享存储: 1.最常见有状态服务,本地存储有些程序会把文件保存在服务器目录中,如果容器重新启停则会丢失. 2.如果使用vo ...
- [k8s]k8s配置nfs做后端存储&配置多nginx共享存储&&statefulset配置
所有节点安装nfs yum install nfs-utils rpcbind -y mkdir -p /ifs/kubernetes echo "/ifs/kubernetes 192.1 ...
- vSphere共享存储全配置流程
1.Openfiler的安装 Openfiler 由rPath Linux驱动,它是一个基于浏览器的免费网络存储管理实用程序,可以在单一框架中提供基于文件的网络连接存储 (NAS) 和基于块的存储区域 ...
- Openfiler配置RAC共享存储
将 Openfiler 用作 iSCSI 存储服务器,主要操作步骤如下: 1.设置 iSCSI 服务 2.配置网络访问 3.指定物理存储器并对其分区 4.创建新的卷组 5.创建所有逻辑卷 6.为每个逻 ...
- hadoop2.x NameNode 的共享存储实现
过去几年中 Hadoop 社区涌现过很多的 NameNode 共享存储方案, 比如 shared NAS+NFS.BookKeeper.BackupNode 和 QJM(Quorum Journal ...
- 多路径配置vlome group共享存储,VG的更新。
1. PV的概念: a) 一块物理磁盘一块物理硬盘在被LVM管理时被称为“物理卷”. b) 在LVM能对其进行管理之前需要在硬盘上产生一些特殊的数据结构,这个过程就是建立 ...
- 虚拟机在 OpenStack 里没有共享存储条件下的在线迁移[转]
原文链接:http://www.ibm.com/developerworks/cn/cloud/library/1508_wangyx_openstacklivemigrate/ 迁移(Migrati ...
- RMAN备份到共享存储失败(win平台)
RMAN备份到共享存储失败(win平台) 之前在<Win环境下Oracle小数据量数据库的物理备份>这篇文章中,介绍了在win平台下对于小数据量的数据库的物理备份设计. 文中重点提到,强烈 ...
随机推荐
- LeetCode5716:好因子的最大数目(数学、快速幂)
解题思路:因为primeFactors比较大,所以需要使用快速幂. class Solution: def quick_pow(self,base,x): ans = 1 while x>0: ...
- 一文搞定K8S监控告警平台选型
公众号「架构成长指南」,专注于生产实践.云原生.分布式系统.大数据技术分享 前言 最近在搞K8S的监控告警平台选型,对比了目前比较流行两款开源平台kube-prometheus.夜莺,也踩了一些坑分享 ...
- 文心一言 VS 讯飞星火 VS chatgpt (161)-- 算法导论13.1 1题
一.用go语言,按照图 13-1(a)的方式,画出在关键字集合(1,2,-,15)上高度为 3 的完全二叉搜索树.以三种不同方式向图中加入 NIL 叶结点并对各结点着色,使所得的红黑树的黑高分别为2. ...
- IIS下使用SSL证书
IIS下使用SSL证书 本文介绍windowsServer下SSL证书配置及IIS站点配置 1. 生成SSL证书 在阿里云申请免费SSL证书 登录阿里云管理控制台,打开SSL证书管理 选择免费证 ...
- 华企盾DSC防泄密:有一个文件申请解密失败,提示拒绝访问(密钥不对)
解决方法:将文件拖到加密进程中提示密钥不对,找到原来的数据库还原解密
- Java 21 虚拟线程:使用指南(一)
虚拟线程是由 Java 21 版本中实现的一种轻量级线程.它由 JVM 进行创建以及管理.虚拟线程和传统线程(我们称之为平台线程)之间的主要区别在于,我们可以轻松地在一个 Java 程序中运行大量.甚 ...
- 使用Bot Framework建立你的第一个聊天机器人
今天微软给我推送了一个邮件,大概是微软近期开发了很多人工智能相关的API,无意中看到了Bot Framework,就点进去看了看似乎还蛮有意思的.于是准备搭建一个环境试试. 第一步需要下载Bot Ap ...
- Map的特性(有序和无序)讨论
目录 什么是红黑树? 在 Java 中,基础java.util.Map 接口本身并不保证元素的顺序.具体的实现类 HashMap 和 TreeMap 的行为(无序.有序)有所不同: HashMap 类 ...
- 非暴力拆解:小熊派NB-IoT通信扩展板
摘要:相信大家对小熊派的NB-IoT通信扩展板已经非常了解了,但你有真正的了解过其内部构造吗?今天小编不聊技术,带你做一回拆·机·客! 相信大家对小熊派的NB-IoT通信扩展板已经非常了解了,但你有真 ...
- 从零开始学习python | 实例讲解如何制作Python模式程序
摘要:在本文中,我们将学习python中的各种模式程序. Python编程语言很容易学习.易于语法实现的各种库使其脱颖而出,这是它成为本世纪最流行的编程语言的众多原因之一.虽然学习很容易,但访问员通常 ...