En Nomad Cluster opbauen mat Consult an Integratioun mat Gitlab

Aféierung

Viru kuerzem ass d'Popularitéit vu Kubernetes séier gewuess - ëmmer méi Projeten implementéieren et. Ech wollt en Orchester wéi Nomad beréieren: et ass perfekt fir Projeten déi scho aner Léisunge vun HashiCorp benotzen, zum Beispill Vault a Consul, an d'Projete selwer sinn net komplex wat d'Infrastruktur ugeet. Dëst Material enthält Instruktioune fir Nomad z'installéieren, zwee Wirbelen an e Cluster ze kombinéieren, souwéi Nomad mat Gitlab z'integréieren.

En Nomad Cluster opbauen mat Consult an Integratioun mat Gitlab

Teststand

E bëssen iwwer d'Testbank: dräi virtuelle Servere gi benotzt mat de Charakteristiken vun 2 CPU, 4 RAM, 50 Gb SSD, vereenegt an e gemeinsame lokalen Netzwierk. Hir Nimm an IP Adressen:

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

Installatioun vun Nomad, Consul. Erstellt en Nomad Cluster

Loosst d'mat der Basis Installatioun ufänken. Och wann de Setup einfach war, wäert ech et beschreiwen fir d'Integritéit vum Artikel: et gouf am Wesentlechen aus Entworf an Notizen erstallt fir séier Zougang wann néideg.

Ier mer d'Praxis ufänken, wäerte mir den theoreteschen Deel diskutéieren, well op dëser Etapp ass et wichteg d'Zukunft Struktur ze verstoen.

Mir hunn zwee Nomadenknäppchen a mir wëllen se an e Cluster kombinéieren, an an Zukunft brauche mir och automatesch Cluster-Skaléierung - dofir brauche mir Consul. Mat dësem Tool gëtt Clusteren an nei Wirbelen eng ganz einfach Aufgab: de erstallt Nomad Node verbënnt mam Consul Agent, a verbënnt dann mat dem existente Nomad Cluster. Dofir, am Ufank wäerte mir de Consul Server installéieren, Basis http Autorisatioun fir de Web Panel konfiguréieren (et ass ouni Autorisatioun par défaut a kann op enger externer Adress zougänglech sinn), souwéi d'Konsul Agenten selwer op Nomad Serveren, duerno mir wäerten nëmmen Nomad weider.

D'Installatioun vun HashiCorp Tools ass ganz einfach: am Wesentlechen réckelen mir just d'binär Datei an de bin Verzeechnes, setze d'Konfiguratiounsdatei vum Tool op a kreéiere seng Servicedatei.

Luet d'Consul binär Datei erof an packt se an den Heemverzeichnis vum Benotzer:

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/

Elo hu mir e fäerdege Konsul Binär fir weider Konfiguratioun.

Fir mam Consul ze schaffen, musse mir en eenzegaartege Schlëssel erstellen mat dem Keygen Kommando:

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

Loosst eis weidergoen fir d'Konsul Konfiguratioun opzestellen, e Verzeechnes /etc/consul.d/ mat der folgender Struktur erstellen:

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

De Bootstrap-Verzeichnis enthält eng Konfiguratiounsdatei config.json - an et wäerte mir d'Konsul-Astellunge festleeën. Seng Inhalter:

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

Loosst eis d'Haaptdirektiven an hir Bedeitunge separat kucken:

  • bootstrap: wouer. Mir aktivéieren automatesch Zousatz vun neie Wirbelen wa se verbonne sinn. Ech bemierken datt mir hei net déi exakt Zuel vun erwaarten Noden uginn.
  • Server: wouer. Server Modus aktivéieren. Consul op dëser virtueller Maschinn handelt als eenzegen Server a Meeschter am Moment, Nomad's VM wäert d'Clientë sinn.
  • datacenter:dc 1. Gitt den Numm vum Datenzenter un fir de Cluster ze kreéieren. Et muss identesch sinn op béide Clienten a Serveren.
  • verschlëssele: Är-Schlëssel. De Schlëssel, deen och eenzegaarteg muss sinn a passen op all Clienten a Serveren. Generéiert mat der Konsul keygen Kommando.
  • start_join. An dëser Lëscht weisen mir eng Lëscht vun IP Adressen un déi d'Verbindung gemaach gëtt. Am Moment verloosse mir nëmmen eis eegen Adress.

