Konfigurera Nomad-kluster med Consul och integrera med Gitlab

Introduktion

PÄ senare tid har populariteten för Kubernetes snabbt ökat - allt fler projekt implementerar det. Jag vill dock beröra en orkestrator sÄsom Nomad: den passar utmÀrkt för projekt dÀr andra lösningar frÄn HashiCorp, sÄsom Vault och Consul, redan anvÀnds, och sjÀlva projekten inte Àr komplexa ur infrastruktursynpunkt. Denna text kommer att innehÄlla en installationsguide för Nomad, sammanfogning av tvÄ noder i ett kluster, samt integration av Nomad med Gitlab.

Konfigurera Nomad-kluster med Consul och integrera med Gitlab

TestbÀnk

Lite om testmiljön: tre virtuella servrar anvÀnds med specifikationerna 2 CPU, 4 RAM, 50 Gb SSD, kopplade i ett gemensamt lokalt nÀtverk. Deras namn och IP-adresser Àr:

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

Installation av Nomad, Consul. Skapa ett Nomad-kluster

Vi börjar med en grundlÀggande installation. Trots att installationen Àr enkel, kommer jag att beskriva den för artikelns helhet: den skapades i grunden frÄn utkast och anteckningar för snabb Ätkomst vid behov.

Innan vi pÄbörjar praktiken ska vi diskutera den teoretiska delen, eftersom det pÄ detta stadium Àr viktigt att förstÄ den framtida strukturen.

Vi har tvÄ Nomad-noder och vi vill sammanfoga dem i ett kluster, och framöver kommer vi att behöva automatisk skalning av klustret - för detta kommer vi att behöva Consul. Med detta verktyg blir klustring och tillÀgg av nya noder en mycket enkel uppgift: den skapade Nomad-noden ansluter till Consul-agenten och ansluter sedan till det befintliga Nomad-klustret. DÀrför kommer vi först att installera Consul-servern, konfigurera grundlÀggande http-autentisering för webbpanelen (den Àr som standard utan autentisering och kan nÄs via en extern adress), samt Consul-agenterna pÄ Nomad-servrarna, innan vi gÄr vidare till Nomad.

Installationen av HashiCorp-verktygen Àr mycket enkel: i princip flyttar vi bara binÀrfilen till bin-katalogen, konfigurerar verktygets konfigurationsfil och skapar dess tjÀnstefil.

Vi laddar ner binÀrfilen för Consul och packar upp den i anvÀndarens hemkatalog:

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/

Nu har vi en fÀrdig binÀrfil för consul för vidare konfiguration.

För att arbeta med Consul mÄste vi skapa en unik nyckel med kommandot keygen:

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

Vi gÄr vidare med att konfigurera Consul. Vi skapar katalogen /etc/consul.d/ med följande struktur:

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

I katalogen bootstrap kommer konfigurationsfilen config.json att finnas — hĂ€r anger vi instĂ€llningarna för Consul. InnehĂ„llet Ă€r:

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

LÄt oss gÄ igenom huvuddirektiven och deras betydelse:

  • bootstrap: true. Vi aktiverar automatisk registrering av nya noder vid anslutning. Jag pĂ„pekar att vi inte anger det exakta antalet förvĂ€ntade noder hĂ€r.
  • server: true. Vi aktiverar serverlĂ€ge. Consul pĂ„ denna virtuella maskin kommer för tillfĂ€llet att vara den enda servern och mĂ€staren, medan VM Nomad kommer att vara klienter.
  • datacenter: dc1. Vi anger namnet pĂ„ datacentret för att skapa klustret. Det mĂ„ste vara identiskt pĂ„ bĂ„de klienter och servrar.
  • encrypt: your-key. Nyckeln som ocksĂ„ mĂ„ste vara unik och matcha pĂ„ alla klienter och servrar. Den genereras med kommandot consul keygen.
  • start_join. I denna lista anger vi IP-adresserna som vi ska ansluta till. För tillfĂ€llet lĂ€mnar vi bara vĂ„r egen adress.

Vid detta skede kan vi starta consul via kommandoraden:

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

Detta Àr en bra metod för felsökning just nu, men det Àr uppenbart att denna metod inte kan anvÀndas regelbundet. Vi skapar en servicefil för att hantera Consul via systemd:

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

InnehÄllet i filen 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

Vi startar Consul via systemctl:

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

Kontrollera: tjÀnsten bör vara igÄng och nÀr vi utför kommandot consul members bör vi se vÄr server:

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

