前回こんな記事を書いた後に、コンテナオーケストレーションを導入した。
rarirure.rip
今までの構成はイケてなかった
小さいサービスだからスケール云々はどうでもいいけど、VM のように使ってるコンテナに何かモヤモヤしたものがあった。ステートレスなものなんだからコンテナオーケストレーションを使いたい欲が芽生えた。
オンプレに k8s の環境はしんどかった
さっきあげた問題を解決するため&k8s も使ってみたいと思って k8s の環境をオンプレに用意してみたりした(OKD + Metallb)けど
k8s のエコシステムはでかすぎて一人じゃ絶対に運用できないと思った。
Nomad + Consul の構築は簡単だった
nomad + consul pic.twitter.com/1CxmmToGrp
— るいす (@lu_iskun_) 2019年12月5日
Nomad + Consul
Nomad に関する便利なツールリスト
github.com
構築する
どっちからでも良いけど、Consul から
どっちも client と client は同居できるよ。
有り難いことに systemd スクリプトまで載っている。
CentOS 8 でも動きます。
Consul
ジョブを作る
job "eu-stg-api" { datacenters = ["luis"] type = "service" update { max_parallel = 1 min_healthy_time = "10s" healthy_deadline = "3m" progress_deadline = "10m" auto_revert = true canary = 0 } group "stg" { count = 1 task "stg" { driver = "docker" config { image = "rluisr/easyuploader-api:latest" port_map { api = 8082 } auth { username = "" password = "" } } env { "GIN_MODE" = "release" "SERVER_ENV" = "staging" "REDIS_SERVER_PORT" = "" "MYSQL_HOST_RW" = "" "MYSQL_HOST_RO" = "" "MYSQL_USER" = "" "MYSQL_PASS" = "" "MYSQL_DB_NAME" = "" "MINIO_BUCKET" = "" "ELASTIC_APM_SERVER_URL" = "" "ELASTIC_APM_SERVICE_NAME" = "" "ELASTIC_APM_ENVIRONMENT" = "" } resources { network { mbits = 10 port "api"{} } } service { name = "eu-stg-api" port = "api" tags = [ "traefik.tags=service", "traefik.frontend.rule=PathPrefixStrip:/eu-stg-api", ] check { type = "http" path = "/" interval = "2s" timeout = "2s" } } } } }
どうやって分散するの?
Nomad の公式ドキュメントにも丁寧に書かれてる。
www.nomadproject.io
そして Traefik を選んだ。なんとなく。
Traefik
初めての nomad + consul + traefik pic.twitter.com/K9H0h2gKiD
— るいす (@lu_iskun_) 2019年12月5日
全 Nomad client に対して Traefik を展開して、どの nomad client の :8080/eu–stg–api にアクセスしてもどこかしらのコンテナにアクセスできる。
この Traefik を Nginx とかでまとめる。
結果