第六章 卷:将磁盘挂载到容器

1. 介绍卷

每个新容器都是通过在构建镜像时加入的详细配置文件来启动的。 将此与pod 中容器重新启动的现象结合起来。

存储卷是 pod 的一个组成部分。这意味着在 pod 启动时创建卷, 并在删除 pod时销毁卷。 因此, 在容器重新启动期间, 卷的内容将保持不变, 在重新启动容器之后, 新容器可以识别前一个容器写入卷的所有文件。

另外,如果一个 pod 包含多个容器, 那这个卷可以同时被所有的容器使用。

1.1 卷类型

• emptyDir 用于存储临时数据的简单空目录。

• hostPath 用于将目录从工作节点的文件系统挂载到pod中。

• gitRepo 通过检出Git仓库的内容来初始化的卷。

• nfs 挂载到pod中的NFS共享卷。

2. 通过卷在容器之间共享数据

2.1 使用 emptyDir

关注它是如何用于在 pod 的多个容器之间共享数据的。卷从一个 目录开始,运行在 pod 内的应用程序可以写入它需要 的任何文件。pod 含两个容器和 个挂载在两个容器中的共用的卷,但在不同的路径上。

bash 复制代码
apiVersion: vl 
kind: Pod 
metadata: 
	name : fortune 
spec: 
	containers: 
	-image: luksa/fortune 
		name: html generator
		volumeMounts: 
		- name: html 
		  mountPath: /var/htdocs   名为html的卷挂载在/var/htdocs
	- image: nginx:alpine 
		name: web-server 
		volumeMounts : 
		- name: html
		  mountPath: /usr/share/nginx/html
		  readOnly: true 
		ports: 
		- containerPort: 80 
		  protocol: TCP 
	volumes                     
	- name: html                叫html的emptyDir卷,挂载在上面的两个容器中
	emptyDir: {}

将端口从本地机器转发到 pod 来实现,计算机的 808 端口来访问服务
 kubectl port-forward fortune 8080:80

volumes: 
 - name: html 
   emptyDir
	  medium: Memory          # 存在内存上

2.2 使用 Git 仓库作为存储卷

gitRepo 卷基本上也是 emptyDir 卷,它通过克隆 Git 仓库并在 pod时(但在创建容器之前 检出特定版本来填充数据。

注意:

  • 在创建gitRepo 卷后,它并不能和对应 repo 保持同步。 当向库推送新增 的提交时,文件将不会被更新。
  • 然而,如果所用 pod 是由ReplicationController 管理的,删除这个 pod 将触发新建一个新的 pod ,而这个新 pod
    的卷中将包含最新的提交。
bash 复制代码
apiVersion : vl 
kind: Pod 
metadata: 
	name: gi trepo-volume-pod
	spec: 
		containers: 
		- image: nginx:alpine 
			name: web -server 
			volumeMounts : 
		- name : html 
			mountPath: / usr/share/nginx/ html 
			readOnly: true 
			ports: 
				containerPort: 80 
				protocol: TCP 
	volumes                     
		- name: html                
		gitRepo: https://githubo.com/...
		revision: master     github 库的mater分支下载
		directory: .         创建在根目录

如果想要将私有的 Git repo 克隆到容器中, 则应该使用 gitsync sidecar 或类似的方法, 而不是使用 gitRepo 卷。

3 访问工作节点文件系统上的文件(hostPath卷)

大多数 pod 应该忽略它们的主机节点, 因此它们不应该访问节点文件系统上的任何文件。

hostPath 卷指向节点文件系统上的特定文件或目录。 在同一个节点上运行并在其 hostPath 卷中使用相同路径的 pod 可以看到相同的文件。

hostPath 卷是我们介绍的第 一种类型的持久性存储。切勿使用它们来持久化跨 pod的数据。

bash 复制代码
kubect1 get pod s --namespace kube-system

查看hostpaht 的使用, 切勿使用它们来持久化跨 pod的数据
kubectl describe po fluentd-kubia-4ebc2fle-9a3e --namespace kube-system

4 使用持久化存储

当运行在一个 pod 中的应用程序需要将数据保存到磁盘上, 并且即使该 pod 重新调度到另 一个节点时也要求具有相同的数据可用。此必须将其存储在某种类型的网络存储 (NAS) 中。

使用 GCE 持久磁盘作为底层存储机制。

bash 复制代码
同 一区域的 Kubemetes 集群中创建
gcloud container clusters list
NAME   ZONE          MASTER VERSION  MASTER_IP 
kubia europe-westl-b 1.2.5  		104.155.84.137


在europe-westl-b 区域中创建了集群 创建GCE 持久磁盘
gcloud compute disks create --size=lGiB --zone=europe-west-b mongodb

apiVersion: vl 
kind: Pod 
metadata:
	name: mongodb 
spec: 
	volumes: 
	- name: mongodb-data   卷名, 与挂载卷一致
	gcePersistentDisk:     类型是GCE持久磁盘
		pdName: mongodb    名称需要与创建的PD一致
		fsType: ext4       文件系统类型
	containers: 
	- image: mongo
		name: mongodb      
		volumeMountS:
		- name: mongodb-data    挂载卷
		  mountPath: /data/db
	  ports: 
		- containerPort: 27017
		  protocol: TCP
相关推荐
Waay8 分钟前
图文详解|K8s Pod内部结构
docker·云原生·kubernetes
码点滴15 分钟前
CRI-O选型与容器运行时标准
开发语言·人工智能·架构·kubernetes·cri-o
openFuyao1 小时前
以开源之力,突破多样化算力困局——openFuyao开源一周年背后的故事
人工智能·云原生·开源·openfuyao·多样化算力·集群软件
JiaWen技术圈2 小时前
IaC 双引擎:Terraform + Ansible 完整最佳实践
云原生·ansible·terraform
万里侯2 小时前
Kubernetes成本优化:降低云原生基础设施成本的完整指南
微服务·容器·k8s
r-t-H4 小时前
KVM虚拟化与Docker基础实践-第二章
阿里云·docker·容器
牛奶咖啡136 小时前
k8s容器编排技术实践——OpenEuler安装部署k8s
kubernetes·信创·containerd配置加速器·openeuler安装k8s·k8s的常见安装方式·彻底关闭swap·工作节点使用kubectl
老码观察6 小时前
K8s 容器化部署的宿主机资源规划的踩坑实录
docker·容器·kubernetes
步步为营DotNet6 小时前
深入.NET 11:.NET Aspire 在云原生资源编排与管理的卓越实践
云原生·.net
我是谁??7 小时前
【6】基于 Docker + YOLOv8 的模型部署实战(GTX1660S + Ubuntu22.04)
yolo·docker·容器