一款比 K8S 更好用的编排工具——Nomod 中运行 Docker

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 可以进行所有的管理工作。


以上就是本期的全部内容,笔者荒生,一名资深的技术开发,谢谢大家的观看,点赞、评论、加关注你的支持就是笔者的动力,有问题也可以私信笔者留言询问

相关推荐
NiNg_1_2344 小时前
SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能
java·spring boot·后端
Chrikk5 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*5 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue5 小时前
go语言连续监控事件并回调处理
开发语言·后端·golang
杜杜的man5 小时前
【go从零单排】go语言中的指针
开发语言·后端·golang
customer087 小时前
【开源免费】基于SpringBoot+Vue.JS周边产品销售网站(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·java-ee·开源
Yaml48 小时前
智能化健身房管理:Spring Boot与Vue的创新解决方案
前端·spring boot·后端·mysql·vue·健身房管理
小码编匠9 小时前
一款 C# 编写的神经网络计算图框架
后端·神经网络·c#