容器内的文件夹与外面的文件映射的方式有emptydir, hostpath,
emptydir与pod的生命周期一样,pod重启后emptydir会消失
hostpath可以永久保存, 但一旦pod被调度到其他节点,hostpath也不可再用
持久性存储:NFS, PV, PVC

现在先来生成NFS
1. docker run -d --net=host \ --privileged --name nfs-server \ katacoda/contained-nfs-server:centos7 \ /exports/data-0001 /exports/data-0002
以上步骤为用容器启动一个NFS server
/exports/data-0001 /exports/data-0002表明在NFS server中暴露了两个文件夹data-001, data-002用来存储数据
2.生成两个PV,分别映射到NFS server的两个文件夹data-0001和data-0002
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-0001
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteOnce
- ReadWriteMany
persistentVolumeReclaimPolicy: Recycle
nfs:
server: 172.17.0.14
path: /exports/data-0001
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-0002
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
- ReadWriteMany
persistentVolumeReclaimPolicy: Recycle
nfs:
server: 172.17.0.14
path: /exports/data-0002
3.以上NFS server,PV都由专业的运维人员生成
4.PV的使用者生成PVC去匹配合适的PV, 比较关键的两个参数为accessMode和storage
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: claim-http
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: claim-mysql
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
5.在pod的yaml文件里定义好pod容器里的挂载点和对应的PVC
apiVersion: v1
kind: Pod
metadata:
name: www
labels:
name: www
spec:
containers:
- name: www
image: nginx:alpine
ports:
- containerPort: 80
name: www
volumeMounts:
- name: www-persistent-storage
mountPath: /usr/share/nginx/html
volumes:
- name: www-persistent-storage
persistentVolumeClaim:
claimName: claim-http
apiVersion: v1
kind: Pod
metadata:
name: www2
labels:
name: www2
spec:
containers:
- name: www2
image: nginx:alpine
ports:
- containerPort: 80
name: www2
volumeMounts:
- name: www-persistent-storage
mountPath: /usr/share/nginx/html
volumes:
- name: www-persistent-storage
persistentVolumeClaim:
claimName: claim-http
apiVersion: v1
kind: Pod
metadata:
name: mysql
labels:
name: mysql
spec:
containers:
- name: mysql
image: openshift/mysql-55-centos7
env:
- name: MYSQL_ROOT_PASSWORD
value: yourpassword
- name: MYSQL_USER
value: wp_user
- name: MYSQL_PASSWORD
value: wp_pass
- name: MYSQL_DATABASE
value: wp_db
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql/data
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: claim-mysql
就可以使用了
另附动态存储卷

如上图所示为集群管理员创建和管理PV,是静态的PV

如上图所示集群管理员管理StorageClass(StorageClass为一种资源),系统制动生成PV并绑定PVC
动态存储卷和静态存储卷的区别在于,动态存储卷的PV是动态生成,而静态存储卷的PV是集群管理员手工创建的
在动态资源供应模式下,通过StorageClass和PVC完成资源的动态绑定(系统自动生成PV),而后供pod使用
动态存储卷的定义:
storageClass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: standard
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
zone: us-east-1d
iopsPerGB: "10"
如上所示,StorageClass中的关键配置参数为
- provisioner-------存储资源的提供者,目前k8s支持的provisioner多以kubernetes.io开头,用户也可以自定义provisioner,但要符合规范。 现有的provisioner举例:aws-ebs, gce-pd,glusterfs, cinder
- parameters------provisioner的参数设置,不同的provisioner参数设置不同
aws-ebs的参数:
type: 可选项为iol, gp2, sc1, st1, 默认值为gp2
zone: AWS zone的名称
iopsPerGB: 仅用于iol类型的volume,意为每秒每GiB的I/O操作数量
encrypted:是否加密
kmsKeyId: 加密时的Amazon Resource Name
浙公网安备 33010602011771号