NÀsta steg: installera Nginx och konfigurera proxying, http-autentisering. Vi installerar nginx genom paketförvaltaren och i katalogen /etc/nginx/sites-enabled skapar vi konfigurationsfilen consul.conf med följande innehÄll:

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-skyddat omrÄde";
    }
}

Kom ihÄg att skapa en .htpasswd-fil och generera ett anvÀndarnamn och lösenord för det. Detta steg krÀvs sÄ att webbpanelen inte Àr tillgÀnglig för alla som kÀnner till vÄr domÀn. Men nÀr vi konfigurerar Gitlab mÄste vi avstÄ frÄn detta - annars kan vi inte distribuera vÄr applikation till Nomad. I mitt projekt finns bÄde Gitlab och Nomad endast i det interna nÀtverket, sÄ det finns inget sÄdant problem hÀr.

PÄ de andra tvÄ servrarna installerar vi Consul-agenter enligt följande instruktioner. Vi upprepar stegen med binÀrfilen:

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/

I likhet med den tidigare servern skapar vi en katalog för konfigurationsfiler /etc/consul.d med följande struktur:

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

InnehÄllet i filen 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", # lokal VM-adress
    "start_join": ["172.30.0.15"], # extern adress till Consul-servern
    "ports": {
      "dns": 53
     }

Spara Àndringarna och gÄ vidare till konfigurationen av service-filen, dess innehÄll:

/etc/systemd/system/consul.service:

[Unit]
Description="HashiCorp Consul - En lösning för service mesh"
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

Starta Consul pÄ servern. Nu, efter starten, bör vi se den konfigurerade tjÀnsten i nsul members. Detta kommer att innebÀra att den framgÄngsrikt har anslutit sig till klustret som en klient. Upprepa samma sak pÄ den andra servern och efter det kan vi börja installera och konfigurera Nomad.

En mer detaljerad installation av Nomad beskrivs i dess officiella dokumentation. Det finns tvÄ traditionella sÀtt att installera: nedladdning av binÀrfil och kompilering frÄn kÀllkod. Jag vÀljer det första sÀttet.

AnmÀrkning: projektet utvecklas mycket snabbt, nya uppdateringar slÀpps ofta. Det kan hÀnda att en ny version kommer att slÀppas innan artikeln Àr fÀrdig. DÀrför rekommenderar jag att kontrollera den aktuella versionen av Nomad just nu och ladda ner just den.

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

Efter uppackningen fĂ„r vi en binĂ€rfil av Nomad som vĂ€ger 65 MB – den mĂ„ste flyttas till /usr/local/bin.

Vi skapar en data-katalog för Nomad och redigerar dess servicefil (den kommer förmodligen inte att finnas frÄn början):

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

Klistra in följande rader:

[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

Men vi skyndar oss inte att starta nomad – vi har Ă€nnu inte skapat dess konfigurationsfil:

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

Den slutgiltiga katalogstrukturen kommer att se ut som följande:

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

Filen nomad.hcl bör innehÄlla följande konfiguration:

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

InnehÄllet i filen 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
}

Kom ihĂ„g att Ă€ndra konfigurationsfilen pĂ„ den andra servern – dĂ€r behövs vĂ€rdet för direktivet http Ă€ndras.

Det sista steget i detta skede Àr att konfigurera Nginx för proxying och stÀlla in http-autentisering. InnehÄllet i filen 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";
        }
        
}

Nu kan vi fÄ tillgÄng till webbpanelen över det externa nÀtverket. Vi ansluter och gÄr till sidan servers:

Konfigurera Nomad-kluster med Consul och integrera med Gitlab
Bild 1. Lista över servrar i Nomad-klustret

BÄda servrarna visas framgÄngsrikt i panelen, detsamma ser vi i utskriften av kommandot nomad node status:

Konfigurera Nomad-kluster med Consul och integrera med Gitlab
Bild 2. Utskrift av kommandot nomad node status

Vad sÀger Consul? LÄt oss ta en titt. Vi gÄr till Consuls kontrollpanel, pÄ sidan nodes:
Konfigurera Nomad-kluster med Consul och integrera med Gitlab
Bild 3. Lista över noder i Consul-klustret

Nu har vi en förberedd Nomad som arbetar i tandem med Consul. I det avslutande steget kommer vi att gÄ vidare till det mest intressanta: vi kommer att konfigurera leveransen av Docker-containrar frÄn Gitlab till Nomad, samt diskutera nÄgra av dess andra utmÀrkande egenskaper.

Skapa Gitlab Runner

För att deploya Docker-bilder i Nomad kommer vi att anvĂ€nda en separat runner med Nomads binĂ€rfil inuti (detta Ă€r ocksĂ„ en annan sĂ€rskild egenskap hos Hashicorp-appar — de representerar var för sig en enda binĂ€rfil). Ladda ner den till runner-katalogen. För den skapar vi en enkel Dockerfile med följande innehĂ„ll:


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

I detta projekt skapar vi .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}

Som resultat fÄr vi en tillgÀnglig bild av Nomad-runner i Gitlab Registry, nu kan vi gÄ direkt till projektets repository, skapa en Pipeline och konfigurera Nomads job.

Konfigurera projektet

Vi börjar med jobbfilen för Nomad. Mitt projekt i denna artikel kommer att vara ganska enkelt: det kommer att bestÄ av en enda uppgift. InnehÄllet i .gitlab-ci kommer att vara som följer:

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}'  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

HÀr sker deployment i manuell lÀge, men du kan konfigurera det att förÀndra innehÄllet i projektkatalogen. Pipelines bestÄr av tvÄ steg: bygga bilden och deploya den i Nomad. Under det första steget samlar vi Docker-bilden och pushar den till vÄr Registry, och under det andra kör vi vÄr jobb i Nomad.

jobb "monitoring-status" {
    datacenter = ["dc1"]
    migrera {
        max_parallel = 3
        health_check = "checks"
        min_healthy_time = "15s"
        healthy_deadline = "5m"
    }

    grupp "zhadan.ltd" {
        antal = 1
        uppdatera {
            max_parallel      = 1
            min_healthy_time  = "30s"
            healthy_deadline  = "5m"
            progress_deadline = "10m"
            auto_revert       = true
        }
        uppgift "service-monitoring" {
            driver = "docker"

            konfiguration {
                bild = "registry.domain.name/example/project:${CI_COMMIT_SHORT_SHA}"
                force_pull = true
                autentisering {
                    anvÀndarnamn = "gitlab_user"
                    lösenord = "gitlab_password"
                }
                port_mappning {
                    http = 8000
                }
            }
            resurser {
                nÀtverk {
                    port "http" {}
                }
            }
        }
    }
}

Observera att jag har ett privat Registry och för att framgÄngsrikt dra ned Docker-bilden behöver jag autentisera mig. Den bÀsta lösningen i detta fall Àr att placera anvÀndarnamn och lösenord i Vault och sedan integrera det med Nomad. Nomad stöder Vault natively. Men först i Vault mÄste vi stÀlla in de nödvÀndiga policyerna för Nomad, de kan laddas:

# 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

Nu, efter att ha skapat de nödvÀndiga policyerna, kommer vi att lÀgga till integration med Vault i task-blocket i job.nomad-filen:

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

Jag anvÀnder token-autentisering och anger den direkt hÀr, det finns ocksÄ ett alternativ att ange token som en variabel vid start av nomad-agenten:

$ VAULT_TOKEN= nomad agent -config /path/to/config

Nu kan vi anvÀnda nycklar med Vault. Arbetsprincipen Àr enkel: vi skapar en fil i Nomad-jobbet som kommer att lagra vÀrdena för variabler, till exempel:

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
}

PĂ„ detta enkla sĂ€tt kan vi stĂ€lla in leveransen av containrar till Nomad-klustret och arbeta med det i framtiden. Jag mĂ„ste sĂ€ga att jag pĂ„ vissa sĂ€tt gillar Nomad — det passar bĂ€ttre för mindre projekt dĂ€r Kubernetes kan orsaka ytterligare kompliceringar och inte kommer att realisera sin potential fullt ut. Dessutom passar Nomad utmĂ€rkt för nybörjare — det Ă€r lĂ€tt att installera och konfigurera. Men under tester pĂ„ vissa projekt har jag stött pĂ„ problem med tidiga versioner — mĂ„nga grundlĂ€ggande funktioner finns helt enkelt inte eller fungerar inte korrekt. ÄndĂ„ anser jag att Nomad kommer att utvecklas vidare och i framtiden fĂ„ de funktioner som alla behöver.

Författare: Ilja Andrejev, redigerad av Alexej Zhadan och teamet bakom "Live Linux"


KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster