Sissejuhatus
Viimasel ajal on Kubernetese populaarsus kiiresti kasvanud – seda rakendab üha rohkem projekte. Tahtsin puudutada sellist orkestraatorit nagu Nomad: see sobib suurepäraselt projektidele, mis juba kasutavad muid HashiCorpi lahendusi, näiteks Vault ja Consul, ning projektid ise pole infrastruktuuri poolest keerulised. See materjal sisaldab juhiseid Nomadi installimiseks, kahe sõlme ühendamiseks klastriks ja Nomadi integreerimiseks Gitlabiga.
Katselaud
Natuke katsestendist: kasutusel on kolm virtuaalserverit, millel on 2 CPU, 4 RAM, 50 Gb SSD omadused, mis on ühendatud ühiseks kohtvõrguks. Nende nimed ja IP-aadressid:
- nomad-livelinux-01: 172.30.0.5
- nomad-livelinux-02: 172.30.0.10
- konsul-livelinux-01: 172.30.0.15
Nomad, konsul paigaldamine. Nomadi klastri loomine
Alustame põhiinstallatsiooniga. Kuigi seadistus oli lihtne, kirjeldan seda artikli terviklikkuse huvides: see loodi sisuliselt mustanditest ja märkmetest, et vajadusel kiiresti juurde pääseda.
Enne praktika alustamist arutame teoreetilise osa üle, sest selles etapis on oluline mõista tulevast struktuuri.
Meil on kaks nomaadsõlme ja tahame need klastriks ühendada ning tulevikus on vaja ka automaatset klastri skaleerimist - selleks on vaja Consulit. Selle tööriistaga muutub rühmitamine ja uute sõlmede lisamine väga lihtsaks ülesandeks: loodud Nomadi sõlm loob ühenduse konsuli agendiga ja seejärel olemasoleva Nomadi klastriga. Seetõttu installime alguses Consuli serveri, seadistame veebipaneelile põhilise http autoriseerimise (vaikimisi on see ilma autoriseerimiseta ja sellele pääseb juurde välisaadressil), aga ka Consuli agendid ise Nomad serverites, mille järel liigume edasi ainult Nomadile.
HashiCorpi tööriistade installimine on väga lihtne: sisuliselt teisaldame binaarfaili lihtsalt bin kataloogi, seadistame tööriista konfiguratsioonifaili ja loome selle teenusefaili.
Laadige alla Consuli binaarfail ja pakkige see lahti kasutaja kodukataloogi:
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 edasiseks konfigureerimiseks valmis konsuli binaarfail.
Consuliga töötamiseks peame looma unikaalse võtme, kasutades käsku keygen:
root@consul-livelinux-01:~# consul keygen
Liigume edasi Consul konfiguratsiooni seadistamise juurde, luues järgmise struktuuriga kataloogi /etc/consul.d/:
/etc/consul.d/
├── bootstrap
│ └── config.json
Bootstrap kataloog sisaldab konfiguratsioonifaili config.json - selles määrame Consuli sätted. 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 põhidirektiive ja nende tähendusi eraldi:
- bootstrap: tõsi. Lubame uute sõlmede automaatse lisamise, kui need on ühendatud. Märgin, et me ei näita siin eeldatavate sõlmede täpset arvu.
- server: tõsi. Luba serverirežiim. Konsul selles virtuaalmasinas tegutseb hetkel ainsa serverina ja masterina, klientideks on Nomadi VM.
- andmekeskus: dc1. Määrake klastri loomiseks andmekeskuse nimi. See peab olema identne nii klientides kui ka serverites.
- krüptida: teie võti. Võti, mis peab samuti olema ainulaadne ja sobima kõikides klientides ja serverites. Loodud käsu consul keygen abil.
- start_join. Selles loendis näitame IP-aadresside loendit, millega ühendus luuakse. Hetkel jätame ainult enda aadressi.
Sel hetkel saame käivitada consul käsurealt:
root@consul-livelinux-01:~# /usr/local/bin/consul agent -config-dir /etc/consul.d/bootstrap -ui
See on praegu hea viis silumiseks, kuid te ei saa seda meetodit arusaadavatel põhjustel pidevalt kasutada. Loome teenusefaili Consuli haldamiseks systemd kaudu:
root@consul-livelinux-01:~# nano /etc/systemd/system/consul.service
Faili consul.service sisu:
[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
Käivitage Consul systemctl kaudu:
root@consul-livelinux-01:~# systemctl start consul
Kontrollime: meie teenus peab töötama ja konsuli liikmete käsu täitmisel peaksime nägema oma serverit:
root@consul-livelinux:/etc/consul.d# consul members
consul-livelinux 172.30.0.15:8301 alive server 1.5.0 2 dc1 <all>
Järgmine etapp: Nginxi installimine ning puhverserveri ja http autoriseerimise seadistamine. Installime nginxi paketihalduri kaudu ja kataloogis /etc/nginx/sites-enabled loome järgmise sisuga konfiguratsioonifaili consul.conf:
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";
}
}
Ärge unustage luua .htpasswd-faili ning genereerida sellele kasutajanimi ja parool. See üksus on vajalik, et veebipaneel poleks kõigile meie domeeni tundjatele kättesaadav. Gitlabi seadistamisel peame aga sellest loobuma – muidu ei saa me oma rakendust Nomadile juurutada. Minu projektis on nii Gitlab kui ka Nomad ainult hallis veebis, seega siin sellist probleemi pole.
Ülejäänud kahele serverile installime Consuli agendid vastavalt järgmistele juhistele. Kordame samme 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/
Analoogiliselt eelmise serveriga loome konfiguratsioonifailide /etc/consul.d jaoks järgmise struktuuriga kataloogi:
/etc/consul.d/
├── client
│ └── config.json
Faili config.json 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", # локальный адрес вм
"start_join": ["172.30.0.15"], # удаленный адрес консул сервера
"ports": {
"dns": 53
}
Salvestage muudatused ja jätkake teenusefaili ja selle sisu seadistamisega:
/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
Käivitame serveris konsuli. Nüüd, pärast käivitamist, peaksime nsuli liikmetes nägema konfigureeritud teenust. See tähendab, et see on klastriga kliendina edukalt ühendatud. Korrake sama teises serveris ja pärast seda saame alustada Nomadi installimist ja konfigureerimist.
Nomadi täpsemat paigaldamist kirjeldatakse selle ametlikus dokumentatsioonis. On kaks traditsioonilist installimeetodit: binaarfaili allalaadimine ja allikast kompileerimine. Ma valin esimese meetodi.
Märkus: Projekt areneb väga kiiresti, sageli antakse välja uusi värskendusi. Võib-olla ilmub selle artikli valmimise ajaks uus versioon. Seetõttu soovitan enne lugemist vaadata hetkel Nomadi praegust versiooni ja see alla laadida.
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ärast lahtipakkimist saame 65 MB kaaluva Nomad binaarfaili – see tuleb teisaldada kausta /usr/local/bin.
Loome Nomadile andmekataloogi ja redigeerime selle teenusefaili (tõenäoliselt pole seda alguses olemas):
root@nomad-livelinux-01:~# mkdir --parents /opt/nomad
root@nomad-livelinux-01:~# nano /etc/systemd/system/nomad.service
Kleepige 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.target
Kuid me ei kiirusta nomadi käivitamisega - me pole veel selle konfiguratsioonifaili 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
Lõplik kataloogistruktuur on järgmine:
/etc/nomad.d/
├── nomad.hcl
└── server.hcl
Fail nomad.hcl peaks sisaldama järgmist konfiguratsiooni:
datacenter = "dc1"
data_dir = "/opt/nomad"
Server.hcl faili 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 konfiguratsioonifaili teises serveris - seal peate muutma http-direktiivi väärtust.
Viimane asi selles etapis on Nginxi konfigureerimine puhverserveri kasutamiseks ja http-volituse seadistamiseks. 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 "Password-protected Area";
}
}
Nüüd pääseme veebipaneelile juurde välisvõrgu kaudu. Ühendage ja minge serverite lehele:
1. pilt. Nomadi klastri serverite loend
Mõlemad serverid kuvatakse paneelil edukalt, nomad node status käsu väljundis näeme sama:
2. pilt. Nomaadsõlme staatuse käsu väljund
Aga konsul? Vaatame. Minge konsuli juhtpaneelile sõlmede lehele:
3. pilt. Konsulite klastri sõlmede loend
Nüüd on meil ettevalmistatud Nomad, kes töötab koos konsuliga. Viimases etapis jõuame lõbusa osani: Dockeri konteinerite tarnimise seadistamine Gitlabist Nomadile ja räägime ka mõnest muust selle eripärast.
Gitlab Runneri loomine
Dockeri kujutiste juurutamiseks Nomadile kasutame eraldi jooksjat, mille sees on Nomadi binaarfail (siin, muide, võime märkida veel ühte Hashicorpi rakenduste funktsiooni - eraldi on need üks kahendfail). Laadige see üles jooksja kataloogi. Loome selle jaoks lihtsa Dockeri faili järgmise sisuga:
FROM alpine:3.9
RUN apk add --update --no-cache libc6-compat gettext
COPY nomad /usr/local/bin/nomad
Samas projektis loome faili .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}
Selle tulemusel on meil Gitlabi registris Nomad Runneri pilt, nüüd saame minna otse projekti hoidlasse, luua torujuhtme ja konfigureerida Nomadi nomadi töö.
Projekti seadistamine
Alustame Nomadi tööfailiga. Minu projekt selles artiklis on üsna primitiivne: see koosneb ühest ülesandest. Faili .gitlab-ci sisu on järgmine:
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
Siin toimub juurutamine käsitsi, kuid saate selle konfigureerida projektikataloogi sisu muutmiseks. Torujuhe koosneb kahest etapist: pildi kokkupanek ja selle juurutamine nomadile. Esimeses etapis koostame dokipildi ja lükkame selle oma registrisse ning teises käivitame oma 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" {}
}
}
}
}
}
Pange tähele, et mul on privaatne register ja dokkeri kujutise edukaks tõmbamiseks pean sellesse sisse logima. Parim lahendus on sel juhul sisestada Vaulti sisselogimine ja parool ning seejärel integreerida see Nomadiga. Nomad toetab algselt Vaulti. Kuid kõigepealt installime Vaultis Nomadi jaoks vajalikud poliitikad; 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.json
Nüüd, pärast vajalike poliitikate loomist, lisame faili job.nomad tegumiplokki integratsiooni Vaultiga:
vault {
enabled = true
address = "https://vault.domain.name:8200"
token = "token"
}
Kasutan autoriseerimist loa alusel ja registreerin selle otse siin, samuti on nomaadagendi käivitamisel võimalus määrata token muutujaks:
$ VAULT_TOKEN=<token> nomad agent -config /path/to/config
Nüüd saame võtmeid Vaultiga kasutada. Toimimispõhimõte on lihtne: loome Nomad töös faili, mis salvestab muutujate väärtused, 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
}
Selle lihtsa lähenemisviisi abil saate konfigureerida konteinerite tarnimise Nomad klastrisse ja sellega edaspidi koostööd teha. Ütlen, et mingil määral tunnen Nomadile kaasa - see sobib pigem väikeste projektide jaoks, kus Kubernetes võib tekitada täiendavat keerukust ega realiseeri oma täit potentsiaali. Lisaks on Nomad ideaalne algajatele – seda on lihtne paigaldada ja konfigureerida. Mõne projektiga testides puutun aga kokku probleemiga selle varajaste versioonidega – paljud põhifunktsioonid lihtsalt puuduvad või ei tööta korralikult. Usun aga, et Nomad areneb edasi ja tulevikus omandab need funktsioonid, mida kõik vajavad.
Autor: Ilja Andreev, toimetanud Aleksei Zhadan ja Live Linuxi meeskond
Allikas: www.habr.com