Postavljanje klastera Nomad pomoću Consula i integracija s Gitlabom

Uvod

U posljednje vrijeme popularnost Kubernetesa brzo raste - sve više i više projekata ga implementira. Htio sam se dotaknuti orkestratora kao što je Nomad: savršen je za projekte koji već koriste druga rješenja iz HashiCorpa, na primjer, Vault i Consul, a sami projekti nisu složeni u smislu infrastrukture. Ovaj materijal će sadržavati upute za instaliranje Nomada, kombiniranje dva čvora u klaster, kao i integraciju Nomada s Gitlabom.

Postavljanje klastera Nomad pomoću Consula i integracija s Gitlabom

Ispitno postolje

Malo o testnom stolu: koriste se tri virtualna poslužitelja s karakteristikama 2 CPU-a, 4 RAM-a, 50 Gb SSD-a, ujedinjeni u zajedničku lokalnu mrežu. Njihova imena i IP adrese:

  1. nomad-livelinux-01: 172.30.0.5
  2. nomad-livelinux-02: 172.30.0.10
  3. konzul-livelinux-01: 172.30.0.15

Instalacija Nomad, Consul. Stvaranje klastera Nomad

Počnimo s osnovnom instalacijom. Iako je postavljanje bilo jednostavno, opisat ću ga radi cjelovitosti članka: u biti je stvoreno iz nacrta i bilješki za brzi pristup kada je potrebno.

Prije nego što započnemo praksu, razgovarat ćemo o teoretskom dijelu, jer je u ovoj fazi važno razumjeti buduću strukturu.

Imamo dva nomad čvora i želimo ih spojiti u klaster, au budućnosti će nam trebati i automatsko skaliranje klastera - za to će nam trebati Consul. S ovim alatom klasteriranje i dodavanje novih čvorova postaje vrlo jednostavan zadatak: stvoreni Nomad čvor povezuje se s Consul agentom, a zatim se povezuje s postojećim Nomad klasterom. Dakle, na početku ćemo instalirati Consul server, konfigurirati osnovnu http autorizaciju za web panel (standardno je bez autorizacije i može mu se pristupiti na vanjskoj adresi), kao i same Consul agente na Nomad serverima, nakon čega nastavit ćemo samo do Nomada.

Instalacija HashiCorpovih alata vrlo je jednostavna: u biti samo premjestimo binarnu datoteku u direktorij bin, postavimo konfiguracijsku datoteku alata i stvorimo njegovu servisnu datoteku.

Preuzmite Consul binarnu datoteku i raspakirajte je u korisnički matični direktorij:

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/

Sada imamo gotovu binarnu datoteku konzula za daljnju konfiguraciju.

Da bismo radili s Consulom, moramo stvoriti jedinstveni ključ pomoću naredbe keygen:

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

Prijeđimo na postavljanje Consul konfiguracije, stvaranje direktorija /etc/consul.d/ sa sljedećom strukturom:

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

Bootstrap direktorij će sadržavati konfiguracijsku datoteku config.json - u njoj ćemo postaviti Consul postavke. Njegov sadržaj:

{
"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"]
}

Pogledajmo zasebno glavne direktive i njihova značenja:

  • bootstrap: istina. Omogućujemo automatsko dodavanje novih čvorova ako su povezani. Napominjem da ovdje ne navodimo točan broj očekivanih čvorova.
  • server: istina. Omogući način rada poslužitelja. Consul će na ovom virtualnom stroju trenutno djelovati kao jedini server i master, dok će Nomadov VM biti klijenti.
  • podatkovni centar: dc1. Navedite naziv podatkovnog centra za stvaranje klastera. Mora biti identičan i na klijentima i na poslužiteljima.
  • šifriranje: vaš-ključ. Ključ, koji također mora biti jedinstven i odgovarati na svim klijentima i poslužiteljima. Generirano pomoću naredbe consul keygen.
  • početak_pridruživanja. U ovom popisu označavamo popis IP adresa na koje će se uspostaviti veza. Trenutno ostavljamo samo vlastitu adresu.

