Sissejuhatus
Viimastel aegadel on Kubernetes'i populaarsus kiiresti kasvanud â jĂ€rjest rohkem projekte rakendab seda. Soovisin siiski rÀÀkida korraldajatest, nagu Nomad: see sobib suurepĂ€raselt projektidele, kus juba kasutatakse teisi HashiCorpi lahendusi, nagu Vault ja Consul, ning projektid ise ei ole infrastruktuuri osas liiga keerulised. KĂ€esolevas materjalis on juhend Nomadi installimiseks, kahe sĂ”lme ĂŒhendamiseks klastrisse ning Nomadi integreerimiseks Gitlabi.

Teststand
Veidi testkeskkonnast: kasutatakse kolme virtuaalset serverit, mille omadused on 2 CPU, 4 RAM, 50 Gb SSD, ĂŒhendatud ĂŒhte kohalikku vĂ”rku. Nende nimed ja IP-aadressid:
- nomad-livelinux-01: 172.30.0.5
- nomad-livelinux-02: 172.30.0.10
- consul-livelinux-01: 172.30.0.15
Nomadi, Consuli installimine. Nomadi klastrite loomine
Alustame pÔhiinstalleerimisega. Vaatamata installimise lihtsusele, kirjeldan seda artikli terviklikkuse nimel: tegelikult on see loodud mustandite ja mÀrkmete pÔhjal kiireks ligipÀÀsuks vajaduse korral.
Enne praktikas alustamist arutame teooria osa, sest antud etapis on tulevase struktuuri mÔistmine oluline.
Meil on kaks Nomad sĂ”lme ja soovime need klastrisse ĂŒhendada. Tulevikus vajame me ka automaatset klastrite skaleerimist â selleks on meil vaja Consulit. Selle tööriista abil muutub klasterdamine ja uute sĂ”lmede lisamine vĂ€ga lihtsaks: loodud Nomadi sĂ”lm ĂŒhendub Consuli agentidega, pĂ€rast seda ĂŒhendub see olemasoleva Nomadi klastriga. Seega alustame Consuli serveri seadistamisest, konfigureerime baasi http autentimise veebipaneelile (see on vaikimisi ilma autentimiseta ja vĂ”ib olla kĂ€ttesaadav vĂ€lisest aadressist), samuti seadistame Consuli agendid Nomadi serverites, seejĂ€rel liigume edasi Nomadi seadistamise juurde.
HashiCorpi tööriistade paigaldamine on vÀga lihtne: pÔhimÔtteliselt liigutame lihtsalt binaarfaili bin kausta, konfigureerime tööriista konfiguratsioonifaili ja loome teenuse faili.
Laadime alla Consuli binaarfaili ja dekompressime selle kasutaja kodukatalooge:
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/NĂŒĂŒd on meil olemas valmis Consuli binaarfail edasiseks seadistamiseks.
Consul'i kasutamiseks peame looma ainulaadse vÔtme kÀsuga keygen:
root@consul-livelinux-01:~# consul keygen
Liigume Consul'i konfiguratsiooni seadistamise juurde, loome katalooge /etc/consul.d/ jÀrgmise struktuuriga:
/etc/consul.d/
âââ bootstrap
â âââ config.jsonKataloogis bootstrap asub konfiguratsioonifail config.json â selles mÀÀrame Consul'i seadistused. Selle sisu:
{
"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"]
}Vaatame eraldi pÔhi direktiive ja nende tÀhendusi:
- bootstrap: true. Lubame uute nodede automaatse lisamise, kui need ĂŒhenduvad. TĂ€histan, et me ei mĂ€rgi siin oodatavate nodede tĂ€pset arvu.
- server: true. Lubame serveri reĆŸiimi. Consul on sellel virtuaalsel masinal praegu ainus server ja meistrina, Nomad'i VM'id toimivad klientidena.
- datacenter: dc1. MÀÀrame klastrite jaoks andmekeskuse nime. See peab olema identne nii klientide kui ka serveritega.
- encrypt: your-key. VĂ”ti, mis peab samuti olema ainulaadne ja ĂŒhtima kĂ”igi klientide ja serveritega. Loobetakse kĂ€suga consul keygen.
- start_join. Selles loendis toome vĂ€lja IP-aadresside loetelu, millele ĂŒhendust luuakse. Praegu jĂ€tame alles ainult oma aadressi.
Selles etapis saame kÀivitada consul kÀsurea abil:
root@consul-livelinux-01:~# /usr/local/bin/consul agent -config-dir /etc/consul.d/bootstrap -uiSee on praegu hea tĂ”rkeotsingu meetod, kuid pĂŒsivalt seda kasutada ei saa ilmselgetel pĂ”hjustel. Loome teenuse faili, et hallata Consulit lĂ€bi systemd:
root@consul-livelinux-01:~# nano /etc/systemd/system/consul.service
faili consul.service sisu:
[Unit]
Description=Consuli kÀivitamisprotsess
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.targetKÀivitame Consuli lÀbi systemctl:
root@consul-livelinux-01:~# systemctl start consul
Kontrollime: meie teenus peaks olema kÀivitatud, ja kui kÀivitame kÀsu consul members, peaksime nÀgema meie serverit:
root@consul-livelinux:/etc/consul.d# consul members
consul-livelinux 172.30.0.15:8301 alive server 1.5.0 2 dc1JÀrgmine etapp: Nginxi installimine ja pöördumise, http-autentimise seadistamine. Installeerime nginx pakihalduri kaudu ja kataloogis /etc/nginx/sites-enabled loome konfiguratsioonifaili consul.conf jÀrgmise sisuga:
ĂŒlesvoolne 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 "Parooliga kaitstud ala";
}
}Ărge unustage luua .htpasswd faili ja genereerida sellele kasutajanimi ja parool. See samm on vajalik, et veebiportaal ei oleks kergesti kĂ€ttesaadav kĂ”igile, kes meie domeeni tunnevad. Siiski tuleb Gitlabi seadistamisel sellest loobuda â vastasel juhul ei saa me oma rakendust Nomadi seadistada. Minu projektis asuvad nii Gitlab kui ka Nomad ainult hallis vĂ”rgus, seega pole siin sellist probleemi.
Paigaldame Consul agentid kahes ĂŒlejÀÀnud serveris jĂ€rgnevate juhiste kohaselt. Korrake toiminguid binaarfailiga:
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/Sama nagu eelmine server, loome konfiguratsioonifailide kausta /etc/consul.d jÀrgmise struktuuriga:
/etc/consul.d/
âââ client
â âââ config.jsonconfig.json faili sisu:
{
"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", # kohalik VM aadress
"start_join": ["172.30.0.15"], # kaugserveri konsul aadress
"ports": {
"dns": 53
}Salvestame muudatused ja liigume teenuse faili seadistamise juurde, selle sisu:
/etc/systemd/system/consul.service:
[Unit]
Description="HashiCorp Consul - teenuste vÔrgu lahendus"
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.targetKĂ€ivitame Consul serveris. NĂŒĂŒd, pĂ€rast kĂ€ivitamist, peaksime nsul members nĂ€gema seadistatud teenust. See tĂ€hendaks, et see on edukalt liitunud klastriga kliendina. Korrake sama teisel serveril ja seejĂ€rel saame alustada Nomadi installimise ja seadistamisega.
PodrobnejĆĄa installacija Nomad on kirjeldatud selle ametlikus dokumentatsioonis. On kaks traditsioonilist installimise meetodit: binaarfaili allalaadimine ja allikakoodist kompileerimine. Valin esimese meetodi.
MÀrkus: projekt areneb vÀga kiiresti, tihti tulevad vÀlja uued uuendused. VÔib-olla on artikli lÔpetamise ajaks vÀlja tulnud uus versioon. SeetÔttu soovitan enne lugemist kontrollida Nomadi praegust versiooni ja laadida alla just see.
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.dPakkimise jĂ€rel saame Nomadâi binaarfaili, mille suurus on 65 MB â see tuleb paigutada /usr/local/bin.
Loome Nomadâi jaoks andmedirectory ja redigeerime tema teenuse faili (seda pole tĂ”enĂ€oliselt alguses olemas):
root@nomad-livelinux-01:~# mkdir --parents /opt/nomad
root@nomad-livelinux-01:~# nano /etc/systemd/system/nomad.serviceKopeerime sinna jÀrgmised read:
[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.targetKuid me ei kiirusta nomadi kĂ€ivitama â me pole veel tema konfigureerimise faili loonud:
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
Katalooge struktuur on jÀrgmine:
/etc/nomad.d/
âââ nomad.hcl
âââ server.hclFail nomad.hcl peab sisaldama jĂ€rgmist konfiguratsiooni:
datacenter = "dc1"
data_dir = "/opt/nomad"Faili server.hcl sisu:
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
}Ărge unustage muuta konfigureerimise fail teisel serveril â seal tuleb muuta http direktiivi vÀÀrtust.
Viimase sammu hulka kuulub Nginxi seadistamine proksiks ja http autoriseerimise seadistamine. Faili nomad.conf sisu:
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 "Parooliga kaitstud ala";
}
}NĂŒĂŒd saame pÀÀseda veebihalduspaneelile vĂ€lisest vĂ”rgust. Logime sisse ja liigume servers lehele:

Pilt 1. Nomadi klastri serverite nimekiri
MÔlemad serverid kuvatakse juhtpaneelis edukalt, sama nÀeme ka kÀsu nomad node status vÀljundis:

Kujutis 2. KÀsk nomad node status vÀljund
Aga kuidas on Consuliga? Vaadakem. Liigume Consuli juhtpaneeli, nodide lehele:

Kujutis 3. Consuli klastri nodide nimekiri
NĂŒĂŒd on meie Nomad valmis ja töötab koos Consuliga. LĂ”ppfaasis alustame kĂ”ige huvitavaga: seadistame Docker konteinerite saatmise Gitlabist Nomadi ja rÀÀgime ka mĂ”nest tema teistsugusest omadusest.
Gitlab Runneri loomine
Docker piltide juurutamiseks Nomadis kasutame eraldi runtnerit koos Nomadi binaarfailiga sees (siin on muideks veel ĂŒks Hashicorpi rakenduste omadus â nad esindavad eraldi ĂŒhtset binaarfaili). Laadige see runneri katalooge. Loome sellele kĂ”ige lihtsama Dockerfile'i jĂ€rgmise sisuga:
FROM alpine:3.9
RUN apk add --update --no-cache libc6-compat gettext
COPY nomad /usr/local/bin/nomad
Loome samas projektis .gitlab-ci.yml:
muutujad:
DOCKER_IMAGE: nomad/nomad-deploy
DOCKER_REGISTRY: registry.domain.name
etapid:
- ehitamine
ehitamine:
etapp: ehitamine
pilt: ${DOCKER_REGISTRY}/nomad/alpine:3
skript:
- tag=${DOCKER_REGISTRY}/${DOCKER_IMAGE}:latest
- docker build --pull -t ${tag} -f Dockerfile .
- docker push ${tag}KokkuvĂ”ttes saame Gitlab Registry'sse juurdepÀÀsetava Nomadi runner'i pildi, nĂŒĂŒd saame minna otse projekti reposi, luues Pipeline'i ja seadistades Nomadi töö.
Projekti seadistus
Alustame Nomadi töö failiga. Minu projekt selles artiklis on piisavalt primitiivne: see koosneb ĂŒhest ĂŒlesandest. Faili .gitlab-ci sisu on jĂ€rgmine:
muutujad:
NOMAD_ADDR: http://nomad.address.service:4646
DOCKER_REGISTRY: registry.domain.name
DOCKER_IMAGE: example/project
etapid:
- ehitamine
- juurutamine
ehitamine:
etapp: ehitamine
pilt: ${DOCKER_REGISTRY}/nomad-runner/alpine:3
skript:
- tag=${DOCKER_REGISTRY}/${DOCKER_IMAGE}:${CI_COMMIT_SHORT_SHA}
- docker build --pull -t ${tag} -f Dockerfile .
- docker push ${tag}
juurutamine:
etapp: juurutamine
pilt: registry.example.com/nomad/nomad-runner:latest
skript:
- 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
keskkond:
nimi: tootmine
lubatud_viga: vale
kui: kÀsitsiSiin toimub juurutamine kÀsitsi, kuid vÔite seadistada selle projektikausta sisu muutmiseks. Pipeline koosneb kahest etapist: pildi koostamisest ja selle juurutamisest Nomadis. Esimeses etapis koostame Docker-pildi ja pushime selle meie registrisse, teises etapis kÀivitame meie töö Nomadis.
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" {}
}
}
}
}
}Palun pange tÀhele, et mul on suletud Register ja docker-image'i eduka tÔmbamise jaoks pean seal sisse logima. Parim lahendus antud juhtumis on lisada kasutajanimi ja parool Vaulti, mille jÀrel integreerime selle Nomadiga. Nomad toetab Vaulti natiivselt. Aga kÔigepealt seadistame Vaultis vajalikud poliitikad Nomadi jaoks, neid saab alla laadida:
# 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.jsonNĂŒĂŒd, kui oleme loonud vajalikud poliitikad, lisame job.nomadi faili task plokis Vaultiga integreerimise:
vault {
enabled = true
address = "https://vault.domain.name:8200"
token = "token"
}Kasutame autentimist tokeniga ja kirjutame selle siia otse; samuti on vÔimalus mÀÀrata token muutujana, kui kÀivitada nomad agent:
$ VAULT_TOKEN= nomad agent -config /path/to/config
NĂŒĂŒd saame kasutada vĂ”tmeid Vaultist. Tööprincip on lihtne: loome faili Nomadi töö jaoks, mis hoiab endas muutujate vÀÀrtusi, nĂ€iteks:
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
}Nii lihtsa lĂ€henemisega saab seadistada konteinerite tarnimist Nomad-klastrisse ja töötada sellega edaspidi. Ătlen ausalt, et mingil mÀÀral tunnen Nomadi vastu sĂŒmpaatiat â see sobib rohkem vĂ€ikestele projektidele, kus Kubernetes vĂ”ib tekitada lisaraskusi ja ei saavuta oma potentsiaali tĂ€ielikult. Lisaks sobib Nomad suurepĂ€raselt algajatele â selle paigaldamine ja konfigureerimine on lihtne. Siiski olen mĂ”nede projektide testimisel kokku puutunud varasemate versioonide probleemidega â paljudes pĂ”hifunktsioonides ei ole neid ĂŒldse vĂ”i need ei tööta korralikult. Sellegipoolest usun, et Nomad areneb edasi ja tulevikus on tal kĂ”ik vajalikud funktsioonid.
Autor: Ilya Andreyev, toimetanud Alexey Zhadan ja 'Live Linux' meeskond
Allikas: habr.com
