kubernetes学习日志(六)

前言

本文记录了存储卷管理、临时卷、持久卷、PV/PVC管理

一、持久卷

卷概述

容器化带来的问题

容器中的文件在磁盘上是临时存放的,这对于容器运行重要应用程序带来一些问题
1、容器崩溃重启时,kubelet会以纯净(镜像)状态重启,容器内的历史数据会丢失
2、容器被删除时,容器内数据会一并被清理
3、多个容器可能会有共享文件和目录的需求
ps:因为K8s是没有停止容器的概念的,所以只有创建和删除容器

卷是一个抽象化的存储设备
使用卷可以解决容器崩溃重启后的历史数据丢失的问题,也可以解决容器或Pod被删除后数据持久保存的问题,
同时可以解决多个容器内数据共享的问题。
Pod可以使用任意数目的卷

k8s支持的卷类型

持久卷

持久卷是集群中的存储资源,里面的数据不会随着Pod的删除而丢失

临时卷

有些应用程序需要额外的存储,但并不关心数据在重启后是否仍然可用。临时卷会同Pod一起创建删除

投射卷

它允许将多个现有卷源映射到同一个目录,通过这些不同类型的卷源组合成一个统一的卷,可以更方便的管理和使用这些资源

卷的使用

1、编写一个Pod资源对象文件
2、在Pod.spec下添加volumes字段,配置外部存储为卷
3、在Pod.spec.comtainers[*] 中添加volumeMounts 字段,声明卷在容器中的挂载位置
ps:卷不能挂载到其他卷上,也不能与其他卷有硬连接
Pod配置中每个容器都必须独立指定各个卷的挂载位置

hostPath卷

hostPath是持久卷,本质是使用本地设备,例如磁盘、分区、目录、Socket、CharDevice和BlockDevice等等。
hostPath卷的可用性取决于底层节点的可用性,如果节点变得不健康,那么hostPath卷也将不可被访问。
hostPath卷里面的数据不会随着Pod结束而消失
ps : 配置相同的Pod,可能在不同节点上表现不同,应为不同节点上映射的文件内容不同

spec : 
	volumes :  # 卷定义
	- name : logdata # 卷名称
		hostPath :   # 使用hostPath 创建卷
			path : /var/weblog  # 在节点上存放的路径
			type : DirectoryOrCreate   # 目录不存在就创建新的
	containers : 
	- name : nginx
		image : myos:nginx
		volumeMounts :  # mount卷
		- name : logdata  # 卷的名字
			mountPath : /usr/local/nginx/logs # 容器内路径 

type对应内型 :

type类型 说明
DirectoryOrCreate 卷映射对象是一个目录,如果不存在就创建
Directory 卷映射对象是一个目录,且必须存在
FileOrCreate 卷映射对象是一个文件,如果不存在就创建
File 卷映射对象是一个文件,且必须存在
Socket 卷映射对象是一个Socket套接字,且必须存在
CharDevice 卷映射对象是一个字符设备,且必须存在
BlockDevice 卷映射对象是一个块设备,且必须存在

NFS卷

k8s中允许将NFS存储以卷的方式挂载到Pod中,删除Pod时,nfs存储卷会被卸载(umount),而不是被删除,nfs卷可以在不同节点的Pod之间共享数据
NFS最大的功能就是在不同节点的不同Pod中共享读写数据,本地NFS的客户端可以透明地读写位于远端NFS服务骑上的文件,就像访问本地文件一样

spec : 
	volumes : 
	... ...
	- name : website  # 存储卷名称
		nfs : 		# 定义资源对象
			server : 192.168.1.10 # 指明NFS服务器地址
			path : /var/webroot # NFS共享目录
	containers : 
	- name : nginx
		image : myos:nginx
		volumeMounts :  # 映射存储卷
		- name : website  # 映射的存储卷名称
			mountPath : /usr/local/nginx/html # 映射到容器中的路径

PV/PVC

PV:Persistent Volume 是持久卷
PVC : PersistentVolumeClaim 是持久卷声明

PV/PVC用途

存储的管理是一个与计算机实例的管理完全不同的问题。管理员希望能提供一种通用的API来完成Pod对卷的部署管理与使用。PV/PVC就是为了满足这种需求而诞生的,PV/PVC的引入使集群具备了存储的逻辑抽象能力

k8s支持的存储卷

cephfs : CephFS volume
csi : 容器存储接口(CSI)
fc : Fibre Channel(FC)存储
hostPath HostPath 卷
iscsi : ISCSI(SCSI over IP) 存储
nfs 网络文件系统(NFS)存储
rbd Rados块设备(RBD)卷

PV/PVC使用

PV是资源提供者,根据集群的基础设施变化而变化,由k8s集群管理员配置
PVC是资源的使用者,根据业务服务的需求变化来配置,用户无需知道PV的技术细节,只需要声明你需要什么类型的资源即可
PVC会根据用户的声明需求,自动找到PV完成绑定

PV资源文件

---
kind : PersistentVolume
apiVersion : v1
metadata : 
	name : mypv
spec : 
	volumeMode : Filesystem  # 提供资源的类型[Filesystem, Block]
	accessModes :  # 存储卷能提供的访问模式
		- ReadWriteOnce # 卷支持的模式,支持多种
		- ReadOnlyMnay  # RWO,ROX,RWX,RWOP
	capacity :   # 存储卷能提供的存储空间
		storage : 30Gi  # 空间大小
	persistentVolumeReclaimPolicy : Retain # 数据回收方式
	......  # 存储配置

PV资源文件(hostPath)

... ... 
metadata : 
	name : pv-local
spec : 
	volumeMode : Filesystem # 提供Filesystem访问方式
	accessModes : 
		- ReadWriteOnce # hostPath 只支持RWO
	capacity : 
		storage : 30Gi # 提供的磁盘空间大小
	persistentVolumeReclaimPolicy : Retain # 数据手工回收
	hostPath : # hostPath配置
		path : /var/weblog
		type :DirectoryOrCreate

PV资源文件(NFS)

spec : 
	volumeMode : Filesystem  # 提供Filesystem访问方式
	accessModes :   	# NFS 支持多种访问方式
		- ReadOnlyMany    # RWO,ROX,RWX
		- ReadWriteMany 
... ...
	capacity : 
		storage : 30Gi  # 提供的磁盘空间大小
	persistentVolumeReclaimPolicy : Retain # 数据手工回收
	mountOptions :  # mount的参数
		-	nolock 
	nfs :   # NFS配置
		server : <NFS服务器地址>
		path : <共享目录路径>

PVC资源文件

---
kind : PersistentVolumeClaim
apiVersion : v1
metadata : 
	name : pvc1
spec :   	# 定义需求
	volumMode : Filesystem  需要使用Filesystem的存储卷
	accessModes : 
		- ReadWriteOnce  # 需要支持RWO的存储卷
	resources : 
		requests : 
			storage : 25Gi # 最小磁盘空间需求

Pod调用PVC

映射PVC为卷
使用PVC用户无需关心后端存储设备
系统会自动查找匹配

... ...
spec : 
	Volumes :  # 定义存储卷
		- name : logdata # 定义卷名
			persistentVolumeClaim : # 定义PVC资源对象
				claimName : pvc1 # 使用的PVC为pvc1
		- name : website # 定义卷名
			persistentVolumeClaim : 	# 定义PVC资源对象 
				claimName : pvc2 # 定义使用的PVC为pvc2

存储卷挂载路径

... ... 
spec : 
	containers : 
	-	name : nginx
		image : myos:nginx
		volumeMounts :
		- name : logdata  # 挂载卷名
			mountPath : /usr/local/nginx/logs  # 挂载路径
		- name : website   # 挂载卷名
			mountPath : /usr/local/nginx/html  # 挂载路径 

二、临时卷

1、configMap 卷

configMap卷提供了向Pod注入配置数据的方法,允许你将配置文件与镜像分离,使容器化的应用具有可移植性
configMap 在使用之前需要先创建它,configMap 不是用来保存大量数据的,在其中保存的数据不可超过1Mib

configMap用途

配置环境变量
修改配置文件的参数,数据库的地址等

修改系统时区

创建configMap语法格式
kubectl create configmap 名称 [选项/参数]

kubectl create configmap tz --from-literal=TZ="Asia/Shanghai"
kubectl get configmap

使用资源对象创建configmap

--- 
kind : ConfigMap
apiVersion : v1
metadata : 
	name : timezone
data : 
	TZ="Asia/Shanghai"

使用 :

---
kind : Pod 
apiVersion : v1
metadata : 
	name : web1
