zoukankan      html  css  js  c++  java
  • k8s 创建nfs

     一般步骤:搭建nfs>创建pv>创建pvc>创建pod

    搭建nfs

    #master节点安装nfs
    [root@k8s-master nginx]# yum -y install nfs-utils
    #创建nfs目录
    [root@k8s-master nginx]# mkdir -p /nfs/data/
    #修改权限
    [root@k8s-master nginx]# chmod -R 777 /nfs/data
    #编辑export文件,这个文件就是nfs默认的配置文件,要共享多个文件就都在这里注册一下,并创建相应目录并给与权限,也可以将*改为指定的IP地址,多个ip就空格隔开
    [root@k8s-master nginx]# vim /etc/exports
    /nfs/data *(rw,no_root_squash,sync)
    #配置生效
    [root@k8s-master nginx]# exportfs -r
    #查看生效
    [root@k8s-master nginx]# exportfs
    /nfs/data       <world>
    #启动rpcbind、nfs服务
    [root@k8s-master nginx]# systemctl restart rpcbind && systemctl enable rpcbind
    [root@k8s-master nginx]# systemctl restart nfs && systemctl enable nfs
    Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
    #查看 RPC 服务的注册状况
    [root@k8s-master nginx]# rpcinfo -p localhost
       program vers proto   port  service
        100000    4   tcp    111  portmapper
        100000    3   tcp    111  portmapper
        100000    2   tcp    111  portmapper
        100000    4   udp    111  portmapper
    
    #showmount测试
    [root@k8s-master nginx]# showmount -e 192.168.0.66
     Export list for 192.168.0.66:

    #挂载对应的nfs目录到本地, 挂载前要检查此目录是否存在
    [root@k8s-master nginx]# mount -t nfs 10.10.14.52:/nfs/data /nfs/data
    #取消挂载(对应的本地路径)
    [root@k8s-master nginx]# umount /nfs/data
    /etc/exports文件内容格式:
    <输出目录> [客户端1 选项(访问权限,用户映射,其他)] [客户端2 选项(访问权限,用户映射,其他)]
    
    a. 输出目录:
        输出目录是指NFS系统中需要共享给客户机使用的目录;
    
    b. 客户端:
       客户端是指网络中可以访问这个NFS输出目录的计算机
       客户端常用的指定方式
         指定ip地址的主机:192.168.0.200
         指定子网中的所有主机:192.168.0.0/24 192.168.0.0/255.255.255.0
         指定域名的主机:david.bsmart.cn
         指定域中的所有主机:*.bsmart.cn
         所有主机:*
    
    c. 选项:
       选项用来设置输出目录的访问权限、用户映射等。NFS主要有3类选项:
    
       访问权限
         设置输出目录只读:ro
         设置输出目录读写:rw
    
       用户映射
         all_squash:将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody);
         no_all_squash:与all_squash取反(默认设置);
         root_squash:将root用户及所属组都映射为匿名用户或用户组(默认设置);
         no_root_squash:与rootsquash取反;
         anonuid=xxx:将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx);
         anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx);
    
       其它选项
         secure:限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置);
         insecure:允许客户端从大于1024的tcp/ip端口连接服务器;
         sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;
         async:将数据先保存在内存缓冲区中,必要时才写入磁盘;
         wdelay:检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置);
         no_wdelay:若有写操作则立即执行,应与sync配合使用;
         subtree:若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置);
         no_subtree:即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;
    固定nfs服务端口以便设置防火墙
    vi /etc/sysconfig/nfs
    # uncomment the following options
    RQUOTAD_PORT=875
    LOCKD_TCPPORT=32803
    LOCKD_UDPPORT=32769
    MOUNTD_PORT=892
    STATD_PORT=662
    
    # then stop nfs, stop prcbind, start rpcbind, start nfs
    # use "lsof -nPi" to check the listening ports
    iptables中需要开放的端口
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 111 -j ACCEPT
    -A INPUT -m state --state NEW -m udp -p udp --dport 111 -j ACCEPT
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 662 -j ACCEPT
    -A INPUT -m state --state NEW -m udp -p udp --dport 662 -j ACCEPT
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 875 -j ACCEPT
    -A INPUT -m state --state NEW -m udp -p udp --dport 875 -j ACCEPT
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 892 -j ACCEPT
    -A INPUT -m state --state NEW -m udp -p udp --dport 892 -j ACCEPT
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 2049 -j ACCEPT
    -A INPUT -m state --state NEW -m udp -p udp --dport 2049 -j ACCEPT

     创建pvc

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: nfs-pv
      namespace: default
      labels:
        pv: nfs-pv
    spec:
      capacity:
        storage: 100Mi
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain
      # storageClassName: nfs 可以不指定,但要指定前必须先创建,否则pvc会报错
      nfs:  
        server: 192.168.0.66
        path: "/nfs/data"   #NFS目录,需要该目录在NFS上存在


    [root@k8s-master nfs]# kubectl apply -f pv.yaml 
    persistentvolume/nfs-pv created
    [root@k8s-master nfs]# kubectl get pv
    NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
    nfs-pv   100Mi      RWX            Retain           Available   

    创建pvc

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: nfs-pvc
      namespace: default
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 50Mi  #容量
      selector:
        matchLabels:
          pv: nfs-pv   #关联pv 的label,key/value要一致,可以不指定,pvc会自动找到匹配的pv,否则会一直处于pending状态直到有合适的pv

    创建pod

    vim nginx.yaml #我们用nginx镜像进行验证,将html目录映射到nfs目录中
    #deploy
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nfs-nginx
      namespace: default
    spec:
      selector:
        matchLabels:
          app: nfs-nginx
      replicas: 2
      template:
        metadata:
          labels:
            app: nfs-nginx
        spec:
          containers:
          - name: nginx-web
            image: nginx:latest
            ports:
            - containerPort: 80
            volumeMounts:
            - mountPath: /usr/share/nginx/html
              name: html
          volumes:
          - name: html
            persistentVolumeClaim:
              claimName: nfs-pvc
    ---
    #service
    apiVersion: v1
    kind: Service
    metadata:
      name: nfs-nginx
      namespace: default
    spec:
      type: NodePort
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
        nodePort: 31681
      selector:
        app: nfs-nginx






    [root@k8s-master nfs]# kubectl apply -f nginx.yaml
    [root@k8s-master nfs]# kubectl get pods  -o wide
    NAME                         READY   STATUS    RESTARTS   AGE   IP            NODE        NOMINATED NODE   READINESS GATES
    nfs-nginx-7695b95db6-l74zx   1/1     Running   0          12s   10.244.2.93   k8s-node1   <none>           <none>
    nfs-nginx-7695b95db6-qcqp8   1/1     Running   0          12s   10.244.1.22   k8s-node2   <none>           <none>
    

     

    验证

    各节点安装并启用nfs
    yum install nfs-utils
    systemctl start nfs & systemctl enable nfs
    systemctl start rpcbind & systemctl enable rpcbind
    我们在/nfs/data/nginx目录创建了一个1.html文件
    <html>
    <body>Test01</body>
    </html>
    
    
    在容器1的/usr/share/nginx/html目录创建文件2.html
    <html>
    <body>Test02</body>
    </html>
    
    
    在容器2的/usr/share/nginx/html目录创建文件3.html
    <html>
    <body>Test03</body>
    </html>
    
    分别浏览器访问路由正常
    
    
    此外我们进入容器查看,目录中文件是共享的:
    root@nfs-nginx-7695b95db6-l74zx:/usr/share/nginx/html# ls
    1.html  2.html  3.html
    
    
    
    pod销毁重建
    kubectl delete -f nginx.yaml
    kubectl apply -f nginx.yaml
    再次访问1.html/2.html/3.html,依旧可以访问到,说明文件未丢失。
    
    root@nfs-nginx-7695b95db6-78wml:/usr/share/nginx/html# ls
    1.html  2.html  3.html
    #新创建的容器,依旧可以看到这些文件

    使用kuboard方式:先创建nfs服务,步骤同上

    再在pod里配置:

    方法一:适合于配置了pvc的方式

     前面的名字logs随便自定义,下面的存储卷声明选自己绑定的pvc

     pod配置里添加挂载点,第一行是容器内路径,自定义,第二行是权限,第三行选你上图中自定义的名字,后面的子路径可以自定义。

    方法二:没有配置pvc(更简便)

     第一行第二个选NFS,下面第一行填你nfs服务端的ip,第二行填你nfs服务端的挂载路径

     同样在pod配置的挂载点里添加容器内挂载路径,自定义的挂载卷名字以及子路径

  • 相关阅读:
    常见Oracle HINT的用法
    2011年的每一天是周几?
    TOM上关于JOIN跟+号的讨论
    关于index_ffs使用索引的一点问题.
    数据库中分组字符串相加
    国服3.3.5:死亡骑士全系DPS饰品收益评分
    WLK狂暴战怎么玩
    3.3萨满手册
    关于clob类型在函数中的处理。
    pivot_clause [Oracle SQL]
  • 原文地址:https://www.cnblogs.com/miaoweiye/p/14754375.html
Copyright © 2011-2022 走看看