Configurazione di un cluster Nomad cù Consul è integrazione cù Gitlab

Introduzione

Ricertamenti, a pupularità di Kubernetes hè stata rapidamente crescente - più è più prughjetti l'implementanu. Vuliu toccu à un orchestratore cum'è Nomad: hè perfetta per i prughjetti chì digià utilizanu altre suluzioni da HashiCorp, per esempiu, Vault and Consul, è i prughjetti stessi ùn sò micca cumplessi in quantu à l'infrastruttura. Stu materiale cuntene struzzioni per installà Nomad, cumminendu dui nodi in un cluster, è ancu integrendu Nomad cù Gitlab.

Configurazione di un cluster Nomad cù Consul è integrazione cù Gitlab

banc d'essai

Un pocu nantu à u bancu di teste: trè servitori virtuali sò usati cù e caratteristiche di 2 CPU, 4 RAM, 50 Gb SSD, uniti in una reta cumuna locale. I so nomi è indirizzi IP:

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

Installazione di Nomad, Consul. Crià un cluster Nomad

Accuminciamu cù a stallazione di basa. Ancu s'ellu a stallazione era simplice, l'aghju da descriverà per l'integrità di l'articulu: era essenzialmente creatu da bozze è note per un accessu rapidu quandu hè necessariu.

Prima di principià a pratica, avemu da discutiri a parte teorica, perchè in questa fase hè impurtante per capiscenu a struttura futura.

Avemu dui nodi nomadi è vulemu cunghjuntà elli in un cluster, è in u futuru avemu ancu bisognu di scaling cluster automaticu - per questu avemu bisognu di Consul. Cù stu strumentu, clustering è agghiuncennu novi nodes diventa un compitu assai sèmplice: u node Nomad creatu cullega à l 'agente Consul, e poi culligamentu à u cluster Nomad esistenti. Dunque, à u principiu, avemu da stallà u servore Consul, cunfigurà l'autorizazione http basica per u pannellu web (hè senza autorizazione per difettu è ponu accede à un indirizzu esternu), è ancu l'agenti Consul stessu nantu à i servitori Nomad, dopu chì andemu solu à Nomad.

L'installazione di l'arnesi di HashiCorp hè assai simplice: essenzialmente, movemu solu u schedariu binariu à u repertoriu bin, cunfigurà u schedariu di cunfigurazione di l'uttellu, è creà u so schedariu di serviziu.

Scaricate u schedariu binariu Consul è unpack lu in u cartulare di casa di l'utilizatori:

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/

Avà avemu un cunsulatu binariu prontu per più cunfigurazione.

Per travaglià cù Consul, avemu bisognu di creà una chjave unica cù u cumandimu keygen:

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

Passemu à a stallazione di a cunfigurazione Consul, creendu un repertoriu /etc/consul.d/ cù a seguente struttura:

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

U repertoriu di bootstrap cuntene un schedariu di cunfigurazione config.json - in questu avemu stabilitu i paràmetri di u Consul. U so cuntenutu:

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

Fighjemu i direttivi principali è u so significatu separatamente:

  • bootstrap: veru. Permettemu l'aghjunzione automatica di novi nodi si sò cunnessi. Aghju nutatu chì ùn avemu micca indicatu quì u numeru esatta di nodi previsti.
  • servore: veru. Attivà u modu di u servitore. Cunsul nantu à sta macchina virtuale agisce cum'è u solu servitore è maestru in u mumentu, a VM di Nomad serà i clienti.
  • Datacenter: dc1. Specificate u nome di u centru di dati per creà u cluster. Deve esse identica in i clienti è i servitori.
  • cifru: a vostra chjave. A chjave, chì deve ancu esse unica è cuncorda cù tutti i clienti è i servitori. Generatu cù u cumandimu keygen consul.
  • start_join. In questa lista indichemu una lista di l'indirizzi IP à quale a cunnessione serà fatta. À u mumentu lascemu solu u nostru indirizzu.

À questu puntu pudemu eseguisce cunsul usendu a linea di cummanda:

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

