跳到主要内容

volumes

2024年11月13日
柏拉文
越努力,越幸运

一、volumes


1.1 认识

Kubernetes 中,volumes 是用于在容器中挂载存储的抽象,帮助容器实现数据共享、持久化以及配置文件的管理等功能。通过 volumes,可以将配置文件等内容以只读方式共享给容器,确保这些文件不会被修改。

1.2 语法

volumes:
- name: config-volume // ConfigMap 卷类型,将配置文件以键值对的方式存储,并挂载到 Pod 的文件系统中。共享配置文件等无需修改的内容,将 ConfigMap 挂载为只读卷即可。
configMap:
name: my-config
- name: secret-volume // Secret 卷类型, 类似 ConfigMap,用于存储敏感信息(如密码、密钥),并以加密形式存储。将敏感信息作为只读配置挂载到容器,防止篡改。
secret:
secretName: my-secret
- name: shared-temp // emptyDir 卷类型, 为同一 Pod 中的多个容器共享临时存储,生命周期与 Pod 相同。用于共享临时数据,如日志或临时文件。
emptyDir: {}
- name: persistent-storage // persistentVolumeClaim 卷类型, 连接到 Persistent Volume,实现持久存储。用于在 Pod 重启后仍需保留的数据,适合持久化存储。
persistentVolumeClaim:
claimName: my-pvc

1.3 生命周期

Pod volume 的生命周期与 Pod 绑定:

  1. Pod 被删除时,Volume 也会被清理

  2. 某些 Volume 类型(如 PersistentVolume)可以独立于 Pod 存在,允许数据跨 Pod 保留。

二、Volume 类型: NFS


2.1 认识

NFS 类型: 挂载网络文件存储。适用于多 Pod 共享存储或大型分布式系统。通过 NFS Volume, 可以将很多应用的存储放到统一的一个地方。

2.2 语法

volumes:
- name: nfs-storage
nfs:
server: 192.168.1.100
path: /exported-path

2.3 部署 NFS Volume

CentOS ARM64 架构虚拟机上,使用 Kubernetes 实现 PodNFS Volume 挂载,可以按照以下步骤进行配置和操作。

1. 安装 NFS 工具: 在 Master 节点和 Worker Node 节点安装 NFS 工具

sudo yum update -y
sudo yum install -y nfs-utils

2. 创建 NFS 共享目录: 在 Master 节点创建共享目录

sudo mkdir -p /mnt/nfs_share
sudo chown -R nobody:nobody /mnt/nfs_share
sudo chmod 755 /mnt/nfs_share

3. NFS 共享目录配置: Master 节点编辑 /etc/exports 文件,添加共享配置

# 1. 执行以下命令
sudo vim /etc/exports

# 2. 添加以下内容
/mnt/nfs_share *(rw,sync,no_root_squash,no_subtree_check)

4. 启动 NFS 共享服务: Master 节点启动 NFS 服务

sudo systemctl enable nfs-server --now
sudo systemctl start nfs-server

5. Master 节点检查共享是否生效

sudo exportfs -rv

6. Master 节点查看服务状态

sudo systemctl status nfs-server

2.4 应用 NFS Volume

一、Pod_NFS_Volume: 定义 Pod,并挂载 NFS PVC

apiVersion: v1
kind: Pod
metadata:
name: pod-nfs
spec:
containers:
- name: nginx-pod-nfs
image: registry.cn-hangzhou.aliyuncs.com/bolawen/nginx:1.27.1-perl-linux-arm64
ports:
- containerPort: 80
volumeMounts:
- name: nfs-content
mountPath: /usr/share/nginx/html
volumes:
- name: nfs-content
nfs:
server: k8s-master # Master 主机名
path: /mnt/nfs_share

二、Pod_NFS_PVC: 定义 NFS 类型的 PVC, 然后 Pod 使用 PVC 挂载

# 创建 NFS Volume 的 PV
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
nfs:
server: k8s-master # Master 主机名
path: /mnt/nfs_share
# 定义 PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
# 定义 Pod, 并挂载 NFS PVC
apiVersion: v1
kind: Pod
metadata:
name: nfs-pod
spec:
containers:
- name: nginx
image: nginx:latest
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: nfs-storage
volumes:
- name: nfs-storage
persistentVolumeClaim:
claimName: nfs-pvc

三、Volume 类型: Secret


3.1 认识

Secret 类型: 挂载敏感数据,如密码或令牌。适用于为容器提供安全的数据存储。

3.2 语法

volumes:
- name: secret-volume
secret:
secretName: my-secret

四、Volume 类型: emptyDir


emptyDir 类型: Pod 启动时创建的临时目录,Pod 删除时数据清除。适用于短期数据存储或容器间数据共享。

apiVersion: v1
kind: Pod
metadata:
name: empty-dir-volume-demo
spec:
volumes:
- name: empty-dir-volume
emptyDir: {}
containers:
- name: myapp
image: busybox
volumeMounts:
- name: empty-dir-volume
mountPath: /data/log
command: ["cat", "/etc/config/config-file"]

五、Volume 类型: HostPath


5.1 认识

hostPath 类型: 挂载主机节点上的指定目录到容器。适用于调试或访问节点上的特定资源。hostPath 是节点本地资源,Pod 调度到其他节点时无法访问同一个路径, 如果需要跨节点共享存储,建议使用网络存储(如 NFSPersistentVolume)。 hostPath 直接访问宿主机文件系统,可能导致安全问题,需谨慎使用。

5.2 语法

volumes:
- name: host-storage
hostPath:
path: /data
type: DirectoryOrCreate
  • volumes.hostPath.path

  • volumes.hostPath.type:

    • DirectoryOrCreate: 最常用的类型。如果路径不存在,Kubernetes 会自动创建目录。

5.3 场景

一、部署 Nginx 并通过 hostPath 挂载宿主机文件夹: 通过 hostPathKubernetes 中将宿主机的文件或目录挂载到 Pod 中的容器内,可以直接让容器访问宿主机的文件系统。

# 1. 创建 nginx-hostpath.yaml 文件
apiVersion: v1
kind: Pod
metadata:
name: nginx-hostpath
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
volumeMounts:
- name: nginx-content
mountPath: /usr/share/nginx/html
volumes:
- name: nginx-content
hostPath:
path: /data/nginx-content
type: DirectoryOrCreate

# 2. 创建宿主机目录: 在 Kubernetes 节点宿主机上执行以下命令创建挂载目录:

sudo mkdir -p /data/nginx-content
echo "Hello from hostPath!" | sudo tee /data/nginx-content/index.html

# 3. 部署 Pod 使用以下命令创建 Pod
kubectl apply -f nginx-hostpath.yaml

# 4. 访问 Nginx 服务:

kubectl get pod nginx-hostpath -o wide // 通过 Pod 的 IP 地址访问

curl http://<POD_IP> // 使用返回的 Pod IP

# 5. 验证文件更新: 在宿主机更新文件时,Pod 中的挂载路径也会自动反映更改。
sudo echo "Updated content from host!" > /data/nginx-content/index.html

# 6. 再次访问
curl http://<POD_IP>

六、Volume 类型: ConfigMap


6.1 认识

ConfigMap 类型: 挂载配置文件数据。适用于将配置或非敏感数据注入容器。

6.2 语法

volumes:
- name: config-volume
configMap:
name: my-config

6.2 语法

volumes:
- name: config-volume
configMap:
name: my-config

七、Volume 类型: PersistentVolumeClaim (PVC)


7.1 认识

PVC (PersistentVolumeClaim): 持久化存储,结合 PersistentVolume (PV) 使用,支持动态或静态存储分配。适用于需要持久化数据且独立于 Pod 生命周期。

7.2 语法

volumes:
- name: persistent-storage
persistentVolumeClaim:
claimName: my-pvc

八、Volume 类型: CSI (Container Storage Interface)


8.1 认识

CSI (Container Storage Interface): 支持云提供商或第三方存储插件,支持动态卷管理。适用于需要灵活扩展的云存储解决方案。