Zu dësem Zäitpunkt kënne mir Konsul mat der Kommandozeil lafen:

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

Dëst ass e gudde Wee fir elo ze Debuggen, awer Dir kënnt dës Method aus offensichtleche Grënn net permanent benotzen. Loosst eis eng Servicedatei erstellen fir Consul iwwer Systemd ze managen:

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

Inhalt vun der consul.service Datei:

[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

Start Consul via systemctl:

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

Loosst eis kucken: eise Service muss lafen, an duerch d'Ausféierung vum Kommando vum Konsulmember solle mir eise Server gesinn:

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

Nächst Stuf: Nginx installéieren an Proxying an http Autorisatioun opstellen. Mir installéieren nginx duerch de Package Manager an am /etc/nginx/sites-enabled Verzeichnis erstellen mir eng Konfiguratiounsdatei consul.conf mat den folgenden Inhalter:

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

Vergiesst net eng .htpasswd Datei ze erstellen an e Benotzernumm a Passwuert dofir ze generéieren. Dësen Artikel ass erfuerderlech fir datt de Webpanel net verfügbar ass fir jiddereen deen eis Domain kennt. Wéi och ëmmer, wann Dir Gitlab opstellt, musse mir dëst opginn - soss kënne mir eis Applikatioun net op Nomad ofsetzen. A mengem Projet sinn souwuel Gitlab wéi och Nomad nëmmen um groe Web, also ass et kee Problem hei.

Op de verbleiwen zwee Server installéiere mir Consul Agenten no den folgenden Instruktiounen. Mir widderhuelen d'Schrëtt mat der binärer Datei:

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/

Analogie mam fréiere Server erstellen mir e Verzeechnes fir Konfiguratiounsdateien /etc/consul.d mat der folgender Struktur:

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

Inhalt vun der config.json Datei:

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

Späichert d'Ännerungen a fuert weider fir d'Servicedatei opzestellen, säin Inhalt:

/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

Mir starten Konsul um Server. Elo, nom Start, sollte mir de konfiguréierten Service an nsul Memberen gesinn. Dëst bedeit datt et als Client erfollegräich mam Cluster verbonnen ass. Widderhuelen déi selwecht op den zweeten Server an duerno kënne mir ufänken Nomad z'installéieren an ze konfiguréieren.

Méi detailléiert Installatioun vun Nomad ass a senger offizieller Dokumentatioun beschriwwen. Et ginn zwou traditionell Installatiounsmethoden: eng binär Datei eroflueden an aus der Quell kompiléieren. Ech wäert déi éischt Method wielen.

Remarque: De Projet entwéckelt sech ganz séier, nei Updates ginn dacks verëffentlecht. Vläicht gëtt eng nei Versioun verëffentlecht wann dësen Artikel fäerdeg ass. Dofir, ier ech liesen, recommandéieren ech déi aktuell Versioun vum Nomad am Moment z'iwwerpréiwen an erofzelueden.

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

Nom Auspacken kréie mir eng Nomad binär Datei mat engem Gewiicht vun 65 MB - et muss op /usr/local/bin geréckelt ginn.

Loosst eis en Dateverzeichnis fir Nomad erstellen a seng Servicedatei änneren (et wäert héchstwahrscheinlech am Ufank net existéieren):

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

Paste déi folgend Zeilen do:

[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

Wéi och ëmmer, mir sinn net presséiert fir Nomad ze starten - mir hunn hir Konfiguratiounsdatei nach net erstallt:

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

Déi lescht Verzeichnisstruktur wäert wéi follegt sinn:

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

D'nomad.hcl Datei soll déi folgend Konfiguratioun enthalen:

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

Inhalter vun der Server.hcl Datei:

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
}

Vergiesst net d'Konfiguratiounsdatei um zweeten Server z'änneren - do musst Dir de Wäert vun der http-Direktiv änneren.

Déi lescht Saach op dëser Etapp ass Nginx fir Proxy ze konfiguréieren an http Autorisatioun opzestellen. Inhalt vun der nomad.conf Datei:

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

Elo kënne mir op de Webpanel iwwer en externen Netzwierk zougräifen. Connect a gitt op d'Server Säit:

En Nomad Cluster opbauen mat Consult an Integratioun mat Gitlab
Bild 1. Lëscht vun de Serveren am Nomad Cluster

Béid Server ginn erfollegräich am Panel ugewisen, mir gesinn datselwecht am Ausgang vum Nomad Node Status Kommando:

En Nomad Cluster opbauen mat Consult an Integratioun mat Gitlab
Bild 2. Ausgang vum Nomad Node Status Kommando

Wat iwwer Consul? Loosst eis kucken. Gitt op d'Konsul Kontrollpanel, op d'Nodes Säit:
En Nomad Cluster opbauen mat Consult an Integratioun mat Gitlab
Bild 3. Lëscht vun Noden am Consul Cluster

Elo hu mir e preparéierten Nomad a Verbindung mam Consul. An der leschter Etapp komme mir op de Spaass Deel: d'Liwwerung vun Docker Container vu Gitlab op Nomad opzestellen, an och iwwer e puer vun hiren aneren ënnerschiddlechen Features schwätzen.

Gitlab Runner erstellen

Fir Docker-Biller op Nomad z'installéieren, benotze mir e separaten Leefer mat der Nomad binärer Datei dobannen (hei, iwwregens, kënne mir eng aner Feature vun Hashicorp Uwendungen notéieren - individuell sinn se eng eenzeg binär Datei). Eroplueden et an de Leefer Verzeechnes. Loosst eis en einfachen Dockerfile dofir erstellen mat dem folgenden Inhalt:


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

Am selwechte Projet kreéiere mir .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}

