容器内的文件夹与外面的文件映射的方式有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

 

posted on 2021-12-14 17:02  吃鱼高手  阅读(111)  评论(0)    收藏  举报