系列文章

概述

显然,如果 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 = <none>
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 编写.

Nomad 系列-Nomad 挂载存储卷的更多相关文章

  1. OpenStack Train版-15.创建并挂载存储卷

    1.创建并挂载存储卷 创建一个1GB的卷 source ~/demo-openrc openstack volume create --size 1 volume1 很短的时间后,卷状态应该从crea ...

  2. Docker系列05—Docker 存储卷详解

    本文收录在容器技术学习系列文章总目录 1.存储卷介绍 1.1 背景 (1)docker 的 AFUS 分层文件系统 docker镜像由多个只读层叠加面成,启动容器时,docker会加载只读镜像层并在镜 ...

  3. Docker系列03—Docker 存储卷

    一.存储卷介绍 1.1 背景 Docker 的 AFUS 分层文件系统 docker镜像由多个只读层叠加而成,启动容器时,docker会加载只读镜像层并在镜像栈顶部加一个读写层: 如果运行的容器修改了 ...

  4. (九)Kubernetes 存储卷

    Kubernetes存储卷概述 Pod本身具有生命周期,这就带了一系列的问题,第一,当一个容器损坏之后,kubelet会重启这个容器,但是文件会丢失-这个容器会是一个全新的状态:第二,当很多容器在同一 ...

  5. Kubernetes 学习12 kubernetes 存储卷

    一.概述 1.我们此前讲过根据应用本身是否需要持久存储数据以及某一次请求和之前的请求是否有联系,可以分为四类应用 a.有状态,要存储 b.有状态,无持久存储 c.无状态,要存储 d.无状态,无持久存储 ...

  6. kubernetes系列12—二个特色的存储卷configmap和secret

    本文收录在容器技术学习系列文章总目录 1.configmap 1.1 认识configmap ConfigMap用于保存配置数据的键值对,可以用来保存单个属性,也可以用来保存配置文件.ConfigMa ...

  7. kubernetes系列10—存储卷详解

    本文收录在容器技术学习系列文章总目录 1.认识存储卷 1.1 背景 默认情况下容器中的磁盘文件是非持久化的,容器中的磁盘的生命周期是短暂的,这就带来了一系列的问题:第一,当一个容器损坏之后,kubel ...

  8. k8s系列---存储卷pv/pvc。configMap/secert

    因为pod是有生命周期的,pod一重启,里面的数据就没了.所以我们需要数据持久化存储. 在k8s中,存储卷不属于容器,而是属于pod.也就是说同一个pod中的容器可以共享一个存储卷. 存储卷可以是宿主 ...

  9. SUSE CaaS Platform 4 - Ceph RBD 作为 Pod 存储卷

    RBD存储卷 目前 CaaSP4 支持多种 Volume 类型,这里选择 Ceph RBD(Rados Block Device),主要有如下好处: Ceph 经过多年开发,已经非常熟,社区也很活跃: ...

  10. kubernetes系列(十四) - 存储之PersistentVolume

    1. PersistentVolume(PV)简介 1.1 为什么需要Persistent Volume(PV) 1.2 PersistentVolume(PV)和Volume的区别 1.3 PV和P ...

随机推荐

  1. Vue 新建项目+基本语法

    新建项目: 导入依赖:    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.21/dist/vue.min.js"> ...

  2. 将远程oracle数据库导入到本地

    一.切换用户 先从普通用户 切换到root (有些时候会因为无权限直接执行 su - oracle 会被拒绝) fssa@jzsql.sn.com:/home/fssa>su - 从当前用户切换 ...

  3. Linux下程序时间消耗监控与统计

    良好的计时器可帮助程序开发人员确定程序的性能瓶颈,或对不同算法进行性能比较.但要精确测量程序的运行时间并不容易,因为进程切换.中断.共享的多用户.网络流量.高速缓存访问及转移预测等因素都会对程序计时产 ...

  4. 浙大Jarvisoj [XMAN]level6 Writeup

    分析代码 初始化 0x0804A2EC:保存malloc(0xC10)返回的指针 malloc(0xC10) 0 1 ... ... value note 总数:256 已使用 note 数 0 一. ...

  5. STL-priority_queue(ACM)

    1.无法访问v.front().v.back() 2.是一个 堆,默认为大根堆,改造后为小根堆 大根堆 重构函数(默认)(大根堆) priority_queue<int> v; 基本操作 ...

  6. @SafeVarargs注解的使用

    在声明具有模糊类型(比如:泛型)的可变参数的构造函数或方法时,Java编译器会报unchecked警告.鉴于这些情况,如果程序员断定声明的构造函数和方法的主体不会对其varargs参数执行潜在的不安全 ...

  7. [ARM 汇编]进阶篇—异常处理与中断—2.4.2 ARM处理器的异常向量表

    异常向量表简介 在ARM架构中,异常向量表是一组固定位置的内存地址,它们包含了处理器在遇到异常时需要跳转到的处理程序的入口地址.每个异常类型都有一个对应的向量地址.当异常发生时,处理器会自动跳转到对应 ...

  8. 【对比】ChatGPT Plus与ChatGPT实操对比体验

    前言 缘由 20美刀大洋充值ChatGPT Plus,必须分享让它物尽其用 应单位追求科技前沿需求,以及花钱就是香的原则.遂找了远在他乡的高中老同学,斥资20美刀为公司身先士卒怒充会员.秉承分享至上原 ...

  9. 基于JavaFX的扫雷游戏实现(一)——整体概述

    我在不要更新挑战中坚持了一年,你也来试试吧(咕咕咕)!   好言归正传,本次更新带来的是经典游戏扫雷,基于JavaFX实现.篇幅有限,文章主要介绍核心操作实现,不会列出所有代码.需要完整源码或是想预览 ...

  10. 【题解】ABC293E Sol

    题目大意 给定整数 \(A,X,M\),求 \(\sum\limits^{X-1}_{i=0} A^i\) 对 \(M\) 取模的值. 数据范围:\(1 \le A,M \le 10^9\),\(1 ...