K8s学习九(配置与存储_存储)

存储管理

Volumes
HostPath
  • 将节点上的文件或目录挂载到 Pod 上,此时该目录会变成持久化存储目录,即使 Pod 被删除后重启,也可以重新加载到该目录,该目录下的文件不会丢失

  • 效果就是容器里的数据和主机里的数据进行共享

  • 配置文件:

apiVersion: v1
kind: Pod
metadata:name: test-volume-pd 
spec:containers:- image: nginxname: nginx-volumevolumeMounts: #相当于选择磁盘放入- mountPath: /test-pd # 挂载到容器的哪个目录name: test-volume # 挂载哪个 volumevolumes: #相当于准备磁盘- name: test-volumehostPath: #与主机共享路径path: /data # 节点中的目录type: DirectoryOrCreate # 检查类型,在挂载前对挂载目录做什么检查操作,有多种选项,默认为空字符串,不做任何检查# 类型:
# 空字符串:默认类型,不做任何检查
# DirectoryOrCreate:如果给定的 path 不存在,就创建一个 755 的空目录
# Directory:这个目录必须存在
# FileOrCreate:如果给定的文件不存在,则创建一个空文件,权限为 644
# File:这个文件必须存在
# Socket:UNIX 套接字,必须存在
# CharDevice:字符设备,必须存在
# BlockDevice:块设备,必须存在
EmptyDir
  • EmptyDir 主要用于一个 Pod 中不同的 Container 共享数据使用的,由于只是在 Pod 内部使用,因此与其他 volume 比较大的区别是,当 Pod 如果被删除了,那么 emptyDir 也会被删除。
  • 存储介质可以是任意类型,如 SSD、磁盘或网络存储。可以将 emptyDir.medium 设置为 Memory 让 k8s 使用 tmpfs(内存支持文件系统),速度比较快,但是重启 tmpfs 节点时,数据会被清除,且设置的大小会计入到 Container 的内存限制中。
  • 配置如下:
apiVersion: v1
kind: Pod
metadata:name: empty-dir-pd
spec:containers:- image: alpinename: alpine-emptydir1command: ["/bin/sh","-c","sleep 3600;"]volumeMounts:- mountPath: /cachename: cache-volume- image: alpinename: alpine-emptydir2command: ["/bin/sh","-c","sleep 3600;"]volumeMounts:- mountPath: /cachename: cache-volumevolumes:- name: cache-volumeemptyDir: {}
~                                                                                             
~                                                                                             
~                              
  • 这里再进入容器的时候,需要指定进入到哪一个容器,如:kubectl exec -it empty-dir-pd -c alpine-emptydir1 -- sh
  • 这里可以监听一下试试tail -f a.txt,发现确实有更改。
NFS挂载
  • nfs 卷能将 NFS (网络文件系统) 挂载到你的 Pod 中。 不像 emptyDir 那样会在删除 Pod 的同时也会被删除,nfs 卷的内容在删除 Pod 时会被保存,卷只是被卸载。 这意味着 nfs 卷可以被预先填充数据,并且这些数据可以在 Pod 之间共享。
  • 这里是其他主机上的,可以实现不同节点上的不同pod共享数据
  • 因为不仅跨了主机还跨了网络,所以很慢,
安装NFS
#下面是在想安装的服务端和客户端的代码
#服务端
#下载apt updateapt install nfs-kernel-server#然后启动systemctl start nfs-kernel-server#创建共享目录mkdir -p /home/nfscd /home/nfsmkdir rw #读写mkdir ro #只读#设置共享目录,这个是专门设置共享目录的地方
vim /etc/exports
#加入下面两行,意思是在192.168.2.这个网段的所有主机都可以共享
/home/nfs/rw 192.168.2.0/24(rw,sync,no_subtree_check,no_root_squash)
/home/nfs/ro 192.168.2.0/24(ro,sync,no_subtree_check,no_root_squash)#重新导出共享目录并更改,重启服务
exportfs -ra
systemctl restart nfs-kernel-server#客户端
#下载apt updateapt install nfs-common# 创建挂载点并挂在nfs共享目录,这里填的是服务端的ip地址mkdir -p /mnt/nfs/rwmkdir -p /mnt/nfs/romount -t nfs 192.168.2.135:/home/nfs/rw /mnt/nfs/rwmount -t nfs 192.168.2.135:/home/nfs/ro /mnt/nfs/ro
NFS文件系统挂载
  • 配置如下:
apiVersion: v1
kind: Pod
metadata:name: nfs-test-pd
spec:containers:- image: nginxname: test-containervolumeMounts:- mountPath: /usr/share/nginx/html #在 Nginx web 服务器中,/usr/share/nginx/html 是 Nginx 的默认文档根目录,这意味着当用户请求你的网站时,Nginx 会从这个目录中查找静态文件(如 HTML、CSS、JavaScript 文件等)来响应请求。name: test-volumevolumes:- name: test-volumenfs:server: 192.168.2.135 # 网络存储服务地址path: /home/nfs/rw/www/index # 网络存储路径readOnly: false # 是否只读
  • 创建之后,在网络存储相应的地方加入index.html,也就是/home/nfs/rw/www/index/index.html,然后直接kubectl get po -o wide找到相应pod的ip,然后直接curl就可以看到内容,删了pod之后还会保存。
PV和PVC(最重要的存储)
  • 问题:可能用到存储方式不一样

在这里插入图片描述

  • 持久卷(PersistentVolume,PV) 是集群中的一块存储,可以由管理员事先制备, 或者使用存储类(Storage Class)来动态制备。 持久卷是集群资源,就像节点也是集群资源一样。PV 持久卷和普通的 Volume 一样, 也是使用卷插件来实现的,只是它们拥有独立于任何使用 PV 的 Pod 的生命周期。 此 API 对象中记述了存储的实现细节,无论其背后是 NFS、iSCSI 还是特定于云平台的存储系统。

  • 这里PV是一个抽象的概念,起到了一个规范的作用,不管背后使用的什么存储系统,操作PV就是操作背后的存储系统。

  • 持久卷申领(PersistentVolumeClaim,PVC) 表达的是用户对存储的请求。概念上与 Pod 类似。 Pod 会耗用节点资源,而 PVC 申领会耗用 PV 资源。Pod 可以请求特定数量的资源(CPU 和内存);同样 PVC 申领也可以请求特定的大小和访问模式 (例如,可以要求 PV 卷能够以 ReadWriteOnce、ReadOnlyMany 或 ReadWriteMany 模式之一来挂载,参见访问模式)。

  • 下图是具体的流程

在这里插入图片描述

生命周期
构建

静态构建

  • 集群管理员创建若干 PV 卷。这些卷对象带有真实存储的细节信息, 并且对集群用户可用(可见)。PV 卷对象存在于 Kubernetes API 中,可供用户消费(使用)。

动态构建

  • 如果集群中已经有的 PV 无法满足 PVC 的需求,那么集群会根据 PVC 自动构建一个 PV,该操作是通过 StorageClass 实现的。
  • 想要实现这个操作,前提是 PVC 必须设置 StorageClass,否则会无法动态构建该 PV,可以通过启用 DefaultStorageClass 来实现 PV 的构建。
绑定
  • 当用户创建一个 PVC 对象后,主节点会监测新的 PVC 对象,并且寻找与之匹配的 PV 卷,找到 PV 卷后将二者绑定在一起。
  • 如果找不到对应的 PV,则需要看 PVC 是否设置 StorageClass 来决定是否动态创建 PV,若没有配置,PVC 就会一致处于未绑定状态,直到有与之匹配的 PV 后才会申领绑定关系。
使用
  • Pod 将 PVC 当作存储卷来使用,集群会通过 PVC 找到绑定的 PV,并为 Pod 挂载该卷。
  • Pod 一旦使用 PVC 绑定 PV 后,为了保护数据,避免数据丢失问题,PV 对象会受到保护,在系统中无法被删除。
回收策略

保留

回收策略 Retain 使得用户可以手动回收资源。当 PersistentVolumeClaim 对象被删除时,PersistentVolume 卷仍然存在,对应的数据卷被视为"已释放(released)"。 由于卷上仍然存在这前一申领人的数据,该卷还不能用于其他申领。 管理员可以通过下面的步骤来手动回收该卷:
1. 删除 PersistentVolume 对象。与之相关的、位于外部基础设施中的存储资产 (例如 AWS EBS、GCE PD、Azure Disk 或 Cinder 卷)在 PV 删除之后仍然存在。
2. 根据情况,手动清除所关联的存储资产上的数据。
3. 手动删除所关联的存储资产。
如果你希望重用该存储资产,可以基于存储资产的定义创建新的 PersistentVolume 卷对象。

