美文网首页
K8S之NFS存储卷

K8S之NFS存储卷

作者: david161 | 来源:发表于2022-03-23 10:02 被阅读0次

    NFS介绍

    NFS 是 Network FileSystem 的缩写,顾名思义就是网络文件存储系统, 分为服务端(Server)和客户端(Client)。最早由 sun 公司开发,是类 unix 系统间实现磁盘共享的一种方法。 它允许网络中的计算机之间通过 TCP/IP 网络共享资源。通过 NFS,我们本地 NFS 的客户端应用可以透明地读写位于服务端 NFS 服务器上的文件,就像访问本地文件一样方便。简单的理解,NFS 就是可以透过网络,让不同的主机、不同的操作系统可以共享存储的服务。
    NFS 在文件传送或信息传送过程中依赖于 RPC(Remote Procedure Call) 协议,即远程过程调用,NFS 的各项功能都必须要向 RPC 来注册,如此一来 RPC 才能了解 NFS 这个服务的各项功能 Port、PID、NFS 在服务器所监听的 IP 等,而客户端才能够透过 RPC 的询问找到正确对应的端口,所以,NFS必须要有 RPC 存在时才能成功的提供服务,简单的理解二者关系:NFS是 一个文件存储系统,而 RPC是负责信息的传输。

    NFS共享存储方式

    1)手动方式静态创建所需要的PV和PVC。
    2)通过创建PVC动态地创建对应PV,无需手动创建PV。

    NFS安装

    k8s集群所有节点都需要安装NFS服务。本章节实验我们选用k8s的master节点作为NFS服务的server端。
    yum install -y nfs-utils rpcbind

    创建共享目录

    在master节点创建目录 
    mkdir -p /nfs/mariadb 
    chmod 777 /nfs/mariadb 
    
    更改归属组与用户 
    chown nfsnobody /nfs/mariadb 
    或者
    chown -R nfsnobody:nfsnobody /nfs/mariadb 
    
    vi /etc/exports 
    /nfs/mariadb *(rw,no_root_squash,no_all_squash,sync)
    
    参数说明
    image.png
    启动NFS服务

    k8s集群所有节点启动NFS服务。

    systemctl start rpcbind 
    systemctl start nfs 
    
    设置开启启动 
    systemctl enable rpcbind 
    systemctl enable nfs
    
    测试NFS服务
    在另一台 Linux 虚拟机上测试一下,是否能够正确挂载: 
    showmount -e 192.168.198.156 
    
    在客户端创建挂在目录 
    mkdir -p /data/mariadb 
    
    挂载远端目录到本地 /data/mariadb 目录 
    mount 192.168.198.156:/nfs/mariadb /data/mariadb 
    
    NFS服务端写入 
    $ echo "This is NFS server." > /nfs/mariadb/nfs.txt 
    
    客户端读取 
    cat /data/mariadb/nfs.txt 
    
    客户端写入 
    $ echo "This is NFS client." >> /data/mariadb/nfs.txt 
    
    服务端读取 
    $ cat /nfs/mariadb/nfs.txt 
    
    都是没问题的,这是因为上边设置了 NFS 远端目录权限为 rw 拥有读写权限,如果设置为 ro,那么 
    客户端只能读取,不能写入,根据实际应用场景合理配置,这里就不在演示了。这里提一下,NFS 默认 
    使用 UDP 协议来进行挂载,为了提高 NFS 的稳定性,可以使用 TCP 协议挂载,那么客户端挂载命 
    令可使用如下命令 
    
    mount 192.168.198.156:/nfs/mysql /data/mysql -o proto=tcp -o nolock
    

    客户端卸载 NFS 挂载目录

    umount /data/mariadb/ 
    
    强制卸载 
    umount -l /data/mariadb/
    

    NFS4服务

    使用NFS4协议方式进行多共享目录配置。所有共享目录的根目录为/nfs/data。服务器端的/etc/exports文件中的配置为: 
    vi /etc/exports 
    
    /nfs/data *(rw,fsid=0,sync,no_wdelay,insecure_locks,no_root_squash) 
    
    K8S的静态NFS服务PV的nfs:path 的值不用写共享根目录,直接写/mariadb即可。K8S会帮我们配置成
    /nfs/data/mariadb目录 
    
    重启NFS 
    systemctl restart rpcbind 
    systemctl restart nfs
    

    pv配置

    mountOptions: 
      - hard 
      - nfsvers=4.1 
    nfs:
      path: /mariadb 
      server: 192.168.198.156
    

    全部配置文件清单

    pv

    nfs/mariadbpv.yml

    apiVersion: v1 
    kind: PersistentVolume 
    metadata: 
      name: data-mariadb-pv 
      labels: 
        app: mariadb-pv 
    spec: 
      accessModes: 
        - ReadWriteOnce 
      capacity: 
        storage: 10Gi 
      mountOptions:
        - hard 
        - nfsvers=4.1 
      nfs:
        path: /mariadb 
        server: 192.168.198.156 
      persistentVolumeReclaimPolicy: Retain 
      storageClassName: standard 
      volumeMode: Filesystem
    

    pvc
    nfs/mariadbpvc.yml

    apiVersion: v1 
    kind: PersistentVolumeClaim 
    metadata: 
      name: mariadb-pvc 
      labels: 
        app: mariadb-pvc 
    spec: 
      accessModes: 
        - ReadWriteOnce 
      storageClassName: standard 
      resources: 
        requests: 
          storage: 5Gi
    

    service
    nfs/mariadb.yml

    apiVersion: apps/v1 
    kind: Deployment 
    metadata: 
      name: mariadb-deploy 
      labels: 
        app: mariadb-deploy 
    spec: 
      replicas: 1 
      template: 
        metadata: 
          name: mariadb-deploy 
          labels: 
            app: mariadb-deploy 
        spec: 
          imagePullSecrets: 
            - name: lagouharbor 
          containers: 
            - name: mariadb-deploy 
              image: 192.168.198.155:5000/lagouedu/mariadb:10.5.2 
              imagePullPolicy: IfNotPresent 
              ports: 
                - containerPort: 3307
              env:
                - name: MYSQL_ROOT_PASSWORD 
                  #这是mysqlroot用户的密码 
                  valueFrom: 
                    secretKeyRef: 
                      key: password 
                      name: mariadbsecret 
                - name: TZ 
                  value: Asia/Shanghai 
                  args: 
                    - "--character-set-server=utf8mb4" 
                    - "--collation-server=utf8mb4_unicode_ci" 
                  volumeMounts: 
                    - mountPath: /etc/mysql/mariadb.conf.d/  #容器内的挂载目录 
                      name: lagoumariadb #随便给一个名字,这个名字必须与volumes.name一致 
                    - mountPath: /var/lib/mysql #容器内的挂载目录 
                      name: volume-mariadb 
          restartPolicy: Always 
          volumes: 
            - name: lagoumariadb 
              configMap: 
                name: mariadbconfigmap 
            - name: volume-mariadb 
                persistentVolumeClaim: 
                  claimName: mariadb-pvc 
      selector: 
        matchLabels: 
          app: mariadb-deploy 
    --- 
    apiVersion: v1 
    kind: Service 
    metadata: 
      name: mariadb-svc 
    spec: 
      selector: 
        app: mariadb-deploy 
      ports: 
        - port: 3307 
          targetPort: 3307 
          nodePort: 30036 
      type: NodePort
    

    secret
    nfs/mariadbsecret.yml

    apiVersion: v1 
    kind: Secret 
    metadata: 
      name: mariadbsecret 
    type: Opaque 
    data: 
      password: YWRtaW4=
    

    configmap
    nfs/mariadb.yml

    apiVersion: v1 
    data: 
      my.cnf: "省略中间数据部分,请各位同学前面章节" 
    kind: ConfigMap 
    metadata: 
        name: mariadbconfigmap
    

    客户端测试

    IP:192.168.198.157 
    username:root 
    password:admin 
    prot: 30036
    

    集群调度

    k8s内pod由scheduler调度,scheduler的任务是把pod分配到合适的node节点上。scheduler调度时会考虑到node节点的资源使用情况、port使用情况、volume使用情况等等...在此基础之上,我们也可以控制pod的调度。
    Scheduler 是 kubernetes 调度器,主要的任务是把定义的 pod 分配到集群的节点上。但要很多要考虑的问题:
    1)公平:如何保证每个节点都能被合理分配资源,不要造成一个节点忙死,一个节点闲死局面。
    2)资源高效利用:集群所有资源最大化被使用。内存、硬盘、CPU等因素。
    3)效率:调度的性能要好,能够尽快地对大批量的 pod 完成调度工作。
    4)灵活:允许用户根据自己的需求控制调度的逻辑。
    Sheduler 是作为单独的程序运行,启动之后会一直与 API Server保持通讯,获取
    PodSpec.NodeName 为空的 pod,对每个 pod 都会创建一个 binding,表明该 pod 应该放到哪个节点上 。

    固定节点

    Pod.spec.nodeSelector

    前边的课程已经给大家介绍过 
    
    关键技能点: 
    1.给某一个节点打标签 
    kubectl label nodes k8s-node01 mariadb=mariadb
    
    2.pod的控制器中增加配置属性 
    ... 
        spec: 
          nodeSelector: 
            mariadb: mariadb 
    ...
    
    Pod.spec.nodeName
    删除k8s-node01节点mariadb的label 
    kubectl label nodes k8s-node02 mariadb- 
    
    kubectl label nodes k8s-node02 --show-labels
    

    修改label案例用于演示nodeName属性,pod控制器关键代码

    spec: 
      nodeName: k8s-node02
    

    全部资源文件清单

    controller

    labels/mariadb.yml

    apiVersion: apps/v1 
    kind: Deployment 
    metadata: 
      name: mariadb-deploy 
      labels: 
        app: mariadb-deploy 
    spec: 
      replicas: 1 
      template: 
        metadata: 
          name: mariadb-deploy 
          labels: 
            app: mariadb-deploy 
        spec: 
          nodeName: k8s-node02 
          imagePullSecrets: 
            - name: lagouharbor 
          containers: 
            - name: mariadb-deploy 
              image: 192.168.198.155:5000/lagouedu/mariadb:10.5.2 
              imagePullPolicy: IfNotPresent 
              ports: 
                - containerPort: 3307
              env:
                - name: MYSQL_ROOT_PASSWORD 
                  #这是mysqlroot用户的密码 
                  valueFrom: 
                    secretKeyRef: 
                      key: password 
                      name: mariadbsecret 
                - name: TZ 
                  value: Asia/Shanghai 
              args: 
                - "--character-set-server=utf8mb4" 
                - "--collation-server=utf8mb4_unicode_ci" 
              volumeMounts: 
                - mountPath: /etc/mysql/mariadb.conf.d/ #容器内的挂载目录 
                  name: lagoumariadb #随便给一个名字,这个名字必须与volumes.name一致 
          restartPolicy: Always 
            volumes: 
              - name: lagoumariadb 
                configMap: 
                  name: mariadbconfigmap 
      selector: 
        matchLabels: 
          app: mariadb-deploy
    --- 
    apiVersion: v1 
    kind: Service 
    metadata: 
      name: mariadb-svc 
    spec: 
      selector: 
        app: mariadb-deploy 
      ports: 
        - port: 3307 
          targetPort: 3307 
          nodePort: 30036 
      type: NodePort
    

    secret
    labels/mariadbsecret.yml

    apiVersion: v1 
    kind: Secret 
    metadata: 
      name: mariadbsecret 
    type: Opaque 
    data: 
      password: YWRtaW4=
    

    configmap
    labels/mariadb.yml

    apiVersion: v1 
    data: 
      my.cnf: "省略中间数据部分,请各位同学前面章节" 
    kind: ConfigMap 
    metadata: 
      name: mariadbconfigmap
    

    相关文章

      网友评论

          本文标题:K8S之NFS存储卷

          本文链接:https://www.haomeiwen.com/subject/jwwzdrtx.html