OpsĂŠtning af Nomad-klynge med Consul og integration med Gitlab

Introduktion

I den seneste tid er populariteten af Kubernetes steget hastigt - flere og flere projekter implementerer det. Jeg vil dog berÞre en orkestrator som Nomad: den er ideel til projekter, hvor der allerede anvendes andre lÞsninger fra HashiCorp, sÄsom Vault og Consul, og hvor projekterne ikke er komplekse med hensyn til infrastruktur. I dette materiale vil der vÊre en vejledning til installation af Nomad, oprettelse af to noder i et cluster samt integration af Nomad med GitLab.

OpsĂŠtning af Nomad-klynge med Consul og integration med Gitlab

TestbĂŠnk

Lidt om testmiljĂžet: der anvendes tre virtuelle servere med specifikationerne 2 CPU, 4 RAM, 50 Gb SSD, der er forbundet i et samlet lokalt netvĂŠrk. Deres navne og IP-adresser:

  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 af Nomad, Consul. Oprettelse af Nomad-cluster

Lad os pÄbegynde den grundlÊggende installation. PÄ trods af installationens enkelhed vil jeg beskrive den for at sikre artikelens sammenhÊng: i grunden blev den oprettet ud fra udkast og noter for hurtig adgang i tilfÊlde af behov.

FÞr vi gÄr i gang med det praktiske, lad os diskutere den teoretiske del, da det pÄ dette stadium er vigtigt at forstÄ den fremtidige struktur.

Vi har to Nomad-noder, og vi Þnsker at sammenkÊde dem i et cluster; derudover vil vi senere have brug for automatisk skalering af clusteren - til dette vil vi have brug for Consul. Med dette vÊrktÞj bliver clustering og tilfÞjelse af nye noder en meget enkel opgave: den oprettede Nomad-node forbinder til Consul-agenten, hvorefter den forbinder til det eksisterende Nomad-cluster. Derfor vil vi fÞrst installere Consul-serveren, konfigurere grundlÊggende HTTP-godkendelse til webpanelet (det er som standard uden godkendelse og kan tilgÄs via en ekstern adresse), samt de nÞdvendige Consul-agenter pÄ Nomad-serverne, hvorefter vi kun gÄr i gang med Nomad.

Installation af HashiCorp-vĂŠrktĂžjer er meget enkel: i princippet flytter vi blot binĂŠrfilen til bin-mappen, konfigurerer konfigurationsfilen for vĂŠrktĂžjet og opretter dens servicefil.

Vi downloader binĂŠrfilen Consul og udpakker den i brugerens hjemmebibliotek:

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 den binĂŠre fil consul klar til videre opsĂŠtning.

For at arbejde med Consul skal vi oprette en unik nĂžgle ved hjĂŠlp af kommandoen keygen:

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

Lad os gÄ videre til konfigurationen af Consul, og oprettere mappen /etc/consul.d/ med fÞlgende struktur:

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

I mappen bootstrap vil der vére en konfigurationsfil config.json — her angiver vi indstillingerne for Consul. Dens indhold:

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

Lad os se nÊrmere pÄ de vigtigste direktiver og deres betydning:

  • bootstrap: true. Vi aktiverer automatisk tilfĂžjelse af nye noder, nĂ„r de tilsluttes. Jeg vil bemĂŠrke, at vi ikke angiver det nĂžjagtige antal forventede noder her.
  • server: true. Aktiverer servermodus. Consul pĂ„ denne virtuelle maskine vil i Ăžjeblikket vĂŠre den eneste server og master, mens Nomad VMs vil fungere som klienter.
  • datacenter: dc1. Her angiver vi navnet pĂ„ datacenteret for at oprette klyngen. Det skal vĂŠre identisk pĂ„ bĂ„de klienter og servere.
  • krypter: your-key. NĂžgle, som ogsĂ„ skal vĂŠre unik og vĂŠre identisk pĂ„ alle klienter og servere. Den genereres med kommandoen consul keygen.
  • start_join. I denne liste angiver vi listen med IP-adresser, som der vil blive oprettet forbindelse til. Indtil videre efterlader vi kun vores egen adresse.

PĂ„ dette tidspunkt kan vi starte Consul via kommandolinjen:

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

Dette er en god metode til fejlfinding lige nu, men denne metode kan ikke bruges permanent af Äbenlyse grunde. Lad os oprette en servicefil til at styre Consul via systemd:

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

Indholdet 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 starter Consul via systemctl:

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

Vi kontrollerer: vores service bÞr vÊre startet, og nÄr vi udfÞrer kommandoen consul members, skal vi se vores server:

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

NĂŠste trin: installation af Nginx og opsĂŠtning af proxy, http-godkendelse. Vi installerer nginx via pakkestyring og i mappen /etc/nginx/sites-enabled opretter vi konfigurationsfilen consul.conf med fĂžlgende indhold:

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

Husk at oprette .htpasswd-filen og generere et brugernavn og adgangskode til den. Dette punkt er nĂždvendigt for at sikre, at webpanelet ikke er tilgĂŠngeligt for alle, der kender vores domĂŠne. Men ved opsĂŠtning af Gitlab mĂ„ vi give afkald pĂ„ dette — ellers kan vi ikke implementere vores applikation i Nomad. I mit projekt er bĂ„de Gitlab og Nomad kun tilgĂŠngelige i et lukket netvĂŠrk, sĂ„ der er ikke noget problem her.

PĂ„ de to Ăžvrige servere installerer vi Consul-agenter efter fĂžlgende instruktion. Gentag handlingerne 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/

PÄ samme mÄde som den forrige server opretter vi en mappe til konfigurationsfilerne /etc/consul.d med fÞlgende struktur:

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

Indholdet af 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 adresse for VM
    "start_join": ["172.30.0.15"], # fjern adresse for Consul-server
    "ports": {
      "dns": 53
     }

Gem Êndringerne og gÄ videre til konfigurationen af servicefilen, dens indhold:

/etc/systemd/system/consul.service:

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

Start consul pÄ serveren. Nu skal vi, efter opstart, kunne se den konfigurerede service i nsul members. Det betyder, at den er tilsluttet til klyngen som klient. UdfÞr det samme pÄ den anden server, og efter dette kan vi gÄ videre med installation og konfiguration af Nomad.

En mere grundig installation af Nomad er beskrevet i den officielle dokumentation. Der er to traditionelle mÄder at installere pÄ: download af binÊrfilen og kompilering fra kildekoden. Jeg vÊlger den fÞrste metode.

BemÊrk: projektet udvikler sig meget hurtigt, og der udgives ofte nye opdateringer. Det er muligt, at der vil vÊre en ny version, nÄr artiklen er fÊrdig. Derfor anbefaler jeg at tjekke den aktuelle version af Nomad, fÞr du lÊser, og downloade netop 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 udpakkingen fĂ„r vi en Nomad-binĂŠrfil pĂ„ 65 MB — den skal flyttes til /usr/local/bin.

Vi opretter en data-mappe til Nomad og redigerer dens servicefil (den findes sandsynligvis ikke i starten):

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

IndsĂŠt fĂžlgende linjer:

[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 lad os ikke skynde os med at starte nomad — vi har endnu ikke oprettet dens 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 endelige mappestruktur vil vĂŠre som fĂžlger:

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

Filen nomad.hcl skal indeholde fĂžlgende konfiguration:

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

Indholdet af 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
}

Husk at ĂŠndre konfigurationsfilen pĂ„ den anden server — der skal ĂŠndres vĂŠrdien af http-direktivet.

Til sidst er der tilbage at konfigurere Nginx til at proxy og sĂŠtte http-godkendelse op. Indholdet af 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Ä adgang til webpanelet over det offentlige netvÊrk. Vi logger ind og gÄr til siden servers:

OpsĂŠtning af Nomad-klynge med Consul og integration med Gitlab
Billede 1. Liste over servere i Nomad-klyngen

