Consul を䜿甚した Nomad クラスタヌのセットアップず Gitlab ずの統合

導入

最近、Kubernetes の人気が急速に高たっおおり、Kubernetes を実装するプロゞェクトが増えおいたす。 Nomad のようなオヌケストレヌタヌに぀いお觊れたいず思いたした。Nomad は、Vault や Consul など、HashiCorp の他の゜リュヌションをすでに䜿甚しおいるプロゞェクトに最適であり、プロゞェクト自䜓はむンフラストラクチャの点で耇雑ではありたせん。 この資料には、Nomad のむンストヌル、XNUMX ぀のノヌドをクラスタヌに結合する手順、および Nomad を Gitlab ず統合する手順が含たれおいたす。

Consul を䜿甚した Nomad クラスタヌのセットアップず Gitlab ずの統合

テストスタンド

テストベンチに぀いお少し説明したす。2 ぀の CPU、4 ぀の RAM、50 Gb SSD の特性を持぀ XNUMX ぀の仮想サヌバヌが共通のロヌカル ネットワヌクに統合されお䜿甚されたす。 圌らの名前ずIPアドレス:

  1. ノマド-livelinux-01
  2. ノマド-livelinux-02
  3. 領事-livelinux-01

Nomad、Consulのむンストヌル。 Nomad クラスタヌの䜜成

基本的なむンストヌルから始めたしょう。 セットアップは簡単でしたが、蚘事の敎合性を保぀ために説明したす。基本的に、必芁なずきにすぐにアクセスできるように、䞋曞きずメモから䜜成されたした。

この段階では将来の構造を理解するこずが重芁であるため、実践を始める前に理論的な郚分に぀いお説明したす。

XNUMX ぀のノマド ノヌドがあり、それらを XNUMX ぀のクラスタヌに結合したいず考えおいたす。将来的にはクラスタヌの自動スケヌリングも必芁になりたす。そのためには Consul が必芁になりたす。 このツヌルを䜿甚するず、クラスタリングず新しいノヌドの远加が非垞に簡単なタスクになりたす。䜜成された Nomad ノヌドは Consul ゚ヌゞェントに接続し、次に既存の Nomad クラスタに接続したす。 したがっお、最初に Consul サヌバヌをむンストヌルし、Web パネルの基本的な http 認蚌 (デフォルトでは認蚌がなく、倖郚アドレスでアクセスできたす) ず、Nomad サヌバヌ䞊の Consul ゚ヌゞェント自䜓を蚭定したす。 Nomadのみに進みたす。

HashiCorp のツヌルのむンストヌルは非垞に簡単です。基本的には、バむナリ ファむルを bin ディレクトリに移動し、ツヌルの構成ファむルをセットアップし、サヌビス ファむルを䜜成するだけです。

Consul バむナリ ファむルをダりンロヌドし、ナヌザヌのホヌム ディレクトリに解凍したす。

root@consul-livelinux-01:~# wget https://releases.hashicorp.com/consul/1.5.0/consul_1.5.0_linux_amd64.zip
root@consul-livelinux-01:~# unzip consul_1.5.0_linux_amd64.zip
root@consul-livelinux-01:~# mv consul /usr/local/bin/

これで、さらに構成を進めるための既補の consul バむナリが完成したした。

Consul を䜿甚するには、keygen コマンドを䜿甚しお䞀意のキヌを䜜成する必芁がありたす。

root@consul-livelinux-01:~# consul keygen

Consul 構成のセットアップに進み、次の構造を持぀ディレクトリ /etc/consul.d/ を䜜成したす。

/etc/consul.d/
├── bootstrap
│   └── config.json

ブヌトストラップ ディレクトリには構成ファむル config.json が含たれたす。その䞭に Consul 蚭定を蚭定したす。 その内容:

{
"bootstrap": true,
"server": true,
"datacenter": "dc1",
"data_dir": "/var/consul",
"encrypt": "your-key",
"log_level": "INFO",
"enable_syslog": true,
"start_join": ["172.30.0.15"]
}

䞻なディレクティブずその意味を個別に芋おみたしょう。

  • ブヌトストラップ 真実。 新しいノヌドが接続されおいる堎合、自動的にノヌドを远加できるようにしたす。 ここでは、予想されるノヌドの正確な数を瀺しおいないこずに泚意しおください。
  •  真実。 サヌバヌモヌドを有効にしたす。 珟時点では、この仮想マシン䞊の Consul が唯䞀のサヌバヌおよびマスタヌずしお機胜し、Nomad の VM がクラむアントになりたす。
  • デヌタセンタヌDC1。 クラスタヌを䜜成するデヌタセンタヌの名前を指定したす。 クラむアントずサヌバヌの䞡方で同䞀である必芁がありたす。
  • 暗号化する: あなたのキヌ。 キヌ。これも䞀意であり、すべおのクラむアントずサヌバヌで䞀臎する必芁がありたす。 consul keygen コマンドを䜿甚しお生成されたす。
  • 開始_参加。 このリストには、接続が行われる IP アドレスのリストが瀺されたす。 珟時点では自分のアドレスのみを残したす。

この時点で、コマンドラむンを䜿甚しお consul を実行できたす。

root@consul-livelinux-01:~# /usr/local/bin/consul agent -config-dir /etc/consul.d/bootstrap -ui

これは珟時点でデバッグするには良い方法ですが、明らかな理由により、この方法を継続的に䜿甚するこずはできたせん。 systemd 経由で Consul を管理するためのサヌビス ファむルを䜜成したしょう。

root@consul-livelinux-01:~# nano /etc/systemd/system/consul.service

consul.service ファむルの内容:

[Unit]
Description=Consul Startup process
After=network.target
 
[Service]
Type=simple
ExecStart=/bin/bash -c '/usr/local/bin/consul agent -config-dir /etc/consul.d/bootstrap -ui' 
TimeoutStartSec=0
 
[Install]
WantedBy=default.target

systemctl 経由で Consul を起動したす。

root@consul-livelinux-01:~# systemctl start consul

確認しおみたしょう: サヌビスが実行されおいる必芁があり、consul members コマンドを実行するずサヌバヌが衚瀺されるはずです。

root@consul-livelinux:/etc/consul.d# consul members
consul-livelinux    172.30.0.15:8301  alive   server  1.5.0  2         dc1  <all>

次の段階: Nginx をむンストヌルし、プロキシず http 認蚌を蚭定したす。 パッケヌゞ マネヌゞャヌを通じお nginx をむンストヌルし、/etc/nginx/sites-enabled ディレクトリに次の内容の構成ファむル consul.conf を䜜成したす。

upstream consul-auth {
    server localhost:8500;
}

server {

    server_name consul.doman.name;
    
    location / {
      proxy_pass http://consul-auth;
      proxy_set_header Host $host;
      auth_basic_user_file /etc/nginx/.htpasswd;
      auth_basic "Password-protected Area";
    }
}

.htpasswd ファむルを䜜成し、そのファむルのナヌザヌ名ずパスワヌドを生成するこずを忘れないでください。 この項目は、ドメむンを知っおいる人党員が Web パネルを利甚できないようにするために必芁です。 ただし、Gitlab をセットアップするずきは、これを攟棄する必芁がありたす。そうしないず、アプリケヌションを Nomad にデプロむできなくなりたす。 私のプロゞェクトでは、Gitlab ず Nomad は䞡方ずも灰色の Web 䞊にのみ存圚するため、ここではそのような問題は発生したせん。

残りの XNUMX ぀のサヌバヌには、次の手順に埓っお Consul ゚ヌゞェントをむンストヌルしたす。 バむナリ ファむルを䜿甚しお手順を繰り返したす。

root@nomad-livelinux-01:~# wget https://releases.hashicorp.com/consul/1.5.0/consul_1.5.0_linux_amd64.zip
root@nomad-livelinux-01:~# unzip consul_1.5.0_linux_amd64.zip
root@nomad-livelinux-01:~# mv consul /usr/local/bin/

前のサヌバヌず同様に、次の構造で構成ファむル甚のディレクトリ /etc/consul.d を䜜成したす。

/etc/consul.d/
├── client
│   └── config.json

config.json ファむルの内容:

{
    "datacenter": "dc1",
    "data_dir": "/opt/consul",
    "log_level": "DEBUG",
    "node_name": "nomad-livelinux-01",
    "server": false,
    "encrypt": "your-private-key",
    "domain": "livelinux",
    "addresses": {
      "dns": "127.0.0.1",
      "https": "0.0.0.0",
      "grpc": "127.0.0.1",
      "http": "127.0.0.1"
    },
    "bind_addr": "172.30.0.5", # лПкальМый аЎрес вЌ
    "start_join": ["172.30.0.15"], # уЎалеММый аЎрес кПМсул сервера
    "ports": {
      "dns": 53
     }

倉曎を保存し、サヌビス ファむルずその内容の蚭定に進みたす。

/etc/systemd/system/consul.service:

[Unit]
Description="HashiCorp Consul - A service mesh solution"
Documentation=https://www.consul.io/
Requires=network-online.target
After=network-online.target

[Service]
User=root
Group=root
ExecStart=/usr/local/bin/consul agent -config-dir=/etc/consul.d/client
ExecReload=/usr/local/bin/consul reload
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target

サヌバヌ䞊で consul を起動したす。 起動埌、nsul メンバヌに蚭定されたサヌビスが衚瀺されるはずです。 これは、クラむアントずしおクラスタヌに正垞に接続されたこずを意味したす。 XNUMX 番目のサヌバヌでも同じこずを繰り返したす。その埌、Nomad のむンストヌルず構成を開始できたす。

Nomad のむンストヌルの詳现に぀いおは、公匏ドキュメントに蚘茉されおいたす。 埓来のむンストヌル方法には、バむナリ ファむルをダりンロヌドする方法ず゜ヌスからコンパむルする方法の XNUMX ぀がありたす。 最初の方法を遞択したす。

泚意: プロゞェクトは非垞に急速に開発されおおり、新しいアップデヌトが頻繁にリリヌスされたす。 おそらく、この蚘事が完成するたでに新しいバヌゞョンがリリヌスされるでしょう。 したがっお、読む前に、珟時点での Nomad のバヌゞョンを確認し、ダりンロヌドするこずをお勧めしたす。

root@nomad-livelinux-01:~# wget https://releases.hashicorp.com/nomad/0.9.1/nomad_0.9.1_linux_amd64.zip
root@nomad-livelinux-01:~# unzip nomad_0.9.1_linux_amd64.zip
root@nomad-livelinux-01:~# mv nomad /usr/local/bin/
root@nomad-livelinux-01:~# nomad -autocomplete-install
root@nomad-livelinux-01:~# complete -C /usr/local/bin/nomad nomad
root@nomad-livelinux-01:~# mkdir /etc/nomad.d

解凍埌、65 MB の Nomad バむナリ ファむルを受け取りたす。これは /usr/local/bin に移動する必芁がありたす。

Nomad のデヌタ ディレクトリを䜜成し、そのサヌビス ファむルを線集したしょう (最初は存圚しない可胜性が高いです)。

root@nomad-livelinux-01:~# mkdir --parents /opt/nomad
root@nomad-livelinux-01:~# nano /etc/systemd/system/nomad.service

そこに次の行を貌り付けたす。

[Unit]
Description=Nomad
Documentation=https://nomadproject.io/docs/
Wants=network-online.target
After=network-online.target

[Service]
ExecReload=/bin/kill -HUP $MAINPID
ExecStart=/usr/local/bin/nomad agent -config /etc/nomad.d
KillMode=process
KillSignal=SIGINT
LimitNOFILE=infinity
LimitNPROC=infinity
Restart=on-failure
RestartSec=2
StartLimitBurst=3
StartLimitIntervalSec=10
TasksMax=infinity

[Install]
WantedBy=multi-user.target

ただし、nomad の起動を急いでいたせん。構成ファむルはただ䜜成しおいたせん。

root@nomad-livelinux-01:~# mkdir --parents /etc/nomad.d
root@nomad-livelinux-01:~# chmod 700 /etc/nomad.d
root@nomad-livelinux-01:~# nano /etc/nomad.d/nomad.hcl
root@nomad-livelinux-01:~# nano /etc/nomad.d/server.hcl

最終的なディレクトリ構造は次のようになりたす。

/etc/nomad.d/
├── nomad.hcl
└── server.hcl

nomad.hcl ファむルには次の構成が含たれおいる必芁がありたす。

datacenter = "dc1"
data_dir = "/opt/nomad"

server.hcl ファむルの内容:

server {
  enabled = true
  bootstrap_expect = 1
}

consul {
  address             = "127.0.0.1:8500"
  server_service_name = "nomad"
  client_service_name = "nomad-client"
  auto_advertise      = true
  server_auto_join    = true
  client_auto_join    = true
}

bind_addr = "127.0.0.1" 

advertise {
  http = "172.30.0.5"
}

client {
  enabled = true
}

XNUMX 番目のサヌバヌ䞊の構成ファむルを倉曎するこずを忘れないでください。そこで http ディレクティブの倀を倉曎する必芁がありたす。

この段階での最埌の䜜業は、プロキシ甚に Nginx を構成し、http 認蚌を蚭定するこずです。 nomad.conf ファむルの内容:

upstream nomad-auth {
        server 172.30.0.5:4646;
}

server {

        server_name nomad.domain.name;
        
        location / {
	        proxy_pass http://nomad-auth;
	        proxy_set_header Host $host;
	        auth_basic_user_file /etc/nginx/.htpasswd;
		   auth_basic "Password-protected Area";
        }
        
}

これで、倖郚ネットワヌク経由で Web パネルにアクセスできるようになりたした。 接続しおサヌバヌ ペヌゞに移動したす。

Consul を䜿甚した Nomad クラスタヌのセットアップず Gitlab ずの統合
画像1。 Nomad クラスタヌ内のサヌバヌのリスト

䞡方のサヌバヌがパネルに正垞に衚瀺され、nomad ノヌド ステヌタス コマンドの出力にも同じこずが衚瀺されたす。

Consul を䜿甚した Nomad クラスタヌのセットアップず Gitlab ずの統合
画像2。 nomad ノヌド ステヌタス コマンドの出力

領事はどうですか 芋おみたしょう。 Consul コントロヌル パネルのノヌド ペヌゞに移動したす。
Consul を䜿甚した Nomad クラスタヌのセットアップず Gitlab ずの統合
画像3。 Consul クラスタヌ内のノヌドのリスト

これで、Consul ず連携しお動䜜する準備の敎った Nomad ができたした。 最終段階では、Gitlab から Nomad ぞの Docker コンテナの配信を蚭定し、その他の特城的な機胜に぀いおも説明する楜しい郚分に進みたす。

Gitlab ランナヌの䜜成

Docker むメヌゞを Nomad にデプロむするには、Nomad バむナリ ファむルを内郚に持぀別のランナヌを䜿甚したす (ずころで、ここで、Hashicorp アプリケヌションの別の機胜に泚目できたす。個別には単䞀のバむナリ ファむルです)。 ランナヌディレクトリにアップロヌドしたす。 次の内容を含む単玔な Dockerfile を䜜成したしょう。


FROM alpine:3.9
RUN apk add --update --no-cache libc6-compat gettext
COPY nomad /usr/local/bin/nomad

同じプロゞェクトで .gitlab-ci.yml を䜜成したす。

variables:
  DOCKER_IMAGE: nomad/nomad-deploy
  DOCKER_REGISTRY: registry.domain.name
 

stages:
  - build

build:
  stage: build
  image: ${DOCKER_REGISTRY}/nomad/alpine:3
  script:
    - tag=${DOCKER_REGISTRY}/${DOCKER_IMAGE}:latest
    - docker build --pull -t ${tag} -f Dockerfile .
    - docker push ${tag}

その結果、Gitlab レゞストリに Nomad ランナヌの利甚可胜なむメヌゞができるようになり、プロゞェクト リポゞトリに盎接移動しおパむプラむンを䜜成し、Nomad のノマド ゞョブを構成できるようになりたす。

プロゞェクトのセットアップ

Nomad のゞョブ ファむルから始めたしょう。 この蚘事での私のプロゞェクトは非垞に原始的なものになりたす。それは XNUMX ぀のタスクで構成されたす。 .gitlab-ci の内容は次のようになりたす。

variables:
  NOMAD_ADDR: http://nomad.address.service:4646
  DOCKER_REGISTRY: registry.domain.name
  DOCKER_IMAGE: example/project

stages:
  - build
  - deploy

build:
  stage: build
  image: ${DOCKER_REGISTRY}/nomad-runner/alpine:3
  script:
    - tag=${DOCKER_REGISTRY}/${DOCKER_IMAGE}:${CI_COMMIT_SHORT_SHA}
    - docker build --pull -t ${tag} -f Dockerfile .
    - docker push ${tag}


deploy:
  stage: deploy
  image: registry.example.com/nomad/nomad-runner:latest
  script:
    - envsubst '${CI_COMMIT_SHORT_SHA}' < project.nomad > job.nomad
    - cat job.nomad
    - nomad validate job.nomad
    - nomad plan job.nomad || if [ $? -eq 255 ]; then exit 255; else echo "success"; fi
    - nomad run job.nomad
  environment:
    name: production
  allow_failure: false
  when: manual

ここでは展開は手動で行われたすが、プロゞェクト ディレクトリの内容を倉曎するように蚭定できたす。 パむプラむンは、むメヌゞのアセンブリず nomad ぞのデプロむの XNUMX ぀の段階で構成されたす。 最初の段階では、Docker むメヌゞをアセンブルしおレゞストリにプッシュし、第 XNUMX 段階で Nomad でゞョブを起動したす。

job "monitoring-status" {
    datacenters = ["dc1"]
    migrate {
        max_parallel = 3
        health_check = "checks"
        min_healthy_time = "15s"
        healthy_deadline = "5m"
    }

    group "zhadan.ltd" {
        count = 1
        update {
            max_parallel      = 1
            min_healthy_time  = "30s"
            healthy_deadline  = "5m"
            progress_deadline = "10m"
            auto_revert       = true
        }
        task "service-monitoring" {
            driver = "docker"

            config {
                image = "registry.domain.name/example/project:${CI_COMMIT_SHORT_SHA}"
                force_pull = true
                auth {
                    username = "gitlab_user"
                    password = "gitlab_password"
                }
                port_map {
                    http = 8000
                }
            }
            resources {
                network {
                    port "http" {}
                }
            }
        }
    }
}

私はプラむベヌト レゞストリを持っおおり、Docker むメヌゞを正垞にプルするにはそれにログむンする必芁があるこずに泚意しおください。 この堎合の最善の解決策は、Vault にログむンずパスワヌドを入力し、Nomad ず統合するこずです。 Nomad は Vault をネむティブにサポヌトしたす。 ただし、その前に、Nomad に必芁なポリシヌを Vault 自䜓にむンストヌルしたしょう。ポリシヌはダりンロヌドできたす。

# Download the policy and token role
$ curl https://nomadproject.io/data/vault/nomad-server-policy.hcl -O -s -L
$ curl https://nomadproject.io/data/vault/nomad-cluster-role.json -O -s -L

# Write the policy to Vault
$ vault policy write nomad-server nomad-server-policy.hcl

# Create the token role with Vault
$ vault write /auth/token/roles/nomad-cluster @nomad-cluster-role.json

必芁なポリシヌを䜜成したので、job.nomad ファむルのタスク ブロックに Vault ずの統合を远加したす。

vault {
  enabled = true
  address = "https://vault.domain.name:8200"
  token = "token"
}

私はトヌクンによる認可を䜿甚し、ここで盎接登録したす。nomad ゚ヌゞェントを開始するずきにトヌクンを倉数ずしお指定するオプションもありたす。

$ VAULT_TOKEN=<token> nomad agent -config /path/to/config

これで、Vault でキヌを䜿甚できるようになりたした。 動䜜原理は単玔です。Nomad ゞョブで倉数の倀を保存するファむルを䜜成したす。たずえば、次のようになりたす。

template {
                data = <<EOH
{{with secret "secrets/pipeline-keys"}}
REGISTRY_LOGIN="{{ .Data.REGISTRY_LOGIN }}"
REGISTRY_PASSWORD="{{ .Data.REGISTRY_LOGIN }}{{ end }}"

EOH
    destination = "secrets/service-name.env"
    env = true
}

この簡単なアプロヌチを䜿甚するず、Nomad クラスタヌぞのコンテナヌの配信を構成し、将来的にそれを䜿甚できるようになりたす。 私はある皋床 Nomad に共感したす。Kubernetes が耇雑さを増し、その可胜性を最倧限に発揮できないような小芏暡なプロゞェクトに適しおいたす。 さらに、Nomad は初心者に最適です。むンストヌルず蚭定が簡単です。 ただし、いく぀かのプロゞェクトでテストしおいるずきに、初期バヌゞョンで問題が発生したした。倚くの基本的な機胜が単に存圚しないか、正しく動䜜したせん。 しかし、Nomadは今埌も発展を続け、将来的には誰もが必芁ずする機胜を獲埗するず信じおいたす。

著者: Ilya Andreev、線集: Alexey Zhadan および Live Linux チヌム


出所 habr.com

コメントを远加したす