标签: 架构

  • 云原生时代下的轻量级利器:Nomad 集群管理与微服务部署调度

    👋 在云原生、容器化、微服务、服务网格等概念风靡的当下,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 作为一种轻量级利器,将为我们提供更便捷、更高效的集群管理和微服务部署调度体验。

    参考文献

    1. 使用nomad实现集群管理和微服务部署调度 | Tony Bai

    😊 希望本文能够帮助你更好地理解和使用 Nomad!

人生梦想 - 关注前沿的计算机技术 acejoy.com