Poyu Chen
8 min readJun 6, 2021

使用 consul 及 nomad 建立起 dc 的基礎建設

雖然這年頭都直接給人代管了誰還要自己建基礎建設。不過這套弄起來沒有很複雜,用起來也挺順好的。另外據強者我同事表示自動化完後,其實你都會忘記。姑且紀錄一下搞不好以後還有機會用到。

Consul

consul 和 nomad 都是 HashiCorp 所推出的產品(除此之外 terraformpacker 也是廣為人知的工具)。其中 consul 是網路管理的工具,提供了 service discovery、health check、key-value store … 等功能。

安裝及設定

官方教學就很完整了,consul 的玩法簡單來講是這樣:

  1. 準備好一組(奇數台的) consul servers。
  2. 你的每一台機器全部裝上 consul 設定好連上 1 的 server 們

然後就可以開始利用 consul 帶來的各種功能了。

對使用者們來說,要先懂的就是如何寫出想要的設定檔。

Consul Server

datacenter = "dc1"
data_dir = "/opt/consul"
server = true
bootstrap_expect = 3
retry_join = ["consul-1", "consul-2", "consul-3"]
  • datacenter 為你為這個 DC 取的名稱
  • data_dir 為 consul 存放資料的位置
  • server 跟 consul 說你現在是以 server 的身份執行
  • bootstrap_expect 總共應該會有幾個 server
  • retry_join 所有 consul server 的 ip/domain 位置。

更多細節的設定可以直接參考:https://www.consul.io/docs/agent/options

Consul Client

而 client 的部分,如前所述,重點就是讓他們連到 server 們。

datacenter = "dc1"
data_dir = "/opt/consul"
retry_join = ["consul-1", "consul-2", "consul-3"]

弄起來後,在任何一台機器上面下個 consul members 的指令,就可以看到目前你所有的機器狀態,大概會像這樣:

$ consul members
Node Address Status Type Build Protocol DC Segment
consul-1 10.0.1.7:8301 alive server 1.8.7 2 dc1 <all>
consul-2 10.0.1.6:8301 alive server 1.8.7 2 dc1 <all>
consul-3 10.0.1.5:8301 alive server 1.8.7 2 dc1 <all>
jump-1 10.0.1.4:8301 alive client 1.8.7 2 dc1 <default>

弄起來很簡單。不過其實真的上線還要注意一下安全性相關的問題,像是資料加密和 ACL 相關的事情,官方教學都有提到。

Nomad

Nomad 則是提供了 application orchestration 的能力(<del>其實絕大步的人包括我只 care container orchestration</del>)。玩法其實也差不多,安裝一個 agent,寫 config 設定一組 server 。然後再根據你的需求看需要安裝幾台 client (worker) 來加入這組 server。

Nomad Server

官方教學也很完整,以下稍微示範一個最簡單的設定:

data_dir  = "/opt/nomad/data"server {
enabled = true
bootstrap_expect = 3
server_join {
retry_join = ["nomad-server-1:4648", "nomad-server-2:4648", "nomad-server-3:4648"]
}
}
  • data_dir:放資料的地方
  • server.enabled:我是 server
  • server.bootstrap_expect:有幾台 server
  • server.server_join.retry_join:其他 nomad server 的位置

弄起來後在隨便一台機器下個 nomad server members 就可以看到三台連結起來的 cluster。

$ nomad server members
Name Address Port Status Leader Protocol Build Datacenter Region
nomad-server-1.global 10.0.1.8 4648 alive true 2 1.1.0 dc1 global
nomad-server-2.global 10.0.1.6 4648 alive false 2 1.1.0 dc1 global
nomad-server-3.global 10.0.1.7 4648 alive false 2 1.1.0 dc1 global

Nomad Client

最簡單的 client 設定大概如下:

data_dir  = "/opt/nomad/data"client {
enabled = true
servers = ["nomad-server-1:4647", "nomad-server-2:4647", "nomad-server-3:4647"]
}
  • client.enabled:宣告我是 client
  • client.servers:你的 server 們。(注意用的 port 不一樣)

接著下個 nomad node status 就可以看到有個 node 了:

$ nomad node status
ID DC Name Class Drain Eligibility Status
f326dd31 dc1 nomad-client-1 <none> false eligible ready

另外 server 也可以自己當作 client,把 client.servers 指向自己就好。

Consul + Nomad

而 nomad 裡也提供了整合 consul 的方式,在設定裡有一個 consul 的區段。可以透過那些設定,讓 nomad 自己去倒到自己的 server、client 夥伴們。

玩法大概就是:

  1. 在機器上安裝 consul,並正確指向你的 consul servers。
  2. 在 nomad 的設定 consul 資訊,可以參考以下:
data_dir  = "/opt/nomad/data"server {
enabled = true
bootstrap_expect = 1
}
consul {
address = "127.0.0.1:8500"
server_service_name = "nomad-server" auto_advertise = true
server_auto_join = true
}
  • consul.address:consul 的位置,指向自己本機上的 consul 即可,他會和 其他 consul server/client 交流
  • consul.server_service_name:指定屬於這個 nomad server 群的名字。設定為同樣名字的 nomad server 就會自動成為一個 cluster
  • consul.server_auto_join、consul.auto_advertise:設為 true 才會自動自發地去找 consul 註冊

而在 client 的部分則是是把 server 換成 client 有相對應的設定

  • consul.client_service_name、consul.client_auto_join。設定 client 們的名字和叫他們自動去註冊

設定完成後可以再用 nomad server membersnomad node status 看看有沒有找到小夥伴們。

在 Nomad 裡利用 Consul

而將這兩個東西整合起來的重點其實是讓 nomad 裡面可以去利用 consul 的功能,KV 及 Service Discovery。

nomad 在連接了 consul 後,在 task 裡 tamplate 的區段就可以使用 consul template 來取得 consul 的各種資訊,如利用 key 來取得 KV 值:

template {  data = "{{ key \" some/consul/kv \" }}"  destination = "local/some-file"
}

除了 consul kv 的資料外,或 透過 service 來取得 service 所在的的 IP/Port:

template {  data = EOD<<{{ range service "some-service" }}{{ .Address }}:{{ .Port }} {{ end }}<<EOD  destination = "local/ip-port-list-of-some-service"
}

自動化

懂了這些東西在做什麼後,下一步就是自動化的裝起來, <del>然後忘了他們在做什麼</del>。這裡用 terraform 和 ansible 在 Azure 上裝起一套 consul+nomad 的 cluster,包含一台 consul server、三台 nomad server (因為套件的限制一定要起三台)、一台 nomad client 以及一台跳板機。並且做了一個 nomad job 跑起 nginx 並在裡面利用 consul 的 service discovery 功能。

以上,算是簡單的弄起一個可以讓人 deploy docker image 並且管理的環境。實際上投產要再注意一些 ACL、安全性的問題。

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

Poyu Chen
Poyu Chen

Written by Poyu Chen

隨便寫寫,隨便看看

No responses yet

Write a response