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.

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:
- nomad-livelinux-01: 172.30.0.5
- nomad-livelinux-02: 172.30.0.10
- 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.jsonI 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 -uiDette 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.targetVi 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 dc1NĂŠ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.jsonIndholdet 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.targetStart 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.dEfter 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.serviceIndsĂŠ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.targetMen 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.hclFilen 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:

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:

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:

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: manualHer 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.jsonNu, 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
