容器会被频繁地创建和销毁,销毁时保存在容器中的数据也会被清除,为了持久化容器中的数据,K8S 引入了Volume的概念,通过Volume实现同一个Pod中不同容器之间的数据共享以及持久化存储,当容器终止或者重启时Volume中的数据也不会丢失
配置存储(存储配置信息)
ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
namespace: ns-configMap # 命名空间
name: configmap # 名称
data:
info: # 配置信息
username: admin
password: 123456
- 挂载到Pod
apiVersion: v1
kind: Pod
metadata:
namespace: ns-volume # 要与ConfigMap的namespace一致
name: volume-configmap
spec:
containers:
- name: nginx
image: nginx
ports:
- name: port-nginx
containerPort: 80
protocol: TCP
volumeMounts:
- name: logs-volume
mountPath: /var/log/nginx
volumes:
- name: logs-volume
configMap:
name: configmap # configmap名称
Secret(类似于ConfigMap,主要用于存储敏感信息)
apiVersion: v1
kind: Secret
metadata:
namespace: ns-Secret # 命名空间
name: secret # 名称
type: Opaque
data:
username: YWRtaW4=
password: MTIzNDU2
- 挂载到Pod
apiVersion: v1
kind: Pod
metadata:
namespace: ns-volume # 要与Secret的namespace一致
name: volume-secret
spec:
containers:
- name: nginx
image: nginx
ports:
- name: port-nginx
containerPort: 80
protocol: TCP
volumeMounts:
- name: logs-volume
mountPath: /var/log/nginx
volumes:
- name: logs-volume
secret:
secretName: secret # Secret 名称
运行时数据存储
EmptyDir
当 Pod 指定到某个节点上时,首先创建的是一个 EmptyDir 卷,只要 Pod 在该节点上运行卷就一直存在。当 Pod 因为某些原因被从节点上删除时,EmptyDir 卷中的数据也会永久删除,所以EmptyDir一般用做于临时空间使用
apiVersion: v1
kind: Pod
metadata:
namespace: ns-volume
name: volume-emptyDir
spec:
containers:
- name: nginx
image: nginx
ports:
- name: port-nginx
containerPort: 80
protocol: TCP
volumeMounts:
- name: logs-volume
mountPath: /var/log/nginx
volumes:
- name: logs-volume
emptyDir: {}
kubectl apply -f /home/lixing/demo/volume-emptyDir.yaml
kubectl get deployment,pods,service,ingress -n ns-volume -o wide
kubectl describe pod volume-emptyDir -n ns-volume
kubectl delete pod volume-emptyDir -n ns-volume --force --grace-period=0
HostPath
将Node主机中的一个实际目录挂载到Pod中供容器使用,但如果Pod重新创建后转移到了其它Node上,那么数据就找不到了
apiVersion: v1
kind: Pod
metadata:
namespace: ns-volume
name: volume-hostPath
spec:
containers:
- name: nginx
image: nginx
ports:
- name: port-nginx
containerPort: 80
protocol: TCP
volumeMounts:
- name: logs-volume
mountPath: /var/log/nginx
volumes:
- name: logs-volume
hostPath:
path: /root/logs
type: DirectoryOrCreate
kubectl apply -f /home/lixing/demo/volume-hostPath.yaml
kubectl get deployment,pods,service,ingress -n ns-volume -o wide
kubectl describe pod volume-hostPath -n ns-volume
kubectl delete pod volume-hostPath -n ns-volume --force --grace-period=0
NFS(类似于这样的文件服务器有很多)
搭建 NFS 服务器高可用集群,将Pod上的数据存储到 NFS 系统上,无论Pod怎么漂移都可以访问数据
apiVersion: v1
kind: Pod
metadata:
namespace: ns-volume
name: volume-nfs
spec:
containers:
- name: nginx
image: nginx
ports:
- name: port-nginx
containerPort: 80
protocol: TCP
volumeMounts:
- name: logs-volume
mountPath: /var/log/nginx
volumes:
- name: logs-volume
nfs:
server: 192.168.111.111
path: /root/data/nfs
kubectl apply -f /home/lixing/demo/volume-nfs.yaml
kubectl get deployment,pods,service,ingress -n ns-volume -o wide
kubectl describe pod volume-nfs -n ns-volume
kubectl delete pod volume-nfs -n ns-volume --force --grace-period=0
高级存储
PV (K8S对存储资源的抽象,关联具体的存储资源)
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv2
spec:
nfs: # 存储类型,与底层真正存储对应
capacity: # 存储能力,目前只支持存储空间的设置
storage: 2Gi
accessModes: # 访问模式
storageClassName: # 存储类别
persistentVolumeReclaimPolicy: # 回收策略
PVC(对PV资源的申请)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
namespace: ns-volume # PVC命名空间
name: pvc # PVC名称
spec:
accessModes: # 访问模式
- ReadWriteMany
selector: #采用标签对PV选择
storageClassName: #存储类别
resources: #请求空间
requests:
storage: 1Gi
挂载Pod
apiVersion: v1
kind: Pod
metadata:
namespace: ns-volume # 要与pvc的namespace一致
name: volume-nfs
spec:
containers:
- name: nginx
image: nginx
ports:
- name: port-nginx
containerPort: 80
protocol: TCP
volumeMounts:
- name: logs-volume
mountPath: /var/log/nginx
volumes:
- name: logs-volume
persistentVolumeClaim:
claimName: pvc # PVC名称
readOnly: false