Nomad 简介
Nomad 是一款基于开源,功能强大的调度程序和集群编排引擎。可以轻松管理从单机到大规模集群的各种容器和非容器化应用程序,实现快速部署和跨平台运行。
Nomad 主要特点
- 作为单个二进制文件运行,资源占用少,
- 支持将资源管理和调度集成到一个单独的系统中,
- 支持多种驱动程序运行 job,包括 Windows、Java、VM、Docker 等,
- 支持分布式和高可用,
- 支持多数据中心,可以跨数据中心调度,
- 强大的可伸缩性,可在现实生产环境中扩展到10K+节点的集群(K8S v1.29 是 5k+ ),
- 支持插件功能,可与 Terraform、Consul、Vault 无缝集成,用于提供资源调配、服务发现和秘密管理。
Nomad 运行 Docker
今天我们以nginx:latest
为例,演示基于 Nomad 如何调度和执行 Docker 容器
准备工作
需要确保机器已经安装了 Docker 和 Nomad,如果没有安装可以参考一下安装方式,具体如下:
安装 Docker
以 Ubuntu 系统为例,其他系统安装方式可以参考官网:https://docs.docker.com/desktop/install/mac-install/
shell
# 1.安装依赖
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# 2.配置软件源
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 3.安装 Docker
sudo apt update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 4.验证 Docker
sudo docker version
安装 Nomad
以 Ubuntu 系统为例,其他系统安装方式可以参考官网:https://developer.hashicorp.com/nomad/install
shell
# 项目目录
cd example_02
# 下载安装包
curl -O 'https://releases.hashicorp.com/nomad/1.7.6/nomad_1.7.6_linux_amd64.zip'
# 解压安装包
unzip nomad_1.7.6_linux_amd64.zip && rm -rf nomad_1.7.6_linux_amd64.zip
# 验证安装包
./nomad --version
# 输出版本信息
#
# Nomad v1.7.6
# BuildDate 2024-03-12T07:27:36Z
# Revision 594fedbfbc4f0e532b65e8a69b28ff9403eb822e
Nomad 启动 Dev 模式
为了简单运行,我们以Dev 开发模式
的方式运行 Nomad agent。
shell
# 运行开发模式
./nomad agent -dev
# ==> Nomad agent configuration:
...
# Advertise Addrs: HTTP: 127.0.0.1:4646; RPC: 127.0.0.1:4647; Serf: 127.0.0.1:4648
# Bind Addrs: HTTP: [127.0.0.1:4646]; RPC: 127.0.0.1:4647; Serf: 127.0.0.1:4648
...
# Version: 1.7.6
...
# 2024-03-16T23:10:42.857+0800 [DEBUG] http: UI is enabled
...
# 2024-03-16T23:10:45.150+0800 [INFO] client: node registration complete
通过终端日志可以看到,Server 端和 Client 端都为 true,表示都已经启动成功。
当然我们也可以查看节点状态,具体如下:
shell
./nomad node status
# ID Node Pool DC Name Class Drain Eligibility Status
# 9141d0a8 default dc1 YaoMac.local <none> false eligible ready
当然,也可以通过 UI 界面进行查看,Client 和 Server 已经启动完成。
编写 Job 文件
在 Nomad 中,应用的编排和运行方式都是通过 Job 文件来描述,下面是一个web_nginx
的 Job 文件例子,具体如下:
shell
job "web_nginx" {
datacenters = ["dc1"]
group "web_nginx" {
count = 1
task "web_nginx" {
driver = "docker"
config {
image = "nginx:latest"
port_map {
http = 80
}
}
resources {
cores = 1
memory = 512
}
env {
}
}
}
}
在 Job 文件中分为job -> group -> task
三层结构,其中task
中为最终任务的配置方案,如上:
- driver 指定了以 Docker 的方式运行;
- config 指定了依赖的镜像和服务对外暴露端口;
- resources 指定了资源配置方案为 CPU 1核和 MEM 512M;
- env 指定了环境变量配置,用于在执行任务过程中向 Client 节点传递环境变量参数。
注:完整任务配置,也可以访问https://github.com/liyaodev/nomad-bootcamp
进行下载
提交和执行 Job
提交任务包含两种方式:命令行提交
和UI提交
shell
./nomad job run ./jobs/web_nginx.hcl
# ==> 2024-03-16T23:33:29+08:00: Monitoring evaluation "094a0f82"
# 2024-03-16T23:33:29+08:00: Evaluation triggered by job "web_nginx"
...
# ==> 2024-03-16T23:33:30+08:00: Monitoring deployment "3b61128e"
# ⠏ Deployment "3b61128e" in progress...
UI 界面进行上传(点击"Run Job" -> "Upload file" -> "web_nginx.hcl"),具体地址:http://127.0.0.1:4646/ui/jobs
注意⚠️:
- Job 的伸缩、扩容、调度等都可以基于 UI 界面操作
- 如果 Client 可能执行失败,是因为需要上 DockerHub 拉取镜像失败造成,这种情况,可以手动先拉取进行后再执行"Run Job",拉取地址为:docker pull nginx:latest
Nomad 调度原理
流程比较简单,我们通过一个 Nomad 集群 Docker 调度时序图进行说明,具体如下:
Nomad(Server)发起任务,Nomad(Client)执行任务,UI 可以进行所有的管理工作。
以上就是本期的全部内容,笔者荒生
,一名资深的技术开发,谢谢大家的观看,点赞、评论、加关注
你的支持就是笔者的动力,有问题也可以私信笔者
或留言询问
。