0%

K8s持久化存储【使用NFS】

k8s所有节点安装NFS

yum install nfs-utils
 
#所有节点,不论NFS服务端还是客户端
systemctl enable rpcbind
systemctl start rpcbind
 
#NFS服务端
systemctl enable nfs
systemctl start nfs

在NFS服务端配置挂载磁盘

  • 创建目录:mkdir /data
  • 修改权限:chmod 755 /data
  • 编辑NFS配置:vi /etc/exports
  • 添加:/data/ 192.168.0.0/24(rw,sync,no_root_squash,no_all_squash)
  • 重启:systemctl restart nfs
  • 或者执行exportfs -r生效
  • 检查:showmount -e localhost

K8s中创建PersistentVolume

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv0003
spec:
  capacity: #容量
     storage:5Gi
  volumeMode: Filesystem #存储卷模式
  accessModes: #访问模式
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle #持久化卷回收策略
  storageClassName: slow #存储类
  mountOptions: #挂接选项
   - hard
   - nfsvers=4.1
  nfs:
     path: /data
     server: 172.17.0.2

访问模式(Access Modes)

只要资源提供者支持,持久卷能够通过任何方式加载到主机上。每种存储都会有不同的能力,每个PV的访问模式也会被设置成为该卷所支持的特定模式。例如NFS能够支持多个读写客户端,但某个NFS PV可能会在服务器上以只读方式使用。每个PV都有自己的一系列的访问模式,这些访问模式取决于PV的能力。

访问模式的可选范围如下:

  • ReadWriteOnce:该卷能够以读写模式被加载到一个节点上。
  • ReadOnlyMany:该卷能够以只读模式加载到多个节点上。
  • ReadWriteMany:该卷能够以读写模式被多个节点同时加载。

类(Class)

在PV中可以指定存储类,通过设置storageClassName字段进行设置。如果设置了存储类,则此PV只能被绑定到也指定了此存储类的PVC。

回收策略

当前的回收策略可选值包括:

  • Retain-持久化卷被释放后,需要手工进行回收操作。
  • Recycle-基础擦除(rm-rf /thevolume/*
  • Delete-相关的存储资产,例如AWSEBS或GCE PD卷一并删除。
    目前,只有NFSHostPath支持Recycle策略,AWSEBS、GCE PD支持Delete策略。

K8s中创建PersistentVolumeClaim

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: myclaim
spec:
  accessModes: #访问模式
    - ReadWriteOnce
  volumeMode: Filesystem #存储卷模式
  resources: #资源
    requests:
      storage: 8Gi
  storageClassName: slow #存储类
  selector: #选择器
    matchLabels:
      release: "stable"
    matchExpressions: #匹配表达式
      - {key: environment, operator: In, values: [dev]}

选择器

在PVC中,可以通过标签选择器来进一步的过滤PV。仅仅与选择器匹配的PV才会被绑定到PVC中。选择器的组成如下:

  • matchLabels: 只有存在与此处的标签一样的PV才会被PVC选中;
  • matchExpressions :匹配表达式由键、值和操作符组成,操作符包括In, NotIn, ExistsDoesNotExist,只有符合表达式的PV才能被选择。
    如果同时设置了matchLabelsmatchExpressions,则会进行求与,即只有同时满足上述匹配要求的PV才会被选择。

存储类

如果PVC使用storageClassName字段指定一个存储类,那么只有指定了同样的存储类的PV才能被绑定到PVC上。对于PVC来说,存储类并不是必须的。依赖于安装方法,可以在安装过程中使用add-on管理器将默认的StorageClass部署至Kubernetes集群中。当PVC指定了选择器,并且指定了StorageClass,则在匹配PV时,取两者之间的与:即仅仅同时满足存储类和带有要求标签值的PV才能被匹配上。

Pod使用刚刚创建的持久化存储

kind: Pod
apiVersion: v1
metadata:
  name: mypod
spec:
  containers:
  - name: myfrontend
    image: dockerfile/nginx
     volumeMounts: #挂接存储卷
     - mountPath: "/var/www/html" #POD内挂接的路径
       name: mypd #所要挂接的存储卷的名称
 volumes: #定义存储卷
 - name: mypd
   persistentVolumeClaim: #所使用的持久化存储卷声明
     claimName: myclaim