Begge servere vises korrekt i panelet, og det samme vil vi se i output af kommandoen nomad node status:

OpsĂŠtning af Nomad-klynge med Consul og integration med Gitlab
Billede 2. Output af kommandoen nomad node status

Hvad med Consul-siden? Lad os tage et kig. Vi gÄr ind i Consul-administrationspanelet, pÄ siden nodes:
OpsĂŠtning af Nomad-klynge med Consul og integration med Gitlab
Billede 3. Liste over noder i Consul-klyngen

Nu har vi en forberedt Nomad, der kÞrer sammen med Consul. I den afsluttende fase gÄr vi til det mest interessante: vi konfigurerer levering af Docker-containere fra Gitlab til Nomad, og vi vil ogsÄ tale om nogle af hans andre karakteristiske funktioner.

Oprettelse af Gitlab Runner

For at deploye Docker-billeder til Nomad vil vi bruge en separat runner med Nomad-binary filen indeni (for þvrigt kan man bemérke endnu en sérhed ved Hashicorp-applikationer — hver for sig udgþr de en enkelt binary fil). Upload det til runnerens mappe. Vi laver en simpleste Dockerfile med fþlgende indhold:


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

I dette projekt opretter 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 et tilgÊngeligt billede af Nomad-runneren i Gitlab Registry, nu kan vi gÄ videre til projektets repository, oprette en pipeline og konfigurere Nomad-jobben.

Konfiguration af projektet

Lad os starte med job-filen til Nomad. Mit projekt i denne artikel vil vÊre temmelig primitivt: det vil bestÄ af en enkelt opgave. Indholdet af .gitlab-ci vil vÊre som fÞlger:

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

Her sker deployment manuelt, men du kan indstille det til at Êndre indholdet af projektmappen. Pipeline bestÄr af to faser: bygning af billedet og dets deployment til Nomad. I den fÞrste fase bygger vi Docker-billedet og pusher det til vores Registry, mens vi i den anden fase kÞrer vores job i 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" {}
                }
            }
        }
    }
}

VÊr opmÊrksom pÄ, at jeg har et lukket Registry, og for at kunne hente docker-billedet skal jeg logge ind. Den bedste lÞsning i dette tilfÊlde er at gemme login og adgangskode i Vault med efterfÞlgende integration med Nomad. Nomad understÞtter Vault nativt. Men fÞrst i Vault skal vi installere de nÞdvendige policies for Nomad, som kan indlades:

# 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 vi har oprettet de nĂždvendige policies, skal vi tilfĂžje integrationen med Vault i task-blokken i job.nomad-filen:

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

Jeg bruger token-autentifikation og angiver det direkte her, men der er ogsÄ mulighed for at angive token som en variabel ved opstart af nomad agent:

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

Nu kan vi bruge nĂžglerne fra Vault. Princippet er enkelt: vi opretter en fil i Nomad-jobbet, der vil indeholde vĂŠrdierne for variablerne, for eksempel:

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
}

SÄdan en simpel tilgang kan bruges til at konfigurere levering af containere til Nomad-klyngen og arbejde videre med den. Jeg mÄ sige, at jeg pÄ en mÄde er tilhÊnger af Nomad - den passer bedre til smÄ projekter, hvor Kubernetes kan skabe yderligere komplikationer og ikke udnytter sit potentiale fuldt ud. Desuden er Nomad perfekt til begyndere - den er nem at installere og konfigurere. Dog har jeg under testning af nogle projekter oplevet problemer med visse tidligere versioner - mange grundlÊggende funktioner mangler eller fungerer ikke korrekt. Ikke desto mindre mener jeg, at Nomad vil udvikle sig og i fremtiden fÄ de nÞdvendige funktioner, som alle vil have.

Forfatter: Ilya Andreev, redigeret af Alexey Zhadan og teamet fra «Live Linux»


Kilde: habr.com

KĂžb pĂ„lidelig webhosting med DDoS-beskyttelse, VPS VDS-servere đŸ”„ KĂžb pĂ„lidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster