volumes
一、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
绑定:
-
当
Pod
被删除时,Volume
也会被清理 -
某些
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
实现 Pod
的 NFS 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
调度到其他节点时无法访问同一个路径, 如果需要跨节点共享存储,建议使用网络存储(如 NFS
或 PersistentVolume
)。 hostPath
直接访问宿主机文件系统,可能导致安全问题,需谨慎使用。
5.2 语法
volumes:
- name: host-storage
hostPath:
path: /data
type: DirectoryOrCreate
-
volumes.hostPath.path
-
volumes.hostPath.type
:DirectoryOrCreate
: 最常用的类型。如果路径不存在,Kubernetes
会自动创建目录。
5.3 场景
一、部署 Nginx
并通过 hostPath
挂载宿主机文件夹: 通过 hostPath
在 Kubernetes
中将宿主机的文件或目录挂载到 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
): 支持云提供商或第三方存储插件,支持动态卷管理。适用于需要灵活扩展的云存储解决方案。