Als Resultat hu mir e verfügbare Bild vum Nomad Runner am Gitlab Registry, elo kënne mir direkt an de Projet Repository goen, eng Pipeline erstellen an dem Nomad Nomad Job konfiguréieren.

Projet Setup

Loosst d'mat der Aarbechtsdatei fir Nomad ufänken. Mäi Projet an dësem Artikel wäert zimlech primitiv sinn: et wäert aus enger Aufgab besteet. Den Inhalt vun .gitlab-ci wäert wéi follegt sinn:

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

Hei geschitt d'Deployment manuell, awer Dir kënnt et konfiguréieren fir den Inhalt vum Projetsverzeechnes z'änneren. Pipeline besteet aus zwou Etappen: Bild Assemblée a seng Détachement ze Nomad. Op der éischter Etapp sammele mir en Docker-Bild an drécken et an eise Registry, an op der zweeter lancéiere mir eis Aarbecht am 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" {}
                }
            }
        }
    }
}

Notéiert w.e.g. datt ech e privaten Registry hunn a fir en Docker-Bild erfollegräich ze zéien, muss ech mech aloggen. Déi bescht Léisung an dësem Fall ass e Login a Passwuert an Vault anzeginn an et dann mat Nomad z'integréieren. Nomad ënnerstëtzt natierlech Vault. Awer als éischt, loosst eis déi néideg Politik fir Nomad am Vault selwer installéieren; si kënnen erofgeluede ginn:

# 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

Elo, nodeems mir déi néideg Politik erstallt hunn, addéiere mer Integratioun mat Vault am Taskblock an der job.nomad Datei:

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

Ech benotzen d'Autorisatioun per Token an registréiert se direkt hei, et gëtt och d'Optioun fir den Token als Variabel ze spezifizéieren wann Dir Nomad Agent start:

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

Elo kënne mir d'Schlësselen mat Vault benotzen. De Prinzip vun der Operatioun ass einfach: mir erstellen eng Datei am Nomad Job deen d'Wäerter vun de Variablen späichert, zum Beispill:

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
}

Mat dëser einfacher Approche kënnt Dir d'Liwwerung vu Container an den Nomad-Cluster konfiguréieren a mat deem an Zukunft schaffen. Ech wäert soen, datt ech zu engem gewësse Mooss mat Nomad sympathéieren - et ass méi gëeegent fir kleng Projeten, wou Kubernetes zousätzlech Komplexitéit verursaache kënnen a säi vollt Potenzial net realiséieren. Plus, Nomad ass perfekt fir Ufänger - et ass einfach ze installéieren an ze konfiguréieren. Wéi och ëmmer, wann ech op e puer Projete testen, begéinen ech e Problem mat senge fréie Versiounen - vill Basisfunktiounen sinn einfach net do oder se funktionnéieren net richteg. Wéi och ëmmer, ech gleewen datt Nomad sech weider entwéckelt an an Zukunft d'Funktioune kritt, déi jidderee brauch.

Auteur: Ilya Andreev, editéiert vum Alexey Zhadan an dem Live Linux Team


Source: will.com

Setzt e Commentaire