spec : 
	... ... 
	containers : 
	- name : nginx
		image : myos:nginx
		envFrom :  # 配置环境变量
		- configMapRef : # 调用资源对象
				name : timezone # Configmap 名称 

配置nginx解析php

在Pod中增加php容器,与nginx共享一张网卡

containers : 
- name : nginx
... ...
- name : php 
	image : myos:php-fpm
	envFrom : 
	- configmapRef :   # 配置时区
	  	name : timezone  
	volumeMounts : 
	- name : website  # 挂载NFS
	  mountPath : /usr/local/nginx/html 

制作Configmap配置文件

获取配置文件并修改
kubectl cp -c nginx web1:/usr/local/nginx/conf/nginx.conf nginx.conf
# vim nginx.conf
location ~\.php$ {
	root	html;
	fastcgi_pass 127.0.0.1:9000;
	fastcgi_index index.php;
	include fastcgi.conf;
}
###
使用命令创建configmap
kubectl create configmap nginx-php --from-file=nginx.conf

映射配置文件

spec : 
	volumes : 
	- name : nginx-php  # 卷名称
		configMap :  # 引用资源对像
			name : nginx-php # 资源对象名称
	... ...
	containers : 
	- name : nginx
	... ...
		volumeMounts : 
		-	name : nginx-php # 卷名称
			subPath : nginx.conf # 键值(不设置键值映射为目录)
			mountPath : /usr/local/nginx/conf/nginx.conf # 路径

2、secret卷

secret卷是一种临时卷,类似于ConfigMap但专门用于保存机密数据
在设置Secret.data字段时,所有简直都必须是经过base64编码的字符串

secret用途

配置一些需要加密的环境变量或文件(eg:https证书)
访问需要认证登陆的私有镜像仓库(eg:harbor私有仓库)

创建secret语法格式

kubectl create secret 子类型 名称 [选项/参数]
子类型

通用类型:

kubectl create secret generic 名称 [选项/参数]

用于创建认证登陆私有仓库的子类型

kubectl create secret docker-registry 名称 [选项/参数]

用于创建TLS证书的子类型

kubectl create secret tls 名称 [选项/参数]

登陆私有仓库

kubectl create secret docker-registry harbor-auth --docker-server="harbor:443" --docker-username="username" --docker-password="password" # 仓库主机端口号 登陆用户名 密码
yaml文件:
---
kind : Pod
apiVersion : v1
metadata : 
	name : web2
spec : 
	imagePullSecret :   # secret数据
	- name : harbor-auth   # 资源对象名称
	containers : 
	- name : apache
		image : harbor:443/myimg/httpd:latest # 使用私有仓库里的镜像

3、emptyDir 卷

emptyDir的本质是一个简单的空目录,可以提供临时空间,同一个Pod中容器也可以用来共享数据eg:缓存服务器、数据分析统计、排序等
emptyDir随Pod创建而创建,Pod在该节点上运行期间一直存在,当Pod被删除时,临时卷中的数据也会被永久删除
重启Pod中容器不会造成emptyDir数据丢失

... ...
spec : 
	volumes :    # 定义卷
	- name : cache   # 卷的名字
		emptyDir : {}   # 卷的类型
	containers : 
	- name : apache
		image : harbor:443/myimg/httpd:latest 
		volumeMounts : # 在容器中挂载卷
		-	name : cache # 卷名
			mountPath : /var/cache # 路径不存在就创建,存在就覆盖

相关推荐

  1. kubernetes学习日志

    2024-07-20 02:58:03       12 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-20 02:58:03       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-20 02:58:03       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-20 02:58:03       45 阅读
  4. Python语言-面向对象

    2024-07-20 02:58:03       55 阅读

热门阅读

  1. JWT身份验证、授权介绍、应用场景和示例代码

    2024-07-20 02:58:03       17 阅读
  2. VUE3【实用教程】(2024最新版)

    2024-07-20 02:58:03       19 阅读
  3. LLM推理需要占用多少显存

    2024-07-20 02:58:03       16 阅读
  4. 应届硕士职业生涯规划

    2024-07-20 02:58:03       16 阅读
  5. 2024 Linux 运维面试题分享-1

    2024-07-20 02:58:03       15 阅读
  6. 大模型日报 2024-07-19

    2024-07-20 02:58:03       17 阅读
  7. Vant组件库的按需导入和导出

    2024-07-20 02:58:03       18 阅读
  8. UDP checksum calculation

    2024-07-20 02:58:03       20 阅读