• k8s入门之PV和PVC(八)


    某些应用是要持久化数据的,如果直接持久化在pod所在节点,当pod因为某种原因重建或被调度另外一台节点,是无法访问到之前持久化的数据,所以需要一个公共存储数据的地方,无论pod删除重建或重新调度到其他节点都能访问原来的数据,使用nfs就可以到达此目的。

    一、安装nfs

    1.在k8sMaster主节点上安装nfs服务端

    apt install -y nfs-kernel-server
    systemctl start nfs-server
    systemctl enable nfs-server
    systemctl status nfs-server
    

    查看安装后的状态为active

    创建目录并设置权限

    mkdir -p /nfs/data
    echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports
    

    不要忘了重启nfs-server

    systemctl restart nfs-server
    

    2.在两台k8sworker节点上安装nfs客户端

    apt install -y nfs-common
    mkdir -p /nfs/data
    # 把本地的/nfs/data挂载到主节点上
    mount 192.168.59.110:/nfs/data /nfs/data
    

    3.测试

    在某台worker节点上往目录中写入测试文件数据

    echo "nfs data" >> /nfs/data/test.txt
    

    在所有节点上都能查看到写入的数据,并且是一样的

    二、使用原始方式挂载pod数据目录

    1.先删除之前dev名称空间下的所有资源

    kubectl delete ns dev
    

    2.把ns、deployment、svc资源的描述合并在一个yaml文件中

    vi nginx-deploy-svc.yaml
    
    apiVersion: v1
    kind: Namespace
    metadata:
      name: dev
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: nginx
      name: nginx
      namespace: dev
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - image: nginx
            name: nginx
            volumeMounts:
            - name: nginxvolume
              mountPath: /usr/share/nginx/html
          volumes:
          - name: nginxvolume
            #通过nfs服务挂载
            nfs:
              server: 192.168.59.110
              # 此处要特别注意:一定要手动创建nginx子目录,否则pod在过载的时候会报目录不存在异常
              path: /nfs/data/nginx
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: svc-nginx
      name: svc-nginx
      namespace: dev
    spec:
      selector:
        app: nginx
      type: NodePort
      ports:
      - port: 8000
        protocol: TCP
        targetPort: 80
    

    3.创建资源对象

    kubectl apply -f nginx-deploy-svc.yaml
    

    查看svc的ip与端口号

    4.测试

    在挂载目录中创建index.html

    echo "hello,nfs" >> /nfs/data/nginx/index.html
    

    通过ip端口访问,可以看到读取的就是nfs目录中的内容

    现在你可以把dev名称空间删除,然后重新创建这些资源,再次访问的时候,发现数据还在。

    三、PV

    PV:持久卷(Persistent Volume),将应用需要持久化的数据保存到指定位置,与namespace无关

    1.先创建nfs目录

    # 在master节点执行
    mkdir -p /nfs/data/01
    mkdir -p /nfs/data/02
    mkdir -p /nfs/data/03
    

    2.创建基于nfs的pv对象

    (1)创建pv资源文件

    vi pv.yaml
    

    (2)编写三个pv资源对象,大小分别是:10M,1G,5G

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-10m
    spec:
      capacity:
        storage: 10M
      accessModes:
        - ReadWriteMany
      storageClassName: nfs
      nfs:
        path: /nfs/data/01
        server: 192.168.59.110
    ---
    
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-1gi
    spec:
      capacity:
        storage: 1Gi
      accessModes:
        - ReadWriteMany
      storageClassName: nfs
      nfs:
        path: /nfs/data/02
        server: 192.168.59.110
    ---
    
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-5gi
    spec:
      capacity:
        storage: 5Gi
      accessModes:
        - ReadWriteMany
      storageClassName: nfs
      nfs:
        path: /nfs/data/03
        server: 192.168.59.110
    

    (3)创建pv对象

    kubectl apply -f pv.yaml
    

    3.查看创建结果

    kubectl get pv
    

    pv对象列表

    某个pv对象的详细信息

    四、PVC

    PVC:持久卷申明(Persistent Volume Claim),申明需要使用的持久卷规格

    1.创建pvc

    (1)创建pvc资源文件

    vi pvc.yaml
    

    (2)编写pvc资源申明信息

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: nginx-pvc
      namespace: dev
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          # 申请200M的空间
          storage: 200Mi
      storageClassName: nfs
    

    (3)创建pvc对象

    kubectl apply -f pvc.yaml
    

    2.查看创建结果

    kubectl get pvc -owide -n dev
    

    由于申请的是200M空间,可以看到k8s自定绑定到合适的pv对象上,即选择大小为1G的pv对象。

    再回过头来查看pv对象的绑定信息,可以看到已经和刚刚创建的pvc对象绑定了。

    五、绑定pod与pvc

    1.创建新的yaml文件

    (1)新建资源文件

    vi nginx-dp-svc-pvc.yaml
    

    (2)使用persistentVolumeClaim属性指定刚刚创建的nginx-pvc对象

    apiVersion: v1
    kind: Namespace
    metadata:
      name: dev
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: nginx
      name: nginx
      namespace: dev
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - image: nginx
            name: nginx
            volumeMounts:
            - name: nginxvolume
              mountPath: /usr/share/nginx/html
          volumes:
          - name: nginxvolume
            # 使用pvc
            persistentVolumeClaim:
              claimName: nginx-pvc
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: svc-nginx
      name: svc-nginx
      namespace: dev
    spec:
      selector:
        app: nginx
      type: NodePort
      ports:
      - port: 8000
        protocol: TCP
        targetPort: 80
    

    (3)创建pod,svc对象

    kubectl apply -f nginx-dp-svc-pvc.yaml
    

    2.测试

    由于申请的是pvc是与名称为pv-1gi的pv对象绑定的,所以往/nfs/data/02文件夹中写入index.htm文件进行测试

    echo "hello,pv" >> /nfs/data/02/index.html
    

    使用ip访问服务,可以看到正确输出了内容

    再次查看pv,pvc信息

    3.删除pod

    当删除pod,与之绑定的pvc对象也会被删除,pv对象的状态变成Released

  • 相关阅读:
    【Skynet 入门实战练习】开发环境搭建 | 运行第一个项目 | debug console 简单使用
    C++模板详解
    【AI学习】RAG与推荐系统
    极值点偏移2
    基于sklearn的决策树应用实战
    顺序栈算法库构建
    最长公共前缀
    SpringSecurity - 启动流程分析(六)
    SpringBoot+Vue实现前后端分离的二手交易平台
    chatgpt相关问题解答
  • 原文地址:https://www.cnblogs.com/chuandao/p/16200783.html