👋 在云原生、容器化、微服务、服务网格等概念风靡的当下,Kubernetes 已经成为了云原生计算平台的事实标准。但 Kubernetes 的学习曲线较高,而且随着其功能不断扩展,维护成本也随之增加。那么,是否所有场景都需要部署一个庞大的 Kubernetes 集群呢?是否有更轻量级的方案能够满足我们的需求?
💡 答案是肯定的!Hashicorp 公司推出的 Nomad 工具就提供了轻量级的集群管理和微服务部署调度方案,它足够灵活,能够满足各种场景下的需求。
🚀 本文将带你深入探索 Nomad 的世界,并通过实际案例演示如何使用 Nomad 实现集群管理和微服务部署调度。
一. Nomad 集群的搭建:轻装上阵,快速起航
🏗️ Nomad 是一个基于 Go 语言实现的集群管理和工作负载调度器,它支持 Docker 容器、虚拟机、原生可执行程序等多种驱动形式的工作负载调度,并支持跨数据中心调度。
🤝 Nomad 与 Consul 和 Vault 紧密协作,分别负责服务发现和密钥管理,这使得 Nomad 更加轻量级,调度性能更高。
🚀 下面我们将通过基于 Consul 自动建立 Nomad 集群的方式,快速搭建一个 Nomad 集群。
1. Consul 集群启动
🚀 首先,我们需要启动一个 Consul 集群。在之前的文章中,我们已经详细介绍了 Consul 集群的搭建方法。这里,我们直接列出步骤,不再赘述。
💻 在每个节点上下载 Consul 1.4.4 版本:
# wget -c https://releases.hashicorp.com/consul/1.4.4/consul_1.4.4_linux_amd64.zip
# unzip consul_1.4.4_linux_amd64.zip
# cp consul /usr/local/bin
# consul -v
🚀 启动 Consul 集群:
# nohup consul agent -server -ui -dns-port=53 -bootstrap-expect=3 -data-dir=~/.bin/consul-install/consul-data -node=consul-1 -client=0.0.0.0 -bind=172.16.66.102 -datacenter=dc1 > consul-1.log & 2>&1
# nohup consul agent -server -ui -dns-port=53 -bootstrap-expect=3 -data-dir=/root/consul-install/consul-data -node=consul-2 -client=0.0.0.0 -bind=172.16.66.103 -datacenter=dc1 -join 172.16.66.102 > consul-2.log & 2>&1
# nohup consul agent -server -ui -dns-port=53 -bootstrap-expect=3 -data-dir=/root/consul-install/consul-data -node=consul-3 -client=0.0.0.0 -bind=172.16.66.104 -datacenter=dc1 -join 172.16.66.102 > consul-3.log & 2>&1
👀 验证 Consul 集群是否启动成功:
# consul members
# consul operator raft list-peers
2. DNS 设置(可选)
🌐 如果采用基于 Consul DNS 的服务发现方式,则需要在每个 Nomad client 节点上设置 DNS。
💻 在每个节点上创建和编辑 /etc/resolvconf/resolv.conf.d/base
文件,添加以下内容:
nameserver {consul-1-ip}
nameserver {consul-2-ip}
🚀 重启 resolvconf 服务:
# /etc/init.d/resolvconf restart
3. 基于 Consul 集群引导启动 Nomad 集群
🚀 在每个节点上下载 Nomad:
# wget -c https://releases.hashicorp.com/nomad/0.8.7/nomad_0.8.7_linux_amd64.zip
# unzip nomad_0.8.7_linux_amd64.zip.zip
# cp ./nomad /usr/local/bin
# nomad -v
💻 创建 Nomad 配置文件 agent.hcl
:
// agent.hcl
data_dir = "/root/.bin/nomad-install/nomad.d"
server {
enabled = true
bootstrap_expect = 3
}
client {
enabled = true
}
🚀 启动 Nomad 集群:
# nohup nomad agent -config=/root/.bin/nomad-install/agent.hcl > nomad-1.log & 2>&1
# nohup nomad agent -config=/root/.bin/nomad-install/agent.hcl > nomad-2.log & 2>&1
# nohup nomad agent -config=/root/.bin/nomad-install/agent.hcl > nomad-3.log & 2>&1
👀 验证 Nomad 集群是否启动成功:
# nomad server members
# nomad operator raft list-peers
# nomad node-status
📊 Nomad 还提供一个 UI 界面 (http://nomad-node-ip:4646/ui),可以直观地查看 Nomad 集群的状态,包括 server、clients、工作负载 (job) 的情况。
二. 部署工作负载:轻量级调度,高效运行
🏗️ Nomad 通过 Job 文件来描述工作负载,并使用 Job 相关子命令来完成所有关于工作负载的操作。
🚀 下面我们将使用一个简单的 HTTP 后端服务示例,演示如何使用 Nomad 部署工作负载。
1. Job 文件定义
💻 创建 httpbackend-1.nomad
Job 文件:
// httpbackend-1.nomad
job "httpbackend" {
datacenters = ["dc1"]
type = "service"
group "httpbackend" {
count = 2
task "httpbackend" {
driver = "docker"
config {
image = "bigwhite/httpbackendservice:v1.0.0"
port_map {
http = 8081
}
logging {
type = "json-file"
}
}
resources {
network {
mbits = 10
port "http" {}
}
}
service {
name = "httpbackend"
port = "http"
}
}
}
}
💡 Job 文件定义了 Job、Group 和 Task 的层次关系。
- Job: 描述一个工作负载,例如一个 HTTP 后端服务。
- Group: 包含一组要放在同一个集群中调度的 Task。
- Task: 由其驱动程序 (driver) 在 Nomad client 节点上执行的命令、服务、应用程序或其他工作负载。
2. Job 计划与执行
🚀 使用 nomad job plan
命令进行 dry-run,检查 Job 文件格式是否正确,以及 Nomad 集群是否有足够的资源来创建和调度新的工作负载:
# nomad job plan httpbackend-1.nomad
🚀 使用 nomad job run
命令正式创建和调度 Job:
# nomad job run httpbackend-1.nomad
3. Job 状态查看
👀 使用 nomad job status
命令查看 Job 的创建情况以及某个 Job 的详细状态信息:
# nomad job status
三. 总结:轻量级、灵活、高效
🎉 Nomad 提供了一个轻量级、灵活、高效的集群管理和微服务部署调度方案,它可以帮助我们快速搭建和管理集群,并轻松部署和调度各种工作负载。
💡 与 Kubernetes 相比,Nomad 的学习曲线更低,部署和维护成本更低,同时它也拥有足够的灵活性,能够满足各种场景下的需求。
🚀 在云原生时代,Nomad 作为一种轻量级利器,将为我们提供更便捷、更高效的集群管理和微服务部署调度体验。
参考文献
😊 希望本文能够帮助你更好地理解和使用 Nomad!