Questu hè un bonu modu per debug avà, però, ùn puderà micca aduprà stu metudu in modu continuu per ragioni evidenti. Creemu un schedariu di serviziu per gestisce Consul via systemd:

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

Cuntenutu di u schedariu 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

Lanciate Consul via systemctl:

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

Cuntrollamu: u nostru serviziu deve esse in esecuzione, è eseguendu u cumandamentu di i membri di u cunsul, duvemu vede u nostru servitore:

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

Prossima tappa: stallazione di Nginx è stallazione di proxy è l'autorizazione http. Installemu nginx à traversu u gestore di pacchetti è in u cartulare /etc/nginx/sites-enabled creemu un schedariu di cunfigurazione consul.conf cù i seguenti cuntenutu:

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

Ùn vi scurdate di creà un schedariu .htpasswd è generà un nome d'utilizatore è una password per questu. Questu articulu hè necessariu per chì u pannellu web ùn hè micca dispunibule per tutti quelli chì cunnoscenu u nostru duminiu. Tuttavia, quandu si stallanu Gitlab, avemu da abbandunà questu - altrimenti ùn pudemu micca implementà a nostra applicazione à Nomad. In u mo prughjettu, sia Gitlab sia Nomad sò solu nantu à u web grisgiu, cusì ùn ci hè micca un tali prublema quì.

Nant'à i dui servitori restanti, installemu l'agenti Consul secondu e seguenti struzzioni. Ripitemu i passi cù u schedariu binariu:

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/

Per analogia cù u servitore precedente, creemu un repertoriu per i schedarii di cunfigurazione /etc/consul.d cù a seguente struttura:

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

Cuntenutu di u schedariu 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
     }

Salvà i cambiamenti è andate à cunfigurà u schedariu di serviziu, u so cuntenutu:

/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

Lancemu consul nantu à u servitore. Avà, dopu à u lanciu, duvemu vede u serviziu cunfiguratu in i membri nsul. Questu significarà chì hà cunnessu bè cù u cluster cum'è cliente. Repetite u listessu in u sicondu servitore è dopu pudemu cumincià à stallà è cunfigurà Nomad.

A stallazione più dettagliata di Nomad hè descritta in a so documentazione ufficiale. Ci hè dui metudi tradiziunali di stallazione: scaricamentu di un schedariu binariu è compilazione da a fonte. Sceglieraghju u primu mètudu.

Vita: U prughjettu si sviluppa assai rapidamente, novi aghjurnamenti sò spessu liberati. Forsi una nova versione serà liberata da quandu stu articulu hè cumpletu. Dunque, prima di leghje, ricumandemu di verificà a versione attuale di Nomad in u mumentu è di scaricallu.

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

Dopu à unpacking, riceveremu un schedariu binariu Nomad chì pesa 65 MB - deve esse spustatu in /usr/local/bin.

Creemu un repertoriu di dati per Nomad è edità u so schedariu di serviziu (probabilmente ùn esiste micca à u principiu):

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

Incolla e seguenti linee quì:

[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

Tuttavia, ùn avemu micca fretta di lancià nomadi - ùn avemu ancu creatu u so schedariu di cunfigurazione:

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

A struttura di u cartulare finali serà a siguenti:

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

U schedariu nomad.hcl deve cuntene a seguente cunfigurazione:

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

Cuntenutu di u schedariu 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
}

Ùn vi scurdate di cambià u schedariu di cunfigurazione nantu à u sicondu servitore - quì vi tuccherà à cambià u valore di a direttiva http.

L'ultima cosa in questa fase hè di cunfigurà Nginx per proxy è stabilisce l'autorizazione http. Cuntenutu di u schedariu 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";
        }
        
}

Avà pudemu accede à u pannellu web via una reta esterna. Cunnette è andate à a pagina di i servitori:

Configurazione di un cluster Nomad cù Consul è integrazione cù Gitlab
Image 1. Lista di servitori in u cluster Nomad

I dui servitori sò affissati bè in u pannellu, vedemu a listessa cosa in l'output di u cumandamentu di u statutu di u nodu nomad:

Configurazione di un cluster Nomad cù Consul è integrazione cù Gitlab
Image 2. Output di u cumandamentu di statutu di u nodu nomade

Et le Consul ? Fighjemu un ochju. Andà à u pannellu di cuntrollu Consul, à a pagina di i nodi:
Configurazione di un cluster Nomad cù Consul è integrazione cù Gitlab
Image 3. Lista di nodi in u cluster Consul

Avà avemu un Nomad preparatu chì travaglia in cunghjunzione cù Consul. In l'ultima tappa, andemu à a parte divertente: stabilisce a consegna di cuntenituri Docker da Gitlab à Nomad, è parlemu ancu di alcune di e so altre caratteristiche distintive.

Creazione di Gitlab Runner

Per implementà l'imaghjini di docker à Nomad, useremu un corridore separatu cù u schedariu binariu Nomad in l'internu (qui, per via, pudemu nutà una altra funzione di l'applicazioni Hashicorp - individualmente sò un unicu schedariu binariu). Caricate à u cartulare di u corridore. Creemu un Dockerfile simplice per ellu cù u cuntenutu seguente:


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

In u listessu prughjettu avemu creatu .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}

In u risultatu, averemu una maghjina dispunibule di u corridore Nomad in u Registru di Gitlab, avà pudemu andà direttamente à u repository di u prugettu, creà un Pipeline è cunfigurà u travagliu nomadu di Nomad.

Cunfigurazione di u prugettu

Cuminciamu cù u schedariu di u travagliu per Nomad. U mo prughjettu in questu articulu serà abbastanza primitivu: serà custituitu da un compitu. U cuntenutu di .gitlab-ci serà cusì:

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

Quì a implementazione si faci manualmente, ma pudete cunfigurà per cambià u cuntenutu di u cartulare di u prugettu. Pipeline hè custituitu di duie tappe: assemblea di l'imaghjini è a so implementazione à nomadi. In u primu stadiu, assemblemu una maghjina di docker è spinghjemu in u nostru Registru, è in a seconda lanciamu u nostru travagliu in 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" {}
                }
            }
        }
    }
}

Per piacè nutate chì aghju un Registru privatu è per tirà bè una maghjina docker, aghju bisognu di login in questu. A megliu suluzione in questu casu hè di inserisce un login è una password in Vault è poi integrà cù Nomad. Nomad supporta nativamente Vault. Ma prima, stallà e pulitiche necessarie per Nomad in Vault stessu; ponu esse scaricate:

# 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

Avà, dopu avè creatu e pulitiche necessarie, aghjunghjemu l'integrazione cù Vault in u bloccu di u travagliu in u schedariu job.nomad:

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

Aduprà l'autorizazione per token è u registratu direttamente quì, ci hè ancu l'opzione di specificà u token cum'è una variabile quandu si principia l'agente nomadu:

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

Avà pudemu usà e chjave cù Vault. U principiu di u funziunamentu hè simplice: creamu un schedariu in u travagliu Nomad chì guardà i valori di variàbili, per esempiu:

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
}

Cù questu approcciu simplice, pudete cunfigurà a spedizione di cuntenituri à u cluster Nomad è travaglià cun ellu in u futuru. Diceraghju chì in una certa misura simpaticu cù Nomad - hè più adattatu per i picculi prughjetti induve Kubernetes pò causà cumplessità supplementu è ùn hà micca realizatu u so potenziale. In più, Nomad hè perfettu per i principianti - hè faciule d'installà è di cunfigurà. In ogni casu, quandu pruvate nantu à certi prughjetti, scontru un prublema cù e so versioni iniziali - parechje funzioni basi ùn sò micca solu o ùn funzionanu micca bè. In ogni casu, crede chì Nomad hà da cuntinuà à sviluppà è in u futuru acquistà e funzioni chì ognunu hà bisognu.

Autore: Ilya Andreev, editatu da Alexey Zhadan è a squadra Live Linux


Source: www.habr.com

Add a comment