• 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
      }
    

    保存,然后在此客户端上重新启动 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
    ...
    

    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
          }
        }
      }
    }
    
    

    具体说明如下:

    • 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 编写.

  • 相关阅读:
    pytorch升级打怪(三)
    c++多线程(一)线程管理
    常见项目管理中npm包操作总结
    【华为机试真题 JAVA】最长子字符串的长度-100
    字符和字节的区别
    继承关系中构造函数、析构函数的调用顺序详解
    【二分查找】leetcode 1818. 绝对差值和
    【HDLBits 刷题 13】Circuits(8)Buliding Larger Circuits
    @Transaction注解的应用
    [语音识别] 基于Python构建简易的音频录制与语音识别应用
  • 原文地址:https://www.cnblogs.com/east4ming/p/17684129.html