k8s数据卷概念与常用操作
节点本地数据卷
emptyDir卷
emptyDir卷
: 是一个临时存储卷
,与Pod
生命周期绑定在一起,当 Pod
被从节点上删除
时,emptyDir
卷中的数据也会被永久删除
。
emptyDir卷
的数据临时存储在/var/lib/kubelet/pods/{podid}/containers/plugins/volumes/kubernetes.io~empty-dir/
目录下.
应用场景
: Pod
中容器之间数据共享
.
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: k8s.gcr.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- name: cache-volume
# 卷类型为emptyDir
emptyDir: {}
hostPath
hostPath卷
: 挂载Pod
所在Node
的文件或目录到Pod
中的容器.
应用场景
: Pod
中容器
需要访问宿主机文件
;通常用来收集日志
.
将宿主机/tmp
目录挂载到容器/test-pd
目录
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: k8s.gcr.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /test-pd
name: test-volume
volumes:
- name: test-volume
hostPath:
# 宿主上目录位置
path: /tmp
# 此字段为可选
type: Directory
网络数据存储卷:NFS
NFS卷
: 提供对NFS
挂载支持,可以自动将NFS
共享路径挂载到Pod
中,宿主机需要安装nfs-utils
包. 适合测试环境使用,不建议生产环境使用.
- NFS优点: 配置简单,性能较高
- NFS缺点: 自身
不支持高可用
,单节点部署生产环境风险高.
nfs
的动态存储类创建的pvc
不支持动态扩容缩容
,不支持使用kubectl edit
编辑pvc
容量
rhel8搭建nfs服务器
nfs存储卷配置示例
node上必需要安装nfs的客户端
yum install nfs-utils -y
pod挂载nfs示例yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp
labels:
name: myapp
spec:
containers:
- name: myapp
image: <Image>
volumeMounts:
- mountPath: Path to mount # 容器中的挂载点(挂砸到容器中的哪个目录)
name: nfs-data # 从哪个volumes挂载
# pod资源限制
resources:
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: <Port>
volumes:
- name: nfs-data
nfs:
server: 192.168.31.63 # nfs服务器地址
path: /ifs/k8s # nfs服务器存储路径
NFS创建PV,PVC到POD挂载PVC
流程: 使用NFS创建PV----->
使用PV绑定PVC----->
POD使用PVC
---
# 使用NFS创建一个pv
apiVersion: v1
kind: PersistentVolume
metadata:
# 创建的PV的名字
name: mypv
spec:
capacity:
storage: { 2:<Size> } # 声明存储大小,例如 5Gi
volumeMode: Filesystem
accessModes:
# ReadWriteOnce:读写权限、并且只能被单个Node挂载
# ReadWriteMany:读写权限,允许被多个Node挂载
# ReadOnlyMany:只读权限,允许被多个Node挂载
- ReadWriteOnce
# pv回收策略:
# A. `Retain`模式:`PVC`删除后,PV依然存在
# C. `Delete`模式:`PVC`删除后,PV同时被删除
# D. `Recycle`模式:`PVC`删除后,PV可再次使用
persistentVolumeReclaimPolicy: Recycle
# 将NFS挂载为PV
nfs:
# NFS服务器存储目录
path: /tmp
# NFS服务器地址
server: 172.17.0.2
---
# 使用pvc绑定pv
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
# 创建的PVC存储的名字
name: mypvc
spec:
resources:
requests:
storage: { 2:<Size> } # 传入需要的存储容量,不能大于PV的容量
volumeMode: Filesystem
# ReadWriteOnce:读写权限、并且只能被单个Node挂载
# ReadWriteMany:读写权限,允许被多个Node挂载
# ReadOnlyMany:只读权限,允许被多个Node挂载
accessModes:
- ReadWriteOnce
---
# pod绑定pvc
apiVersion: v1
kind: Pod
metadata:
name: myapp
labels:
name: myapp
spec:
containers:
- name: myapp
image: <Image>
volumeMounts:
- mountPath: Path to mount # 容器中的挂载点(挂砸到容器中的哪个目录)
name: pod-data # 从哪个volumes挂载
# pod资源限制
resources:
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: <Port> # 容器暴露的端口
# 使用PVC声明一个volumes(存储卷)
volumes:
- name: pod-data # 存储卷的名字
persistentVolumeClaim:
claimName: mypvc # 要使用的pvc的名字