系列文章

概述

显然,如果 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. harbor仓库主从同步

  2. Python生成随机验证

    Python生成随机验证码   Python生成随机验证码,需要使用PIL模块. 安装: 1 pip3 install pillow 基本使用 1. 创建图片 1 2 3 4 5 6 7 8 9 fr ...

  3. WC2021及学长分享题目

    部分题目见洛谷题单 动态更新. 标 * 为想做的题. hdhd: CF1214G Feeling Good CF1305F Kuroni and the Punishment AGC016F Game ...

  4. 可视化生信分析利器 Galaxy 之 Docker 开发

    1. 背景 我们常常会基于某个 image 来启动一个 container,在这个 container 中我们可能会执行某些操作,比如创建一个文件,但是当这个 container 退出以后,如果我们以 ...

  5. 编码器 | 基于 Transformers 的编码器-解码器模型

    基于 transformer 的编码器-解码器模型是 表征学习 和 模型架构 这两个领域多年研究成果的结晶.本文简要介绍了神经编码器-解码器模型的历史,更多背景知识,建议读者阅读由 Sebastion ...

  6. elementUi+table实现表格数据滚动

    elementUi+table实现表格数据滚动 引用vue和elementUI CDN // 引用elementUI CDN <script src="https://unpkg.co ...

  7. Spring配置动态数据库

    前言 本文主要介绍使用spring boot 配置多个数据库,即动态数据库 开始搭建 首先创建一个SpringWeb项目--dynamicdb(spring-boot2.5.7) 然后引入相关依赖lo ...

  8. 离线安装rpm包以及自建yum仓库

    离线安装rpm包以及自建yum仓库 离线安装rpm yum支持如下参数 --downloadnoly 只下载不安装 --downloaddir=directory 下载到指定目录下 因此可以在线下载好 ...

  9. 【HarmonyOS】一文教你如何在H5页面中使用电话、定位及导航

    ​[关键字] HarmonyOS.H5页面.拨打电话.获取系统定位.跳转高德地图导航 [1.写在前面] 上一篇中我们带领大家实现了一个在低码项目中跳转加载H5页面的功能,有兴趣的可以参考以下文章: h ...

  10. Go 语言 context 都能做什么?

    原文链接: Go 语言 context 都能做什么? 很多 Go 项目的源码,在读的过程中会发现一个很常见的参数 ctx,而且基本都是作为函数的第一个参数. 为什么要这么写呢?这个参数到底有什么用呢? ...