zoukankan      html  css  js  c++  java
  • kubernetes持久化存储

    一、nfs网络存储

     kubenetes集群中如果某个节点宕掉了,那么Pod就会漂移到其它节点,此时Pod是一个全新的状态,为了Pod可以使用之前的数据,那么需要将数据进行持久化,以便新的Pod可以继续使用。

     1、安装nfs服务器

    参考NFS网络文件共享服务 文章,有NFS服务的详细安装与使用,进行nfs的安装与目录挂载:

    [root@nfs-server ~]# showmount -e localhost
    Export list for localhost:
    /data 192.168.35.0/24

    2、集群中的每个节点安装nfs

    集群中的每个节点相当于nfs的客户端:

    # 在每个节点执行
    yum install -y nfs-utils

    然后启动每个节点的nfs以及查看挂载情况:

    # 每个节点启动
    service nfs start
    
    # 查看服务端的挂载目录,192.168.35.9是nfs服务器的ip
    [root@k8snode1 ~]# showmount -e 192.168.35.9
    Export list for 192.168.35.9:
    /data 192.168.35.0/24

    有结果就说明已经成功了。

    3、集群中使用nfs持久存储

    •  nfs-nginx.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-nfs
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            volumeMounts:
            - name: wwwroot
              mountPath: /usr/share/nginx/html
            ports:
            - containerPort: 80
          volumes:
            - name: wwwroot
              nfs:
                server: 192.168.35.9
                path: /data

    可以看到volume使用的就是nfs服务器的挂载目录来进行存储的。

    现在可以进行测试,将Pod中的/usr/share/nginx/html中的内容存储在nfs服务器中,在Pod中的目录中新建一个文件:

    [root@k8smaster ~]# kubectl exec -it nginx-nfs-545c5b9d75-79dl6 bash
    kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead.
    root@nginx-nfs-545c5b9d75-79dl6:/# cd /usr/share/nginx/html/
    root@nginx-nfs-545c5b9d75-79dl6:/usr/share/nginx/html# ls
    root@nginx-nfs-545c5b9d75-79dl6:/usr/share/nginx/html# touch index.html

    现在去nfs服务器的/data目录中去查看:

    [root@nfs-server data]# ll
    总用量 0
    -rw-r--r--. 1 nfsnobody nfsnobody 0 6月  28 05:34 index.html

    这样就完成了nfs持久存储了。

    二、PVC和PV

    1、概念

    上述的持久化方式是可行的,但是有一些问题,那就是Deployment资源与持久化volumes没有解耦,这样nfs服务器信息就会暴露,这里就是用PVC(PersistentVolumeClaim)和PV(PersistentVolume)。它们是集群中提供的连个新的API资源。

    PV是集群中由管理员配置的网络存储,是容量插件,获取存储实现的详细信息,比如NFS等。

    PVC是由用户进行存储的请求,PVC消耗PV资源,PVC和PV是一一对应的,它们之间可以通过比如容量等条件进行匹配。

     2、使用

     如果需要应用必定需要PVC和PV,那么首先定义PV文件:

    • pv.yaml
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: my-pv
    spec:
      capacity:
        storage: 5Gi
      accessModes:
        - ReadWriteMany
      nfs:
        path: /data
        server: 192.168.35.9

    执行并且查看:

    # 执行
    [root@k8smaster ~]# kubectl create -f pv.yaml 
    persistentvolume/my-pv created
    
    # 查看
    [root@k8smaster ~]# kubectl get PersistentVolume
    NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
    my-pv   5Gi        RWX            Retain           Available                                   10s
    •  pvc.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-dep1
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            volumeMounts:
            - name: wwwroot
              mountPath: /usr/share/nginx/html
            ports:
            - containerPort: 80
          volumes:
          - name: wwwroot
            persistentVolumeClaim:
              claimName: my-pvc
    
    ---
    
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: my-pvc
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 5Gi

    在pvc中定义了5Gi容量的请求资源,它会去寻找这个匹配容量资源的pv。

    执行并且查看:

    # 执行
    [root@k8smaster ~]# kubectl create -f pvc.yaml 
    deployment.apps/nginx-dep1 created
    
    # 查看
    persistentvolumeclaim/my-pvc created
    [root@k8smaster ~]# kubectl get PersistentVolumeClaim
    NAME     STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    my-pvc   Bound    my-pv    5Gi        RWX                           21s
    [root@k8smaster ~]# kubectl get pod
    NAME                                                READY   STATUS              RESTARTS   AGE
    nginx-dep1-58b7bf955f-mmz4q                         0/1     ContainerCreating   0          29s
    nginx-dep1-58b7bf955f-rcg7t                         0/1     ContainerCreating   0          29s
    nginx-dep1-58b7bf955f-zwxwx                         1/1     Running             0          29s
    • 测试
    # 在某个deployment资源中添加文件index1.html
    [root@k8smaster ~]# kubectl exec -it nginx-dep1-58b7bf955f-mmz4q bash
    kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead.
    root@nginx-dep1-58b7bf955f-mmz4q:/# cd /usr/share/ 
    X11/             debconf/         gcc-8/           man/             polkit-1/
    adduser/         debianutils/     gdb/             menu/            readline/
    base-files/      dict/            info/            misc/            sensible-utils/
    base-passwd/     doc/             java/            nginx/           tabset/
    bash-completion/ doc-base/        keyrings/        pam/             terminfo/
    bug/             dpkg/            libc-bin/        pam-configs/     xml/
    ca-certificates/ fontconfig/      lintian/         perl5/           zoneinfo/
    common-licenses/ fonts/           locale/          pixmaps/         zsh/
    root@nginx-dep1-58b7bf955f-mmz4q:/# cd /usr/share/nginx/html/
    root@nginx-dep1-58b7bf955f-mmz4q:/usr/share/nginx/html# ls
    index.html
    root@nginx-dep1-58b7bf955f-mmz4q:/usr/share/nginx/html# touch index1.html
    root@nginx-dep1-58b7bf955f-mmz4q:/usr/share/nginx/html# ls
    index.html  index1.html
    
    # 在nfs服务器挂载目录中查看
    [root@nfs-server data]# ll
    总用量 0
    -rw-r--r--. 1 nfsnobody nfsnobody 0 6月  28 15:34 index1.html
    -rw-r--r--. 1 nfsnobody nfsnobody 0 6月  28 05:34 index.html
    作者:iveBoy
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    实验室网络管理记
    mondrian schema一个简单的例子
    powerdesigner数据库设计导入oracle9i
    linux 的mount命令
    [转]moto面试题
    Oracle数据库服务解释
    数据聚集技术在mondrian中的实现
    发现台湾的mondrian资料 + pentaho截图
    一个封装比较完整的FTP类(转载)
    oracle 网页管理工具登录接口
  • 原文地址:https://www.cnblogs.com/shenjianping/p/14941015.html
Copyright © 2011-2022 走看看