るいすのブログ

オタクエンジニアの雑記

オンプレでやる Nomad + Consul + Traefik が本当に顧客が求めていたコンテナオーケストレーションでした


前回こんな記事を書いた後に、コンテナオーケストレーションを導入した。
blog.luispc.com

今までの構成はイケてなかった

f:id:rarirureluis:20191206210435p:plain
Proxmox cluster 上に VM のように LXC コンテナを建ていた
小さいサービスだからスケール云々はどうでもいいけど、VM のように使ってるコンテナに何かモヤモヤしたものがあった。ステートレスなものなんだからコンテナオーケストレーションを使いたい欲が芽生えた。

オンプレに k8s の環境はしんどかった

さっきあげた問題を解決するため&k8s も使ってみたいと思って k8s の環境をオンプレに用意してみたりした(OKD + Metallb)けど
k8s のエコシステムはでかすぎて一人じゃ絶対に運用できないと思った。

マネージド k8s

じゃあ、めっちゃ安く k8s 使うなら GKE とかどうだろうと思って使ってみたらめちゃくちゃ簡単だった。
でも、お金払ってまで k8s 使いたいかと言われたら微妙だった。

k8s に拘るのをやめた

久々にこれを読んだ。
yakst.com

Nomad + Consul を試してみることにした。

Nomad + Consul の構築は簡単だった

3, 4 時間でとりあえず APINomad 上に展開することができた。

Nomad + Consul

www.slideshare.net

Nomad に関する便利なツールリスト
github.com

構築する

どっちからでも良いけど、Consul から
どっちも client と client は同居できるよ。

有り難いことに systemd スクリプトまで載っている。
CentOS 8 でも動きます。

ジョブを作る

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 client に対して Traefik を展開して、どの nomad client の :8080/eu-stg-api にアクセスしてもどこかしらのコンテナにアクセスできる。
この Traefik を Nginx とかでまとめる。

結果

f:id:rarirureluis:20191206213229p:plain
幸せになれました