Postavljanje klastera Nomad koristeći Consul i integracija sa Gitlabom

Uvod

U posljednje vrijeme popularnost Kubernetesa brzo raste - sve više projekata ga implementira. Želio sam da se dotaknem orkestratora kao što je Nomad: savršen je za projekte koji već koriste druga rješenja HashiCorp-a, na primjer, Vault i Consul, a sami projekti nisu složeni u smislu infrastrukture. Ovaj materijal će sadržati uputstva za instalaciju Nomada, kombinovanje dva čvora u klaster, kao i integraciju Nomada sa Gitlabom.

Postavljanje klastera Nomad koristeći Consul i integracija sa Gitlabom

Test stalak

Malo o test klupi: koriste se tri virtuelna servera sa karakteristikama 2 CPU, 4 RAM-a, 50 Gb SSD, 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 Nomada, konzul. Kreiranje klastera Nomada

Počnimo s osnovnom instalacijom. Iako je podešavanje bilo jednostavno, opisat ću ga radi integriteta članka: u suštini je napravljen od nacrta i bilješki za brzi pristup kada je to potrebno.

Prije nego što počnemo s praksom, razgovarat ćemo o teorijskom 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. Sa ovim alatom, grupisanje i dodavanje novih čvorova postaje vrlo jednostavan zadatak: kreirani Nomad čvor se povezuje sa Consul agentom, a zatim se povezuje sa postojećim Nomad klasterom. Stoga ćemo na početku instalirati Consul server, konfigurirati osnovnu http autorizaciju za web panel (podrazumevano je bez autorizacije i može mu se pristupiti na eksternoj adresi), kao i same Consul agente na Nomad serverima, nakon čega nastavićemo samo do Nomada.

Instaliranje HashiCorp alata je vrlo jednostavno: u suštini, mi samo premjestimo binarnu datoteku u bin direktorij, podesimo konfiguracijsku datoteku alata i kreiramo njen servisni fajl.

Preuzmite Consul binarnu datoteku i raspakirajte je u korisnikov kuć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 gotov konzulski binar za daljnju konfiguraciju.

Da bismo radili sa Consulom, moramo kreirati jedinstveni ključ pomoću naredbe keygen:

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

Idemo dalje na postavljanje konfiguracije Consul, kreirajući direktorij /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 glavne direktive i njihova značenja odvojeno:

  • Bootstrap: istinito. Omogućavamo automatsko dodavanje novih čvorova ako su povezani. Napominjem da ovdje ne navodimo tačan broj očekivanih čvorova.
  • server: istinito. Omogući način rada servera. Konzul na ovoj virtuelnoj mašini će delovati kao jedini server i master u ovom trenutku, Nomadov VM će biti klijenti.
  • data centar: dc1. Odredite ime data centra za kreiranje klastera. Mora biti identičan i na klijentima i na serverima.
  • šifriranje: vaš ključ. Ključ, koji također mora biti jedinstven i podudaran na svim klijentima i serverima. Generirano pomoću naredbe consul keygen.
  • start_join. U ovoj listi navodimo listu IP adresa na koje će se uspostaviti veza. Trenutno ostavljamo samo svoju adresu.

U ovom trenutku možemo pokrenuti consul koristeći komandnu liniju:

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

Ovo je sada dobar način za otklanjanje grešaka, međutim, iz očiglednih razloga nećete moći koristiti ovu metodu stalno. Kreirajmo servisni fajl za upravljanje Consul-om preko 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š servis mora biti pokrenut, a izvršavanjem naredbe consul members trebali bismo vidjeti naš server:

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: instalacija 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 kreirati .htpasswd datoteku i generirati korisničko ime i lozinku za nju. Ova stavka je neophodna kako web panel ne bi bio dostupan svima koji poznaju našu domenu. Međutim, prilikom postavljanja Gitlaba, morat ćemo to napustiti - inače nećemo moći implementirati našu aplikaciju na Nomad. U mom projektu, i Gitlab i Nomad su samo na sivoj mreži, tako da ovdje nema takvog problema.

Na preostala dva servera instaliramo Consul agente prema sljedećim uputama. Ponavljamo korake sa 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 sa prethodnim serverom, kreiramo direktorijum za konfiguracione fajlove /etc/consul.d sa sledeć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
     }

Sačuvajte promene i pređite na podešavanje servisne datoteke, njenog sadržaja:

/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 Consul na serveru. Sada, nakon pokretanja, trebali bismo vidjeti konfiguriranu uslugu u nsul članovima. To će značiti da se uspješno povezao na klaster kao klijent. Ponovite isto na drugom serveru 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. Ja ću izabrati prvi metod.

primjedba: Projekat se razvija vrlo brzo, često se objavljuju nova ažuriranja. Možda će nova verzija biti objavljena do završetka ovog članka. 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 raspakivanja, dobićemo Nomad binarnu datoteku od 65 MB - mora se premjestiti u /usr/local/bin.

Kreirajmo direktorij podataka za Nomad i uredimo njegov servisni fajl (najvjerovatnije 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 redove:

[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 žuri nam se pokrenuti nomad - još nismo kreirali 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 direktorija će biti sljedeća:

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

Datoteka nomad.hcl bi trebala 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 serveru - tamo ćete morati promijeniti vrijednost http direktive.

Posljednja stvar u ovoj fazi je konfiguracija Nginxa 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 možemo pristupiti web panelu preko vanjske mreže. Povežite se i idite na stranicu servera:

Postavljanje klastera Nomad koristeći Consul i integracija sa Gitlabom
Slika 1. Lista servera u klasteru Nomad

Oba servera su uspješno prikazana na panelu, isto ćemo vidjeti u izlazu naredbe status nomad node:

Postavljanje klastera Nomad koristeći Consul i integracija sa Gitlabom
Slika 2. Izlaz naredbe statusa nomadskog čvora

Šta je sa Konzulom? Hajde da pogledamo. Idite na kontrolnu tablu Consul, na stranicu čvorova:
Postavljanje klastera Nomad koristeći Consul i integracija sa Gitlabom
Slika 3. Lista čvorova u Consul klasteru

Sada imamo pripremljenog Nomada koji radi u saradnji sa Konzulom. U završnoj fazi dolazimo do zabavnog dijela: postavljanja isporuke Docker kontejnera od Gitlaba do Nomada, a također ćemo govoriti o nekim drugim njegovim karakteristikama.

Kreiranje Gitlab Runnera

Da bismo postavili docker slike u Nomad, koristit ćemo poseban pokretač s Nomad binarnom datotekom unutra (ovdje, inače, možemo primijetiti još jednu značajku Hashicorp aplikacija - pojedinačno su jedna binarna datoteka). Učitajte ga u direktorij pokretača. Kreirajmo jednostavan Dockerfile za njega 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 kreiramo .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 runnera u Gitlab Registry, sada možemo ići direktno u spremište projekta, kreirati Pipeline i konfigurirati Nomadov nomad posao.

Postavljanje projekta

Počnimo s fajlom posla za Nomad. Moj projekt u ovom članku bit će prilično primitivan: sastojat će se od jednog zadatka. Sadržaj .gitlab-ci će biti 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 je možete konfigurirati da promijeni sadržaj direktorija projekta. Pipeline se sastoji od dvije faze: sastavljanje slike i njeno postavljanje na nomad. U prvoj fazi sastavljamo docker sliku i guramo je u naš Registry, a u 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 na njega. Najbolje rješenje u ovom slučaju je da unesete login i lozinku u Vault, a zatim ih integrirate 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 kreiranja potrebnih politika, dodaćemo integraciju sa Vaultom u blok zadataka u datoteci job.nomad:

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

Koristim autorizaciju po tokenu i registrujem je direktno ovdje, postoji i opcija specificiranja tokena kao varijable pri pokretanju nomad agenta:

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

Sada možemo koristiti ključeve sa Vaultom. Princip rada je jednostavan: kreiramo datoteku u Nomad poslu 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 kontejnera u Nomad klaster i raditi s njim u budućnosti. Reći ću da u određenoj mjeri simpatiziram Nomad - on je pogodniji za male projekte gdje Kubernetes može uzrokovati dodatnu složenost i neće ostvariti svoj puni potencijal. Osim toga, Nomad je savršen za početnike—lako ga je instalirati i konfigurirati. Međutim, prilikom testiranja na nekim projektima, nailazim na problem s njegovim ranim verzijama - mnoge osnovne funkcije jednostavno ne postoje ili ne rade ispravno. Ipak, vjerujem da će Nomad nastaviti da se razvija i da će u budućnosti dobiti funkcije koje su svima potrebne.

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


izvor: www.habr.com

Dodajte komentar