• 【云原生 • Kubernetes】kubernetes 核心技术 - 持久化存储



    在这里插入图片描述


    在以往的数据卷存储形式中,存储是本地存储,也就是说当我们的节点 pod 重启过后,数据便会清空,这仅仅适合临时存储。而要让数据长久的存储下来,就需要引入持久化存储

    一、nfs 网络存储

    1. master 节点部署 nfs(nfs 服务端)

    首先我们需要将一台虚拟机/服务器作为 nfs服务器,并安装 nfs、设置挂载路径。在这里我使用 master 节点虚拟机 【k8s_master】 作为 nfs 服务器,IP 地址为 192.168.200.132;

    在这里插入图片描述
    第一步:安装 nfs;

    yum install -y nfs-utils
    
    • 1

    在这里插入图片描述
    第二步:设置挂载路径,vi /etc/exports 进入文件,在该文件中加入以下内容;

    在这里插入图片描述
    我这里挂载的是 /data/nfs 目录(可自定),* 代表所有内容,rw 代表授予读写权限;

    第三步:创建要挂载的目录 /data/nfs,如果不创建目录后面会报错找不到该目录;

    [root@master ~]# mkdir data
    [root@master ~]# cd data
    [root@master data]# mkdir nfs
    [root@master data]# ls
    nfs
    [root@master data]# 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    此时,nfs 服务端部署完成。

    2. node 节点部署 nfs

    k8s 集群中代表 node 节点的虚拟机/服务器中也安装 nfs;

    提示:k8s 集群的完整搭建过程均已在往期文章讲述,文章之间内容环环相扣,详情请参见专栏 云原生 - 入门到实战

    在这里我使用 node 节点虚拟机【k8s_node1】和【k8s_node2】,IP 地址分别为 192.168.200.133、192.168.200.134;

    k8s_node1
    k8s_node2

    3. 网络存储验证演示

    第一步:在 nfs 服务端(master 节点)启动 nfs;

    systemctl start nfs
    
    • 1

    启动之后可以使用命令 ps -ef | grep nfs 查看 nfs 进程;

    在这里插入图片描述
    第二步:新建一个目录 pv 和 yaml 文件 nfs-nginx.yaml;

    [root@master ~]# mkdir pv
    [root@master ~]# cd pv
    [root@master pv]# vi nfs-nginx.yaml
    
    • 1
    • 2
    • 3

    yaml 文件中写入以下内容:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-dep1
    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.200.132
                  path: /data/nfs
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    在这里插入图片描述
    第三步:在 yaml 文件创建成功后执行该文件;

    [root@master pv]# kubectl apply -f nfs-nginx.yaml 
    deployment.apps/nginx-dep1 created
    [root@master pv]# 
    
    • 1
    • 2
    • 3

    如果启动文件时报错请先关闭系统的防火墙 service iptables stop

    此时查看 pods 可以看到我们创建的 nginx-dep1,为 running 状态即创建成功;

    在这里插入图片描述

    第四步:进入 nginx-dep1

    kubectl exec -it nginx-dep1-6f58f9944b-zz25r bash
    
    • 1

    接下来就可以使用我们在 yaml 文件中挂载的目录 /usr/share/nginx/html 了;开始查看该目录一定是为空的,当我们 nfs 目录下创建任何文件时,文件都会存储在此挂载目录,且是持久化存储。

    二、PV 和 PVC

    1. PV、PVC 介绍

    在网络存储的方式中,我们必须要知道 nfs 服务器的 IP 地址,那么如若 IP 地址泄露,安全则不能被保障,所以该方法弊端明显。而 PV 和 PVC 则可以解决该弊端:

    • PV:PersistentVolume 持久化存储,对存储资源进行抽象,可以对外提供一个专门用于调用的接口(生产者)。
    • PVC:PersistentVolumeClaim 持久化存储调用,用户调用无需关系内部实现细节,直接调用即可(消费/调用者)。

    2. 实现流程

    第一步:在 pv 目录下创建 pv.yaml 文件,写入以下内容;

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: my-pv
    spec:
       capacity: 
         storage: 5Gi
       accessModes: 
         - ReadWriteMany
       nfs: 
         path: /k8s/nfs
         server: 192.168.200.132
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    第二步:在 pv 目录下创建 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    第三步:执行 yaml 文件;

    kubectl apply -f pv.yaml
    kubectl apply -f pvc.yaml
    
    • 1
    • 2

    之后的操作则与 nfs 相同,区别在于此方法多了一层 PVC。

  • 相关阅读:
    小程序容器技术,加速车联网安全生态运转
    大规模语言模型高效参数微调--BitFit/Prefix/Prompt 微调系列
    2. 两数相加
    【动态规划刷题 18】(hard)回文子串&& (hard)最长回文子串
    OWASP Top 10漏洞解析(3)- A3:Injection 注入攻击
    DDD从入门到精通(请点赞收藏)
    循环购:一种具有裂变能力的商业模式
    信息物理系统CPS&工业信息物理系统ICPS
    学习笔记7--交通环境行为预测
    仿游戏热血江湖游戏类22(得到物品基本攻击力2)
  • 原文地址:https://blog.csdn.net/weixin_53072519/article/details/126773289