美文网首页Kubernetes 修仙录
锻骨境-第7层 k8s文件系统实现PVC挂载

锻骨境-第7层 k8s文件系统实现PVC挂载

作者: 一笑醉红颜zh | 来源:发表于2019-10-30 16:35 被阅读0次

    我就是我,不一样的烟火。

    容器是可以随时死去的,但是,我们在容器执行完成之后,需要把结果存储下来,而我们的pod 是在各个主机上的,或者是一组pod 协同工作的时候,需要同时读写一块共同的数据,那么自然需要一个共同的可用的存储,我们使用的NFS 文件系统。
    这里说明如何做安装nfs 服务已经使用k8s 创建在nfs 上创建pv,pvc 。

    搭建NFS 服务

    NFS需要nfs-utils和rpcbind两个包, 但安装nfs-utils时会一起安装上rpcbind

      rpcinfo -p
      rpm -qa |grep nfs-utils
      yum -y install nfs-utils
     # 设置开机启动
     systemctl enable rpcbind.service 
     systemctl enable nfs-server.service
    # 启动
      systemctl start nfs-utils
      systemctl enable  nfs-utils
    # 查看nfs服务信息
      rpcinfo -p
    # 关闭防火墙 
    systemctl stop firewalld.service
    
    # 客户端只需要client 连接服务端即可
    yum install nfs-utils
    # 客户端验证
    [root@localhost ~]# showmount -e 192.168.64.133
    Export list for 192.168.64.133:
    /home/nfs *
    #  客户端挂载,挂载访问点:把服务端的文件目录挂载在本地 ,本地是/data/kubernetes 
    mkdir  -p /data/kubernetes 
    mount -t nfs 192.168.10.134:/dada/k8s /data/kubernetes  -o proto=tcp -o nolock
    
    # 意思就是服务端上的挂载点是134 的 dada/k8s , 133 本地的目录是 /data/kubernetes 
    
    注意:挂载的时候,挂载点 /data/kubernetes 目录必须已经存在, 且在 /data/kubernetes 目录中没有文件或子目录。
    
    
    

    k8s 的pv pvc

    k8s  配置nfs provisor ,一个提供者,创建完storageCalss 之后,创建pv ,然后创建pvc 
    
    静态是直接指定多大的pv,指定使用多大的pvc 
    动态是从pvc 大小,自动的创建 pv 进行绑定,是和静态创建相反的过程。
    即:
    如果在pv 中指定了nfs 的路径,则是静态pv 
    如果是通过provisor 来指定,是动态pv 。
    

    在k8s 原先配置一个nfs RBAC权限,使用create 命令创建。

    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: nfs-provisioner
    ---
    kind: ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: nfs-provisioner-runner
    rules:
      - apiGroups: [""]
        resources: ["persistentvolumes"]
        verbs: ["get", "list", "watch", "create", "delete"]
      - apiGroups: [""]
        resources: ["persistentvolumeclaims"]
        verbs: ["get", "list", "watch", "update"]
      - apiGroups: ["storage.k8s.io"]
        resources: ["storageclasses"]
        verbs: ["get", "list", "watch"]
      - apiGroups: [""]
        resources: ["events"]
        verbs: ["watch", "create", "update", "patch"]
      - apiGroups: [""]
        resources: ["services", "endpoints"]
        verbs: ["get"]
      - apiGroups: ["extensions"]
        resources: ["podsecuritypolicies"]
        resourceNames: ["nfs-provisioner"]
        verbs: ["use"]
    ---
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: run-nfs-provisioner
    subjects:
      - kind: ServiceAccount
        name: nfs-provisioner
        namespace: default
    roleRef:
      kind: ClusterRole
      name: nfs-provisioner-runner
      apiGroup: rbac.authorization.k8s.io
    

    配置一个nfs provisioner :

    kind: Deployment
    apiVersion: extensions/v1beta1
    metadata:
      name: nfs-client-provisioner
    spec:
      replicas: 1
      strategy:
        type: Recreate
      template:
        metadata:
          labels:
            app: nfs-client-provisioner
        spec:
          serviceAccount: nfs-provisioner
          containers:
            - name: nfs-client-provisioner
              image: registry.cn-hangzhou.aliyuncs.com/open-ali/nfs-client-provisioner
              volumeMounts:
                - name: nfs-client-root
                  mountPath: /persistentvolumes
              env:
                - name: PROVISIONER_NAME
                  value: fuseim.pri/ifs
                - name: NFS_SERVER
                  value: 192.168.64.134
                - name: NFS_PATH
                  value: /dada/kubernetes 
          volumes:
            - name: nfs-client-root
              nfs:
                server: 192.168.64.134
                path: /dada/kubernetes 
    
    
    

    配置storageClass

    apiVersion: storage.k8s.io/v1beta1
    kind: StorageClass
    metadata:
      name: managed-nfs-storage 
    provisioner: fuseim.pri/ifs
    

    测试例子:

    apiVersion: apps/v1beta1
    kind: StatefulSet
    metadata:
      name: web1
    spec:
      serviceName: "nginx3"
      replicas: 1
      volumeClaimTemplates:
      - metadata:
          name: default
          annotations:
            volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
        spec:
          accessModes: [ "ReadWriteOnce" ]
          resources:
            requests:
              storage: 2Gi 
      template:
        metadata:
         labels:
           app: nginx3
        spec:
         containers:
         - name: nginx
           image: nginx:1.7.9
           volumeMounts:
           - mountPath: "/mnt"
             name: default
    
    

    部署

    [root@bogon statefulset]# kubectl create -f deployment-nfs.yaml
    [root@bogon statefulset]# kubectl get deployment
    NAME                     DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    nfs-client-provisioner   1         1         1            1           36m
    
    [root@bogon statefulset]# kubectl create -f storageclass-nfs.yaml
    [root@bogon statefulset]# kubectl get storageclass 
    NAME                  PROVISIONER      AGE
    managed-nfs-storage   fuseim.pri/ifs   36m
    
    
    [root@bogon statefulset]# kubectl create -f statefulset-nfs.yaml
    statefulset "web" created
    
    
    
    [root@bogon statefulset]# kubectl get  pvc 
    
    
    

    小结

    pvc 其实就是在 /dada/kubernetes 上这个目录下存储的数据,这个数据在 133 上可以从/data/kubernetes 上可以看到 。

    volumeClaimTemplates 下的metadata.name属性必须和最下面的voluments.name属性一致,创建pod 的会校验。默认动态生成的pvc名称就是 : {volumeClaimTemplates.metadata.name}-{podName}"。 通过注解方式实现动态pvc绑定。
    动态创建的pvc 删除之后,根据 策略,如果是delete ,pv也会自动删除、

    相关文章

      网友评论

        本文标题:锻骨境-第7层 k8s文件系统实现PVC挂载

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