• Nomad 系列-Nomad 挂载存储卷


    系列文章

    概述

    显然,如果 Nomad 要运行有状态存储,那么挂载存储卷就是必备功能。

    Nomad 允许用户通过多种方式将持久数据从本地或远程存储卷装载到任务环境中:

    • 容器存储接口(CSI)插件
    • Nomad 主机卷支持
    • Docker Volume 驱动程序

    默认没有安装 CSI 的情况下,主要使用的是 Nomad 主机卷 方式。

    Nomad 的主机卷允许将 Nomad 客户端上的任何目录挂载到分配中。这些目录可以是客户机上的简单目录,但也可以是挂载文件系统,如 NFS 或 GlusterFS。然后可以将这些 mounts 连接到任务组中的各个任务。

    Tailscale 挂载 socket

    在后文中,Traefik 要通过 Tailscale 的 socket 和 Tailscale 通信以获取证书。那么我么也可以通过 Nomad 主机卷(只读)的方式将 socket 挂载到 Traefik 容器中。

    Nomad 主机卷简介

    Nomad 主机卷 (Host Volume) 可以管理 Nomad 集群内运行的有状态工作负载的存储。

    Nomad 主机卷提供了一种与工作负载无关的方式来指定资源,可用于 Nomad 驱动程序,如 execjavadocker

    Nomad 主机卷使用步骤

    创建主机目录

    在集群中的 Nomad 客户端节点上,创建一个用于持久化 MySQL 数据的目录。对于本例,让我们创建目录 /opt/mysql/data:

    sudo mkdir -p /opt/mysql/data

      配置 Nomad 客户端

      编辑对应的 Nomad 客户端上的 Nomad 配置以创建主机卷。

      host_volume 块添加到 Nomad 配置的 client 块:

        host_volume "mysql" {
          path      = "/opt/mysql/data"
          read_only = false
        }
      • 1
      • 2
      • 3

      保存,然后在此客户端上重新启动 Nomad 服务,以激活主机卷。在客户端上,您可以使用 nomad node status 命令验证主机卷是否已配置,如下所示:

      $ nomad node status -short -self
      ID           = 12937fa7
      Name         = ip-172-31-15-65
      Class        = 
      DC           = dc1
      Drain        = false
      Eligibility  = eligible
      Status       = ready
      Host Volumes = mysql
      Drivers      = docker,exec,java,mock_driver,raw_exec,rkt
      ...
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10

      Job 使用 Nomad 主机卷

      以一个 MySQL Job - mysql.nomad.hcl 为例,示例如下:

      job "mysql-server" {
        type        = "service"
      
        group "mysql-server" {
          count = 1
      
          volume "mysql" {
            type      = "host"
            read_only = false
            source    = "mysql"
          }
      
          task "mysql-server" {
            driver = "docker"
      
            volume_mount {
              volume      = "mysql"
              destination = "/var/lib/mysql"
              read_only   = false
            }
      
            env = {
              "MYSQL_ROOT_PASSWORD" = "password"
            }
      
            config {
              image = "hashicorp/mysql-portworx-demo:latest"
              ports = ["db"]
            }
          }
          network {
            port "db" {
              static = 3306
            }
          }
        }
      }
      
      • 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

      具体说明如下:

      • volume "mysql" {: 指定要使用的 volume, 类似于 K8s 中的 PV, 这里具体是:
        • type = "host": Nomad Host Volume 类型
        • read_only = false: 非只读
        • source = "mysql": source 是 Nomad Client 里配置的host_volume "mysql"
      • volume_mount {: Docker Driver 中的 volume_mount 块,指定挂载到容器中的具体路径,类似于 K8s 中的 PVC:
        • volume = "mysql": 对应的 volume 是上面的 mysql volume
        • destination = "/var/lib/mysql": 挂载到容器中的 /var/lib/mysql 目录
        • read_only = false: volume_mount 块的 read_only 配置

      启动该 Job 即可使用 host volume:

      nomad run mysql.nomad.hcl

        完成🎉🎉🎉

        总结

        在本文中,使用客户端本地目录在 Nomad 客户端上配置了主机卷。我们创建了一个将此卷挂载到 Docker MySQL 容器的作业,并可以在主机卷中写入数据。并为后文 Nomad + Traefik + Tailscale 打下基础。

        📚️参考文档

        三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.

      • 相关阅读:
        双十一什么数码好物值得买?双十一最值得买的数码好物分享
        java字符串的学习总结
        springboot源码理解五、SpringApplication初始化
        游戏设计模式专栏(五):三步学会原型模式
        SDRAM 控制器(三)——自动刷新模块
        目标检测算法之YOLOv5在乒乓球赛事中运动员行为分析领域的应用实例详解(基础版--上)
        环形链表的判断思路
        Revit二次开发——视图
        开源Linux社区Armbian开发指南
        如何让 Llama2、通义千问开源大语言模型快速跑在函数计算上?
      • 原文地址:https://blog.csdn.net/east4ming/article/details/132732218