Nomad 的網路和 Docker 的也有很大不同, 和 K8s 的有很大不同. 另外, Nomad 不同版本(Nomad 1.3 版本前後)或是否整合 Consul 及 CNI 等不同元件也會導致網路模式各不相同. 本文詳細梳理一下 Nomad 的主要幾種網路模式
在Nomad 1.3釋出之前,它自身並不支援發現叢集中執行的其他應用程式。在叢集中排程任務時,這是一個非常基本的要求。Nomad依賴於Consul來發現其他「服務」,併為註冊和獲取服務記錄提供一流的支援,這使得事情變得更容易。Consul通過各種機制提供記錄,例如REST API,DNS和Consul模板,這些模板在可以注入到應用程式中的Go模板中呈現服務的確切IP/埠。
學習 Nomad 的一個難點在於, Nomad 往往和 Consul 一起執行, 那麼對於這種情況來說,一個主要的學習曲線是,我們必須首先了解Consul是如何工作的,部署一個Consul叢集, 同時要融會貫通 2 個軟體就很難了。Nomad 1.3 解決了這個問題的一部分(即不需要執行Consul就可以進行基本的服務發現),非常適合剛剛開始使用基於Nomad的網路。
從最簡單的用例開始:你有一個 redis 容器,你想把它暴露給主機。 相當於我們想要做的docker run
是 :
docker run --rm -p=6379 redis
此命令公開主機上的動態埠。要檢視埠號到底是什麼,您可以執行 docker ps
並在 PORTS 下找到類似於 0.0.0.0:49153->6379/tcp
的輸出。
$ redis-cli -p 49153
127.0.0.1:49153> ping
PONG
那麼, 在 Nomad 中相同的操作如何實現?
job "redis" {
type = "service"
group "redis" {
network {
mode = "host"
port "redis" {
to = 6379
}
}
task "redis" {
driver = "docker"
config {
image = "redis"
ports = ["redis"]
}
}
}
}
在幾行設定中,我們有一個正在執行的Docker容器,它公開了一個動態埠 30627:
我們可以通過主機上的 redis-cli
連線到它:
$ redis-cli -p 30627
127.0.0.1:30627> ping
PONG