使用 consul 及 nomad 建立起 dc 的基礎建設
雖然這年頭都直接給人代管了誰還要自己建基礎建設。不過這套弄起來沒有很複雜,用起來也挺順好的。另外據強者我同事表示自動化完後,其實你都會忘記。姑且紀錄一下搞不好以後還有機會用到。
Consul
consul 和 nomad 都是 HashiCorp 所推出的產品(除此之外 terraform 和 packer 也是廣為人知的工具)。其中 consul 是網路管理的工具,提供了 service discovery、health check、key-value store … 等功能。
安裝及設定
官方教學就很完整了,consul 的玩法簡單來講是這樣:
- 準備好一組(奇數台的) consul servers。
- 你的每一台機器全部裝上 consul 設定好連上 1 的 server 們
然後就可以開始利用 consul 帶來的各種功能了。
對使用者們來說,要先懂的就是如何寫出想要的設定檔。
Consul Server
datacenter = "dc1"
data_dir = "/opt/consul"server = true
bootstrap_expect = 3retry_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 夥伴們。
玩法大概就是:
- 在機器上安裝 consul,並正確指向你的 consul servers。
- 在 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 members
、 nomad 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、安全性的問題。