删除

  • 对于支持 Delete 回收策略的卷插件,删除动作会将 PersistentVolume 对象从 Kubernetes 中移除,同时也会从外部基础设施(如 AWS EBS、GCE PD、Azure Disk 或 Cinder 卷)中移除所关联的存储资产。 动态制备的卷会继承其 StorageClass 中设置的回收策略, 该策略默认为 Delete。管理员需要根据用户的期望来配置 StorageClass; 否则 PV 卷被创建之后必须要被编辑或者修补。

回收

  • 警告: 回收策略 Recycle 已被废弃。取而代之的建议方案是使用动态制备。
  • 如果下层的卷插件支持,回收策略 Recycle 会在卷上执行一些基本的擦除 (rm -rf /thevolume/*)操作,之后允许该卷用于新的 PVC 申领。
PV
状态
  • Available:空闲,未被绑定

  • Bound:已经被 PVC 绑定

  • Released:PVC 被删除,资源已回收,但是 PV 未被重新使用

  • Failed:自动回收失败

  • 配置文件如下:

apiVersion: v1
kind: PersistentVolume #描述资源对象为PV
metadata:name: pv0001 #PV的名字
spec:capacity:storage: 5Gi # pv 的容量volumeMode: Filesystem # 存储类型为文件系统accessModes: # 访问模式:ReadWriteOnce(单词)、ReadWriteMany(可以被多个使用)、ReadOnlyMany- ReadWriteMany # 可被单节点独写persistentVolumeReclaimPolicy: Retain # 回收策略storageClassName: slow # 创建 PV 的存储类名,需要与 pvc 的相同mountOptions: # 加载配置- hard- nfsvers=4.1nfs: # 连接到 nfspath: /home/nfs/rw/test-pv # 存储路径server: 192.168.2.135 # nfs 服务地址
PVC
  • pvc绑定pv
  • 配置文件如下:

# 这里是pvc绑定pv
apiVersion: v1
kind: PersistentVolumeClaim #资源类型为pvc
metadata:name: nfs-pvc
spec:accessModes:- ReadWriteMany # 权限需要与对应的 pv 相同volumeMode: Filesystemresources:requests:storage: 5Gi # 资源可以小于 pv 的,但是不能大于,如果大于就会匹配不到 pvstorageClassName: slow # 名字需要与对应的 pv 相同
#  selector: # 使用选择器选择对应的 pv
#    matchLabels:
#      release: "stable"
#    matchExpressions:
#      - {key: environment, operator: In, values: [dev]}
  • pvc绑定pod

apiVersion: v1
kind: Pod
metadata:name: test-volume-pd
spec:containers:- image: nginxname: nginx-volumevolumeMounts:- mountPath: /usr/share/nginx/html # 挂载到容器的哪个目录name: test-volume # 挂载哪个 volumevolumes:- name: test-volumepersistentVolumeClaim: #关联pvcclaimName: nfs-pvc #要关联到哪个pvc
StorageClass存储类的概念与作用
  • 每个 StorageClass 都有一个制备器(Provisioner),用来决定使用哪个卷插件制备 PV。
  • 如下图:

在这里插入图片描述

实现动态创建NFS-PV案例

  • 先配置nfs-provisioner,StorageClass和RBAC配置
#nfs-provisioner
apiVersion: apps/v1
kind: Deployment
metadata:name: nfs-client-provisionernamespace: kube-systemlabels:app: nfs-client-provisioner
spec:replicas: 1strategy:type: Recreate #不进行滚动更新,直接重新创建selector:matchLabels:app: nfs-client-provisioner #选择器template:metadata:labels:app: nfs-client-provisionerspec:serviceAccountName: nfs-client-provisioner #pvc要调用k8s的api,所以要有账号containers:- name: nfs-client-provisionerimage: quay.io/external_storage/nfs-client-provisioner:latestvolumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: fuseim.pri/ifs #对应SC里的名字- name: NFS_SERVERvalue: 192.168.2.135- name: NFS_PATHvalue: /home/nfs/rwvolumes:- name: nfs-client-rootnfs:server: 192.168.2.135path: /home/nfs/rw# StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: -nfs-storagenamespace: kube-system
provisioner: fuseim.pri/ifs # 外部制备器提供者,编写为提供者的名称
parameters:archiveOnDelete: "false" # 是否存档,false 表示不存档,会删除 oldPath 下面的数据,true 表示存档,会重命名路径
reclaimPolicy: Retain # 回收策略,默认为 Delete 可以配置为 Retain
volumeBindingMode: Immediate # 默认为 Immediate,表示创建 PVC 立即进行绑定,只有 azuredisk 和 AWSelasticblockstore 支持其他值# RBAC配置
apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-client-provisionernamespace: kube-system
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: nfs-client-provisioner-runnernamespace: kube-system
rules:- apiGroups: [""]resources: ["persistentvolumes"]verbs: ["get", "list", "watch", "create", "delete"]- apiGroups: [""]resources: ["persistentvolumeclaims"]verbs: ["get", "list", "watch", "update"]- apiGroups: ["storage.k8s.io"]resources: ["storageclasses"]verbs: ["get", "list", "watch"]- apiGroups: [""]resources: ["events"]verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: run-nfs-client-provisionernamespace: kube-system
subjects:- kind: ServiceAccountname: nfs-client-provisionernamespace: kube-system
roleRef:kind: ClusterRolename: nfs-client-provisioner-runnerapiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-client-provisionernamespace: kube-system
rules:- apiGroups: [""]resources: ["endpoints"]verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-client-provisionernamespace: kube-system
subjects:- kind: ServiceAccountname: nfs-client-provisioner
roleRef:kind: Rolename: leader-locking-nfs-client-provisionerapiGroup: rbac.authorization.k8s.io
  • PVC处于pending状态有两个解决方法:

# 第一种
修改 apiserver 配置文件
vim /etc/kubernetes/manifests/kube-apiserver.yamlspec:containers:- command:- kube-apiserver- --feature-gates=RemoveSelfLink=false # 新增该行......修改后重新应用该配置
kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml#第二种
将 provisioner 修改为如下镜像之一即可gcr.io/k8s-staging-sig-storage/nfs-subdir-external-provisioner:v4.0.0registry.cn-beijing.aliyuncs.com/pylixm/nfs-subdir-external-provisioner:v4.0.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/801123.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JS-25-浏览器和浏览器对象

一、浏览器 由于JavaScript的出现就是为了能在浏览器中运行,所以,浏览器自然是JavaScript开发者必须要关注的。 目前主流的浏览器分这么几种: IE 6~11:国内用得最多的IE浏览器,历来对W3C标准支持差。从IE10开始支持E…

无人售货奶柜:开启便捷生活的新篇章

无人售货奶柜:开启便捷生活的新篇章 在这个快节奏的现代生活中,科技的革新不仅为我们带来了前所未有的便利,更在不经意间改变着我们的日常。其中,无人售货技术的出现,尤其是无人售货奶柜,已经成为我们生活…

【C语言】函数相关选择题

前言 关于函数相关的选择题。 题目一: C语言规定,在一个源程序中,main函数的位置( ) A .必须在最开始 B .必须在库函数的后面 C .可以任意 D .必须在最后 题解:选择C。 main函数为C语言中整个工程的程序入…

牛顿:Archetype AI 的开创性模型,实时解读真实世界的新宠儿

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

英语学习笔记-音节划分和字母发音对照表

国际音标 音节划分 英语音节以元音为主体构成的发音单位,一般说来元音发音响亮,可以构成音节,辅音发音不响亮,不能单独构成音节 ((m] (n] [I] 例外)。 从单词拼写形式上看,有几个元字组就有几个音节 音节划分规则 长…

[通俗易懂]《动手学强化学习》学习笔记1-第1章 初探强化学习

文章目录 前言第1章 初探强化学习1.1 简介序贯决策(sequential decision making)任务:强化学习与有监督学习或无监督学习的**区别**:改变未来 1.2 什么是强化学习环境交互与有监督学习的区别1:改变环境 (说…

GPU环境安装与虚拟环境安装(适用于Windows下的李沐GPU)

之前我是用的都是VMware的虚拟机且安装的是cpu的pytorch版本,因为想要使用GPU,最终实现了在Windows上使用GPU,并且相关原理也在参考文章或视频内,可以通过原理自行挑选自己所需的配置并安装。 文章目录 1.GPU安装1.1 名词解释1.2 卸载旧版本的CUDA1.3 版本选择步骤(Nivida显卡…

ubuntu安装

一、安装虚拟机 https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html 下载后运行安装向导,一直Next即可 许可证: https://zhuanlan.zhihu.com/p/685829787#:~:textpro,17%E5%AF%86%E9%92%A5%EF%BC%9AMC60H-DWHD5-H80U9-6…

【SpringCloud】Nacos 配置管理

目 录 一.统一配置管理1. 在 nacos 中添加配置文件2. 从微服务拉取配置 二.配置热更新1. 方式一2. 方式二 三.配置共享1. 添加一个环境共享配置2. 在 user-service 中读取共享配置3. 运行两个 UserApplication,使用不同的 profile4. 配置共享的优先级5. 多服务共享配…

如何使用vscode启动Flask并实现无公网IP远程访问内网服务

文章目录 1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 本篇文章主要讲解如何在本地安装Flask,以及如何将其web界面发布到公网进行远程访问。 Flask是目前十分流行的web框架,采用Python编程语…

LeetCode初级算法书Java题解日常更新

LeetCode初级算法高效题解(含思路注释) 文章目录 LeetCode初级算法高效题解(含思路注释)前言一、数组1.删除排序数组中的重复项2.买卖股票的最佳时机 II3.旋转数组4.存在重复元素 总结 前言 决定用四个月过一下算法 一、数组 1.…

【绩效管理】帮助零售企业建立分层分类绩效考核体系项目纪实

购物中心张经理评价:“员工的绩效管理一直是困扰我公司的难题,我们只懂得怎么经营,至于怎么做人力资源管理,真是一点都不懂。这次华恒智信为我们提供的服务对我们的帮助很大。基于企业实际调研情况,华恒智信专家明确指…

Linux-等待子进程

参考资料:《Linux环境编程:从应用到内核》 僵尸进程 进程退出时会进行内核清理,基本就是释放进程所有的资源,这些资源包括内存资源、文件资源、信号量资源、共享内存资源,或者引用计数减一,或者彻底释放。…

PANet网络

PANet(Path Aggregation Network)是一种用于语义分割任务的神经网络结构,旨在解决多尺度特征融合的问题。该网络结构由中国科学院计算技术研究所提出,在2018年的论文中首次提出。 PANet的主要目标是解决语义分割任务中多尺度信息…

电脑开机启动项设置

电脑开机启动项设置 一、Windows 系统: 1、Windows 系统,可以通过【系统配置实用程序】来设置开机启动项: 1)、按【WinR】组合键,打开【运行】对话框。 2)、输入【msconfig】,点击【确定】或…

Transformer 模型及其典型应用研究

摘要: Transformer 模型是一种基于自注意力机制的深度学习架构,在自然语言处理等领域取得了巨大成功。本文介绍了 Transformer 模型的原理和结构,并探讨了其在语言翻译、文本生成、对话系统、语言模型、图像处理和推荐系统等典型应用领域的研…

Java中的Stream流常用接口和方法

​TOC 第一章:Stream流是什么 1.1)简单介绍 学习Stream流就绕不开Lambda表达式, 需要了解Lambda表达式可以看一下这篇–>:Lambda表达式学习 1.其实“流”是个抽象概念,我们把现实世界中与Stream流有相同特性的…

一条SQL查询语句的执行顺序

SQL常用字段书写顺序 SELECT:选择要查询的列。 FROM:指定数据来源,即表名。 JOIN:根据指定的连接条件将多个表连接在一起。 ON:指定连接条件,即哪些列的值匹配时,应该将两个表中的行组合在一起。…

【Angular】什么是Angular中的APP_BASE_HREF

1 概述: 在这篇文章中,我们将看到Angular 10中的APP_BASE_HREF是什么以及如何使用它。 APP_BASE_HREF为当前页面的基础href返回一个预定义的DI标记。 APP_BASE_HREF是应该被保留的URL前缀。 2 语法: provide: APP_BASE_HREF, useValue: /gfgapp3 步骤: 在app.m…

SAP ERP 公有云有哪些模块?

随着全球化竞争的加剧和企业管理需求的日益复杂化,越来越多的企业开始采用云端企业资源计划(ERP)系统来优化业务流程。SAP ERP 公有云(SAP S/4HANA Cloud, public edition)作为一款领先的云端ERP解决方案,为…