Ievads
PÄdÄjÄ laikÄ Kubernetes popularitÄte strauji aug ā arvien vairÄk projektu to Ä«steno. Es gribÄju pieskarties tÄdam orÄ·estrim kÄ Nomad: tas ir lieliski piemÄrots projektiem, kuros jau tiek izmantoti citi HashiCorp risinÄjumi, piemÄram, Vault un Consul, un paÅ”i projekti nav sarežģīti infrastruktÅ«ras ziÅÄ. Å ajÄ materiÄlÄ bÅ«s norÄdÄ«jumi par Nomad instalÄÅ”anu, divu mezglu apvienoÅ”anu klasterÄ«, kÄ arÄ« Nomad integrÄÅ”anu ar Gitlab.
Testa stends
Nedaudz par testÄÅ”anas stendu: tiek izmantoti trÄ«s virtuÄlie serveri ar 2 CPU, 4 RAM, 50 Gb SSD Ä«paŔībÄm, kas apvienoti kopÄjÄ lokÄlajÄ tÄ«klÄ. ViÅu vÄrdi un IP adreses:
- nomad-livelinux-01: 172.30.0.5
- nomad-livelinux-02: 172.30.0.10
- consul-livelinux-01: 172.30.0.15
Nomad, konsula uzstÄdÄ«Å”ana. Nomad klastera izveide
SÄksim ar pamata instalÄÅ”anu. Lai gan iestatÄ«Å”ana bija vienkÄrÅ”a, es to aprakstÄ«Å”u raksta integritÄtes labad: tas bÅ«tÄ«bÄ tika izveidots no melnrakstiem un piezÄ«mÄm, lai vajadzÄ«bas gadÄ«jumÄ varÄtu Ätri piekļūt.
Pirms sÄkam praksi, mÄs apspriedÄ«sim teorÄtisko daļu, jo Å”ajÄ posmÄ ir svarÄ«gi saprast nÄkotnes struktÅ«ru.
Mums ir divi nomadu mezgli, un mÄs vÄlamies tos apvienot klasterÄ«, un nÄkotnÄ mums bÅ«s nepiecieÅ”ama arÄ« automÄtiska klasteru mÄrogoÅ”ana - Å”im nolÅ«kam mums bÅ«s nepiecieÅ”ams Consul. Izmantojot Å”o rÄ«ku, klasterÄÅ”ana un jaunu mezglu pievienoÅ”ana kļūst par ļoti vienkÄrÅ”u uzdevumu: izveidotais Nomad mezgls izveido savienojumu ar Consul aÄ£entu un pÄc tam savienojas ar esoÅ”o Nomad klasteru. TÄpÄc sÄkumÄ mÄs uzstÄdÄ«sim Consul serveri, konfigurÄsim pamata http autorizÄciju tÄ«mekļa panelim (tas pÄc noklusÄjuma ir bez autorizÄcijas un tam var piekļūt no ÄrÄjÄs adreses), kÄ arÄ« paÅ”us Consul aÄ£entus uz Nomad serveriem, pÄc kura mÄs dosimies tikai uz Nomad.
HashiCorp rÄ«ku instalÄÅ”ana ir ļoti vienkÄrÅ”a: bÅ«tÄ«bÄ mÄs vienkÄrÅ”i pÄrvietojam binÄro failu uz bin direktoriju, iestatÄm rÄ«ka konfigurÄcijas failu un izveidojam tÄ pakalpojuma failu.
LejupielÄdÄjiet Consul binÄro failu un izpakojiet to lietotÄja mÄjas direktorijÄ:
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/
Tagad mums ir gatavs konsula binÄrs tÄlÄkai konfigurÄcijai.
Lai strÄdÄtu ar Consul, mums ir jÄizveido unikÄla atslÄga, izmantojot keygen komandu:
root@consul-livelinux-01:~# consul keygen
PÄriesim pie Consul konfigurÄcijas iestatÄ«Å”anas, izveidojot direktoriju /etc/consul.d/ ar Å”Ädu struktÅ«ru:
/etc/consul.d/
āāā bootstrap
ā āāā config.json
Bootstrap direktorijÄ bÅ«s konfigurÄcijas fails config.json - tajÄ mÄs iestatÄ«sim Consul iestatÄ«jumus. TÄs saturs:
{
"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"]
}
ApskatÄ«sim galvenÄs direktÄ«vas un to nozÄ«mi atseviŔķi:
- bootstrap: taisnÄ«ba. MÄs iespÄjojam jaunu mezglu automÄtisku pievienoÅ”anu, ja tie ir savienoti. Es atzÄ«mÄju, ka mÄs Å”eit nenorÄdam precÄ«zu paredzamo mezglu skaitu.
- serveris: taisnÄ«ba. IespÄjot servera režīmu. Konsuls Å”ajÄ virtuÄlajÄ maŔīnÄ Å”obrÄ«d darbosies kÄ vienÄ«gais serveris un galvenais, klienti bÅ«s Nomad virtuÄlÄ maŔīna.
- datu centrs: dc1. NorÄdiet datu centra nosaukumu, lai izveidotu klasteru. Tam ir jÄbÅ«t identiskam gan klientiem, gan serveriem.
- Å”ifrÄt: jÅ«su atslÄga. AtslÄgai, kurai arÄ« jÄbÅ«t unikÄlai un jÄatbilst visiem klientiem un serveriem. Ä¢enerÄts, izmantojot komandu consul keygen.
- start_join. Å ajÄ sarakstÄ mÄs norÄdÄm to IP adreÅ”u sarakstu, ar kurÄm tiks izveidots savienojums. Å obrÄ«d atstÄjam tikai savu adresi.
Å ajÄ brÄ«dÄ« mÄs varam palaist konsulu, izmantojot komandrindu:
root@consul-livelinux-01:~# /usr/local/bin/consul agent -config-dir /etc/consul.d/bootstrap -ui
Tas ir labs veids, kÄ tagad atkļūdot, taÄu acÄ«mredzamu iemeslu dÄļ Å”o metodi nevarÄsit izmantot pastÄvÄ«gi. Izveidosim pakalpojuma failu, lai pÄrvaldÄ«tu Consul, izmantojot systemd:
root@consul-livelinux-01:~# nano /etc/systemd/system/consul.service
Faila consul.service saturs:
[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
Palaidiet programmu Consul, izmantojot systemctl:
root@consul-livelinux-01:~# systemctl start consul
PÄrbaudÄ«sim: mÅ«su pakalpojumam ir jÄdarbojas, un, izpildot konsula dalÄ«bnieku komandu, mums vajadzÄtu redzÄt mÅ«su serveri:
root@consul-livelinux:/etc/consul.d# consul members
consul-livelinux 172.30.0.15:8301 alive server 1.5.0 2 dc1 <all>
NÄkamais posms: Nginx instalÄÅ”ana un starpniekservera un http autorizÄcijas iestatÄ«Å”ana. MÄs instalÄjam nginx, izmantojot pakotÅu pÄrvaldnieku, un direktorijÄ /etc/nginx/sites-enabled mÄs izveidojam konfigurÄcijas failu consul.conf ar Å”Ädu saturu:
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";
}
}
Neaizmirstiet izveidot .htpasswd failu un Ä£enerÄt tam lietotÄjvÄrdu un paroli. Å is vienums ir nepiecieÅ”ams, lai tÄ«mekļa panelis nebÅ«tu pieejams visiem, kas zina mÅ«su domÄnu. TomÄr, iestatot Gitlab, mums tas bÅ«s jÄatsakÄs - pretÄjÄ gadÄ«jumÄ mÄs nevarÄsim izvietot savu lietojumprogrammu pakalpojumÄ Nomad. ManÄ projektÄ gan Gitlab, gan Nomad atrodas tikai pelÄkajÄ tÄ«meklÄ«, tÄpÄc Å”eit Å”Ädas problÄmas nav.
AtlikuÅ”ajos divos serveros mÄs instalÄjam Consul aÄ£entus saskaÅÄ ar tÄlÄk sniegtajiem norÄdÄ«jumiem. MÄs atkÄrtojam darbÄ«bas ar binÄro failu:
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Äc analoÄ£ijas ar iepriekÅ”Äjo serveri mÄs izveidojam direktoriju konfigurÄcijas failiem /etc/consul.d ar Å”Ädu struktÅ«ru:
/etc/consul.d/
āāā client
ā āāā config.json
Faila config.json saturs:
{
"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
}
SaglabÄjiet izmaiÅas un pÄrejiet pie pakalpojuma faila, tÄ satura iestatÄ«Å”anas:
/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
MÄs palaižam konsulu serverÄ«. Tagad pÄc palaiÅ”anas mums vajadzÄtu redzÄt konfigurÄto pakalpojumu nsul biedros. Tas nozÄ«mÄs, ka tas ir veiksmÄ«gi izveidojis savienojumu ar klasteru kÄ klients. AtkÄrtojiet to paÅ”u otrajÄ serverÄ«, un pÄc tam mÄs varam sÄkt instalÄt un konfigurÄt Nomad.
DetalizÄtÄka Nomad uzstÄdÄ«Å”ana ir aprakstÄ«ta tÄ oficiÄlajÄ dokumentÄcijÄ. Ir divas tradicionÄlÄs instalÄÅ”anas metodes: binÄrÄ faila lejupielÄde un kompilÄÅ”ana no avota. Es izvÄlÄÅ”os pirmo metodi.
PiezÄ«me: Projekts attÄ«stÄs ļoti Ätri, bieži tiek izdoti jauni atjauninÄjumi. IespÄjams, lÄ«dz Ŕī raksta pabeigÅ”anai tiks izlaista jauna versija. TÄpÄc pirms lasÄ«Å”anas iesaku pÄrbaudÄ«t Å”obrÄ«d aktuÄlo Nomad versiju un to lejupielÄdÄt.
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
PÄc izpakoÅ”anas mÄs saÅemsim Nomad binÄro failu, kas sver 65 MB - tas ir jÄpÄrvieto uz /usr/local/bin.
Izveidosim Nomad datu direktoriju un rediÄ£Äsim tÄ servisa failu (visticamÄk, sÄkumÄ tas nepastÄvÄs):
root@nomad-livelinux-01:~# mkdir --parents /opt/nomad
root@nomad-livelinux-01:~# nano /etc/systemd/system/nomad.service
IelÄ«mÄjiet tur Å”Ädas rindiÅas:
[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
TomÄr mÄs nesteidzamies palaist nomad - mÄs vÄl neesam izveidojuÅ”i tÄ konfigurÄcijas failu:
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
GalÄ«gÄ direktoriju struktÅ«ra bÅ«s Å”Äda:
/etc/nomad.d/
āāā nomad.hcl
āāā server.hcl
FailÄ nomad.hcl jÄbÅ«t Å”Ädai konfigurÄcijai:
datacenter = "dc1"
data_dir = "/opt/nomad"
Server.hcl faila saturs:
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
}
Neaizmirstiet mainÄ«t konfigurÄcijas failu otrajÄ serverÄ« - tur jums bÅ«s jÄmaina http direktÄ«vas vÄrtÄ«ba.
PÄdÄjÄ lieta Å”ajÄ posmÄ ir Nginx konfigurÄÅ”ana starpniekserveram un http autorizÄcijas iestatÄ«Å”anai. Faila nomad.conf saturs:
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";
}
}
Tagad mÄs varam piekļūt tÄ«mekļa panelim, izmantojot ÄrÄju tÄ«klu. Izveidojiet savienojumu un dodieties uz servera lapu:
1. attÄls. Nomad klastera serveru saraksts
Abi serveri ir veiksmÄ«gi parÄdÄ«ti panelÄ«, mÄs redzÄsim to paÅ”u komandas nomad node statusa izvadÄ:
2. attÄls. Nomad mezgla statusa komandas izvade
KÄ ar konsulu? PaskatÄ«simies. Dodieties uz Consul vadÄ«bas paneli, uz mezglu lapu:
3. attÄls. Konsulu klastera mezglu saraksts
Tagad mums ir sagatavots nomads, kas strÄdÄ kopÄ ar konsulu. PÄdÄjÄ posmÄ mÄs nonÄksim pie jautrÄs daļas: Docker konteineru piegÄdes iestatÄ«Å”ana no Gitlab uz Nomad, kÄ arÄ« runÄsim par dažÄm citÄm tÄ raksturÄ«gajÄm iezÄ«mÄm.
Gitlab Runner izveide
Lai izvietotu Docker attÄlus pakalpojumÄ Nomad, mÄs izmantosim atseviŔķu skrÄjÄju ar Nomad binÄro failu (Å”eit, starp citu, mÄs varam atzÄ«mÄt vÄl vienu Hashicorp lietojumprogrammu funkciju - atseviŔķi tie ir viens binÄrs fails). AugÅ”upielÄdÄjiet to skrÄjÄja direktorijÄ. Izveidosim tam vienkÄrÅ”u Dockerfile ar Å”Ädu saturu:
FROM alpine:3.9
RUN apk add --update --no-cache libc6-compat gettext
COPY nomad /usr/local/bin/nomad
TajÄ paÅ”Ä projektÄ mÄs izveidojam .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}
RezultÄtÄ mums bÅ«s pieejams Nomad skrÄjÄja attÄls Gitlab reÄ£istrÄ, tagad mÄs varam doties tieÅ”i uz projekta repozitoriju, izveidot cauruļvadu un konfigurÄt Nomad nomad darbu.
Projekta iestatīŔana
SÄksim ar Nomad darba failu. Mans projekts Å”ajÄ rakstÄ bÅ«s diezgan primitÄ«vs: tas sastÄvÄs no viena uzdevuma. Faila .gitlab-ci saturs bÅ«s Å”Äds:
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
Å eit izvietoÅ”ana notiek manuÄli, taÄu varat to konfigurÄt, lai mainÄ«tu projekta direktorijas saturu. Cauruļvads sastÄv no diviem posmiem: attÄla montÄža un tÄ izvietoÅ”ana nomadÄ. PirmajÄ posmÄ mÄs apkopojam docker attÄlu un ievietojam to savÄ reÄ£istrÄ, bet otrajÄ mÄs sÄkam darbu pakalpojumÄ 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" {}
}
}
}
}
}
LÅ«dzu, Åemiet vÄrÄ, ka man ir privÄts reÄ£istrs un, lai veiksmÄ«gi izvilktu docker attÄlu, man tajÄ jÄpiesakÄs. LabÄkais risinÄjums Å”ajÄ gadÄ«jumÄ ir Vault ievadÄ«t pieteikumvÄrdu un paroli un pÄc tam integrÄt to ar Nomad. Nomad sÄkotnÄji atbalsta Vault. Bet vispirms instalÄsim nepiecieÅ”amÄs politikas Nomad in Vault; tÄs var lejupielÄdÄt:
# 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
Tagad, izveidojot nepiecieÅ”amÄs politikas, mÄs pievienosim integrÄciju ar Vault uzdevumu blokÄ failÄ job.nomad:
vault {
enabled = true
address = "https://vault.domain.name:8200"
token = "token"
}
Es izmantoju autorizÄciju ar pilnvaru un reÄ£istrÄju to tieÅ”i Å”eit, ir arÄ« iespÄja norÄdÄ«t marÄ·ieri kÄ mainÄ«go, startÄjot nomadu aÄ£entu:
$ VAULT_TOKEN=<token> nomad agent -config /path/to/config
Tagad mÄs varam izmantot atslÄgas ar Vault. DarbÄ«bas princips ir vienkÄrÅ”s: mÄs izveidojam failu Nomad darbÄ, kurÄ tiks saglabÄtas mainÄ«go vÄrtÄ«bas, piemÄram:
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
}
Izmantojot Å”o vienkÄrÅ”o pieeju, varat konfigurÄt konteineru piegÄdi Nomad klasterim un strÄdÄt ar to turpmÄk. TeikÅ”u, ka zinÄmÄ mÄrÄ simpatizÄ Nomad - tas ir vairÄk piemÄrots maziem projektiem, kur Kubernetes var radÄ«t papildu sarežģītÄ«bu un pilnÄ«bÄ neizmantos savu potenciÄlu. TurklÄt Nomad ir lieliski piemÄrots iesÄcÄjiem ā to ir viegli uzstÄdÄ«t un konfigurÄt. TomÄr, testÄjot dažus projektus, es saskaros ar problÄmu ar tÄ agrÄ«najÄm versijÄm - daudzas pamatfunkcijas vienkÄrÅ”i nav vai arÄ« tÄs nedarbojas pareizi. TomÄr uzskatu, ka Nomad turpinÄs attÄ«stÄ«ties un nÄkotnÄ iegÅ«s ikvienam nepiecieÅ”amÄs funkcijas.
Autors: Iļja Andrejevs, rediÄ£Äjis Aleksejs Žadans un Live Linux komanda
Avots: www.habr.com