U ovom trenutku možemo pokrenuti consul pomoću naredbenog retka:

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

Ovo je sada dobar način za otklanjanje pogrešaka, međutim, ovu metodu nećete moći upotrebljavati kontinuirano iz očitih razloga. Kreirajmo servisnu datoteku za upravljanje Consulom putem systemd-a:

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

Sadržaj datoteke 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

Pokrenite Consul preko systemctl:

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

Provjerimo: naša usluga mora biti pokrenuta, a izvršavanjem naredbe consul members trebali bismo vidjeti naš poslužitelj:

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

Sljedeća faza: instaliranje Nginxa i postavljanje proxyja i http autorizacije. Instaliramo nginx preko upravitelja paketa i u direktoriju /etc/nginx/sites-enabled kreiramo konfiguracijsku datoteku consul.conf sa sljedećim sadržajem:

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";
    }
}

Ne zaboravite stvoriti .htpasswd datoteku i generirati korisničko ime i lozinku za nju. Ova stavka je potrebna kako web panel ne bi bio dostupan svima koji poznaju našu domenu. Međutim, kada postavljamo Gitlab, morat ćemo to napustiti - inače nećemo moći implementirati svoju aplikaciju u Nomad. U mom projektu, i Gitlab i Nomad su samo na sivom webu, tako da ovdje nema takvog problema.

Na preostala dva poslužitelja instaliramo Consul agente prema sljedećim uputama. Ponavljamo korake s binarnom datotekom:

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/

Po analogiji s prethodnim poslužiteljem, kreiramo direktorij za konfiguracijske datoteke /etc/consul.d sa sljedećom strukturom:

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

Sadržaj datoteke 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
     }

Spremite promjene i prijeđite na postavljanje servisne datoteke, njezin sadržaj:

/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

Pokrećemo konzul na serveru. Sada, nakon pokretanja, trebali bismo vidjeti konfiguriranu uslugu u nsul members. To će značiti da se uspješno povezao s klasterom kao klijent. Ponovite isto na drugom poslužitelju i nakon toga možemo početi instalirati i konfigurirati Nomad.

Detaljnija instalacija Nomada opisana je u njegovoj službenoj dokumentaciji. Postoje dvije tradicionalne metode instalacije: preuzimanje binarne datoteke i kompajliranje iz izvora. Odabrat ću prvu metodu.

Primijetiti: Projekt se razvija vrlo brzo, često se objavljuju nova ažuriranja. Možda će nova verzija biti objavljena do trenutka kada ovaj članak bude dovršen. Stoga, prije čitanja, preporučujem da provjerite trenutnu verziju Nomada i preuzmete je.

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

Nakon raspakiranja dobit ćemo Nomad binarnu datoteku težine 65 MB - potrebno ju je premjestiti u /usr/local/bin.

Kreirajmo direktorij podataka za Nomad i uredimo njegovu servisnu datoteku (najvjerojatnije neće postojati na početku):

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

Tamo zalijepite sljedeće retke:

[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

Međutim, ne žurimo s pokretanjem Nomada - još nismo izradili njegovu konfiguracijsku datoteku:

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

Konačna struktura imenika bit će sljedeća:

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

Datoteka nomad.hcl treba sadržavati sljedeću konfiguraciju:

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

Sadržaj datoteke 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
}

Ne zaboravite promijeniti konfiguracijsku datoteku na drugom poslužitelju - tamo ćete morati promijeniti vrijednost http direktive.

Zadnja stvar u ovoj fazi je konfigurirati Nginx za proxy i postavljanje http autorizacije. Sadržaj datoteke 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";
        }
        
}

Sada web panelu možemo pristupiti putem vanjske mreže. Povežite se i idite na stranicu poslužitelja:

Postavljanje klastera Nomad pomoću Consula i integracija s Gitlabom
Slika 1. Popis poslužitelja u klasteru Nomad

Oba su poslužitelja uspješno prikazana na ploči, vidjet ćemo istu stvar u izlazu naredbe statusa čvora nomada:

Postavljanje klastera Nomad pomoću Consula i integracija s Gitlabom
Slika 2. Izlaz naredbe statusa čvora nomada

Što je s konzulom? Idemo pogledati. Idite na upravljačku ploču Consul, na stranicu čvorova:
Postavljanje klastera Nomad pomoću Consula i integracija s Gitlabom
Slika 3. Popis čvorova u klasteru Consul

Sada imamo pripremljenog Nomada koji radi u suradnji s konzulom. U završnoj fazi doći ćemo do zabavnog dijela: postavljanja isporuke Docker spremnika iz Gitlaba u Nomad, a također ćemo govoriti o nekim drugim njegovim razlikovnim značajkama.

Stvaranje Gitlab Runnera

Da bismo implementirali docker slike u Nomad, koristit ćemo zaseban runner s Nomad binarnom datotekom unutra (ovdje, usput, možemo primijetiti još jednu značajku Hashicorp aplikacija - pojedinačno su jedna binarna datoteka). Učitajte ga u imenik trkača. Kreirajmo za njega jednostavnu Dockerfile sa sljedećim sadržajem:


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

U istom projektu stvaramo .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}

Kao rezultat toga, imat ćemo dostupnu sliku Nomad runner-a u Gitlab registru, sada možemo otići izravno u repozitorij projekta, stvoriti Pipeline i konfigurirati Nomadov nomad posao.

Postavljanje projekta

Počnimo s datotekom posla za Nomad. Moj projekt u ovom članku bit će prilično primitivan: sastojat će se od jednog zadatka. Sadržaj .gitlab-ci bit će sljedeći:

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

Ovdje se implementacija odvija ručno, ali možete je konfigurirati za promjenu sadržaja direktorija projekta. Cjevovod se sastoji od dvije faze: sklapanje slike i njezina implementacija u nomad. U prvoj fazi sastavljamo docker sliku i guramo je u naš registar, au drugoj pokrećemo naš posao u Nomadu.

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" {}
                }
            }
        }
    }
}

Imajte na umu da imam privatni registar i da bih uspješno izvukao docker sliku, moram se prijaviti u njega. Najbolje rješenje u ovom slučaju je unijeti prijavu i lozinku u Vault i zatim integrirati s Nomadom. Nomad izvorno podržava Vault. Ali prvo, instalirajmo potrebna pravila za Nomad u samom Vaultu; mogu se preuzeti:

# 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

Sada, nakon što smo izradili potrebna pravila, dodat ćemo integraciju s Vaultom u blok zadataka u datoteci job.nomad:

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

Koristim autorizaciju pomoću tokena i registriram ga izravno ovdje, postoji i opcija navođenja tokena kao varijable prilikom pokretanja nomad agenta:

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

Sada možemo koristiti ključeve s Vaultom. Princip rada je jednostavan: kreiramo datoteku u Nomad jobu koja će pohraniti vrijednosti varijabli, na primjer:

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
}

Ovim jednostavnim pristupom možete konfigurirati isporuku spremnika klasteru Nomad i raditi s njim u budućnosti. Reći ću da donekle suosjećam s Nomadom - prikladniji je za male projekte gdje Kubernetes može izazvati dodatnu složenost i neće ostvariti svoj puni potencijal. Osim toga, Nomad je savršen za početnike—jednostavno ga je instalirati i konfigurirati. Međutim, prilikom testiranja na nekim projektima, naišao sam na problem s ranim verzijama - mnoge osnovne funkcije jednostavno nisu tu ili ne rade ispravno. No, vjerujem da će se Nomad nastaviti razvijati iu budućnosti dobiti funkcije koje su svima potrebne.

Autor: Ilya Andreev, uredio Alexey Zhadan i Live Linux tim


Izvor: www.habr.com

Dodajte komentar