Sarrera
Azkenaldian, Kubernetesen ospea azkar hazten ari da - gero eta proiektu gehiagok ezartzen ari dira. Nomad bezalako orkestratzaile bat ukitu nahi nuen: ezin hobea da HashiCorp-en beste soluzio batzuk erabiltzen dituzten proiektuetarako, adibidez, Vault eta Consul, eta proiektuak beraiek ez dira konplexuak azpiegitura aldetik. Material honek Nomad instalatzeko argibideak izango ditu, bi nodo kluster batean konbinatuz, baita Nomad Gitlab-ekin integratzeko ere.
proba-bankua
Proba-bankuari buruz apur bat: hiru zerbitzari birtual erabiltzen dira 2 CPU, 4 RAM, 50 Gb SSDren ezaugarriekin, sare lokal komun batean elkartuta. Haien izenak eta IP helbideak:
- nomada-livelinux-01: 172.30.0.5
- nomada-livelinux-02: 172.30.0.10
- kontsul-livelinux-01: 172.30.0.15
Nomad, kontsularen instalazioa. Nomad kluster bat sortzea
Has gaitezen oinarrizko instalazioarekin. Konfigurazioa sinplea izan arren, artikuluaren osotasunagatik deskribatuko dut: funtsean, zirriborroetatik eta oharretatik sortu zen behar zenean azkar sartzeko.
Praktikan hasi aurretik, atal teorikoa eztabaidatuko dugu, etapa honetan garrantzitsua baita etorkizuneko egitura ulertzea.
Bi nodo nomada ditugu eta kluster batean konbinatu nahi ditugu, eta etorkizunean kluster eskalatze automatikoa ere beharko dugu; horretarako, Kontsul beharko dugu. Tresna honekin, nodo berriak multzokatzea eta gehitzea oso lan sinplea bihurtzen da: sortutako Nomad nodoa Consul agentearekin konektatzen da, eta gero lehendik dagoen Nomad klusterera konektatzen da. Hori dela eta, hasieran Consul zerbitzaria instalatuko dugu, web panelerako oinarrizko http baimena konfiguratuko dugu (lehenespenez baimenik gabe dago eta kanpoko helbide batean atzitu daiteke), baita Consul agenteak beraiek ere Nomad zerbitzarietan, eta ondoren. Nomad-era bakarrik joango gara.
HashiCorp-en tresnak instalatzea oso erraza da: funtsean, fitxategi bitarra bin direktoriora eraman, tresnaren konfigurazio fitxategia konfiguratu eta bere zerbitzu fitxategia sortu besterik ez dugu.
Deskargatu Consul fitxategi bitarra eta deskonprimitu erabiltzailearen hasierako direktorioan:
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/
Orain prest egindako kontsul bitar bat dugu konfigurazio gehiagorako.
Consul-ekin lan egiteko, gako esklusibo bat sortu behar dugu keygen komandoa erabiliz:
root@consul-livelinux-01:~# consul keygen
Goazen Kontsularen konfigurazioa konfiguratzera, /etc/consul.d/ direktorio bat sortuz hurrengo egiturarekin:
/etc/consul.d/
├── bootstrap
│ └── config.json
Bootstrap direktorioak config.json konfigurazio fitxategi bat edukiko du - bertan Consul ezarpenak ezarriko ditugu. Bere edukia:
{
"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"]
}
Ikus ditzagun zuzentarau nagusiak eta haien esanahiak bereizita:
- bootstrap: egia. Nodo berriak automatikoki gehitzea gaitzen dugu konektatuta baldin badaude. Kontuan hartzen dut hemen ez dugula adierazten espero diren nodoen kopuru zehatza.
- zerbitzaria: egia. Gaitu zerbitzari modua. Makina birtual honetako kontsulak zerbitzari eta maisu bakar gisa jardungo du momentuz, Nomad-en VM bezeroak izango dira.
- datacenter: dc1. Zehaztu datu-zentroaren izena klusterra sortzeko. Bezeroetan zein zerbitzarietan berdina izan behar du.
- encrypt: zure-giltza. Gakoa, bezero eta zerbitzari guztietan bakarra eta bat etorri behar duena ere. Consul keygen komandoa erabiliz sortu da.
- hasi_join. Zerrenda honetan konexioa egingo den IP helbideen zerrenda adierazten dugu. Momentuz gure helbidea bakarrik uzten dugu.
Une honetan, consul exekutatu dezakegu komando lerroa erabiliz:
root@consul-livelinux-01:~# /usr/local/bin/consul agent -config-dir /etc/consul.d/bootstrap -ui
Orain arazketa egiteko modu ona da, hala ere, ezin izango duzu metodo hau etengabe erabili arrazoi bistakoengatik. Sortu dezagun zerbitzu-fitxategi bat Systemd bidez Consul kudeatzeko:
root@consul-livelinux-01:~# nano /etc/systemd/system/consul.service
Consul.service fitxategiaren edukia:
[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
Abiarazi Consul systemctl bidez:
root@consul-livelinux-01:~# systemctl start consul
Egiazta dezagun: gure zerbitzuak martxan egon behar du, eta kontsulkideen komandoa exekutatuta gure zerbitzaria ikusi beharko genuke:
root@consul-livelinux:/etc/consul.d# consul members
consul-livelinux 172.30.0.15:8301 alive server 1.5.0 2 dc1 <all>
Hurrengo etapa: Nginx instalatzea eta proxy-a eta http baimena konfiguratzea. Nginx pakete-kudeatzailearen bidez instalatzen dugu eta /etc/nginx/sites-enabled direktorioan consul.conf konfigurazio fitxategi bat sortzen dugu eduki hauekin:
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";
}
}
Ez ahaztu .htpasswd fitxategi bat sortzea eta erabiltzaile-izena eta pasahitza sortzea. Elementu hau beharrezkoa da web panela gure domeinua ezagutzen duten guztientzat erabilgarri egon ez dadin. Hala ere, Gitlab konfiguratzean, hau alde batera utzi beharko dugu; bestela, ezingo dugu gure aplikazioa zabaldu Nomad-en. Nire proiektuan, bai Gitlab eta bai Nomad sare grisean soilik daude, beraz, hemen ez dago horrelako arazorik.
Gainerako bi zerbitzarietan Consul agenteak instalatzen ditugu jarraibide hauen arabera. Pausoak fitxategi bitarrekin errepikatzen ditugu:
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/
Aurreko zerbitzariaren analogia eginez, /etc/consul.d konfigurazio-fitxategietarako direktorio bat sortzen dugu honako egiturarekin:
/etc/consul.d/
├── client
│ └── config.json
config.json fitxategiaren edukia:
{
"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
}
Gorde aldaketak eta joan zerbitzu-fitxategia, bere edukia, konfiguratzera:
/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
Kontsul abiarazten dugu zerbitzarian. Orain, abiarazi ondoren, konfiguratutako zerbitzua ikusi beharko genuke nsul kideetan. Horrek esan nahi du klusterera arrakastaz konektatu dela bezero gisa. Errepikatu gauza bera bigarren zerbitzarian eta horren ondoren Nomad instalatzen eta konfiguratzen has gaitezke.
Nomad-en instalazio zehatzagoa bere dokumentazio ofizialean deskribatzen da. Bi instalazio metodo tradizional daude: fitxategi bitar bat deskargatzea eta iturritik konpilatzea. Lehenengo metodoa aukeratuko dut.
Kontuan izan: Proiektua oso azkar garatzen ari da, eguneratze berriak kaleratzen dira askotan. Agian, artikulu hau amaitzen denerako bertsio berri bat kaleratuko da. Horregatik, irakurri aurretik, Nomad-en uneko bertsioa egiaztatzea eta deskargatzea gomendatzen dut.
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
Despaketatu ondoren, Nomad fitxategi bitar bat jasoko dugu 65 MB pisatzen duena - /usr/local/bin-era eraman behar da.
Sortu dezagun Nomad-entzako datu-direktorio bat eta editatu bere zerbitzu-fitxategia (seguruenik hasieran ez da existituko):
root@nomad-livelinux-01:~# mkdir --parents /opt/nomad
root@nomad-livelinux-01:~# nano /etc/systemd/system/nomad.service
Itsatsi hor lerro hauek:
[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
Hala ere, ez dugu presarik nomad abiarazteko - oraindik ez dugu bere konfigurazio fitxategia sortu:
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
Direktorioaren azken egitura honako hau izango da:
/etc/nomad.d/
├── nomad.hcl
└── server.hcl
Nomad.hcl fitxategiak konfigurazio hau eduki behar du:
datacenter = "dc1"
data_dir = "/opt/nomad"
server.hcl fitxategiaren edukia:
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
}
Ez ahaztu bigarren zerbitzarian konfigurazio fitxategia aldatzea - hor http zuzentarauaren balioa aldatu beharko duzu.
Etapa honetako azken gauza Nginx proxy-a eta http baimena konfiguratzeko konfiguratzea da. nomad.conf fitxategiaren edukia:
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";
}
}
Orain web panelera sar gaitezke kanpoko sare baten bidez. Konektatu eta joan zerbitzarien orrialdera:
1. irudia. Nomad klusterreko zerbitzarien zerrenda
Bi zerbitzariak ongi bistaratzen dira panelean, gauza bera ikusiko dugu nomad node status komandoaren irteeran:
2. irudia. Nomad nodo egoera komandoaren irteera
Zer esan kontsularekin? Ikus dezagun. Joan Kontsularen kontrol panelera, nodoen orrialdera:
3. irudia. Kontsul klusterreko nodoen zerrenda
Orain prest dagoen Nomada bat dugu Kontsularekin batera lanean. Azken fasean, atal dibertigarrira iritsiko gara: Gitlabetik Nomad-era Docker edukiontziak konfiguratzea eta bere beste ezaugarri bereizgarri batzuei buruz hitz egitea.
Gitlab Runner sortzen
Docker irudiak Nomad-en zabaltzeko, korridore bereizi bat erabiliko dugu barruan Nomad fitxategi bitarra duena (hemen, bide batez, Hashicorp aplikazioen beste ezaugarri bat nabari dezakegu: banan-banan fitxategi bitar bakarra dira). Kargatu korrikalarien direktoriora. Sortu dezagun Dockerfile soil bat horretarako eduki honekin:
FROM alpine:3.9
RUN apk add --update --no-cache libc6-compat gettext
COPY nomad /usr/local/bin/nomad
Proiektu berean .gitlab-ci.yml sortzen dugu:
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}
Ondorioz, Nomad korrikalariaren irudi bat eskuragarri izango dugu Gitlab Erregistroan, orain proiektuaren biltegira joan gaitezke zuzenean, Pipeline bat sortu eta Nomad-en lan nomada konfiguratu.
Proiektuaren konfigurazioa
Has gaitezen Nomad-en lanaren fitxategiarekin. Artikulu honetako nire proiektua nahiko primitiboa izango da: zeregin bakarra izango du. .gitlab-ci-ren edukia honako hau izango da:
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
Hemen inplementazioa eskuz egiten da, baina proiektuaren direktorioaren edukia aldatzeko konfigura dezakezu. Pipeline-ak bi fase ditu: irudiaren muntaketa eta bere hedapena nomadari. Lehenengo fasean, docker irudi bat muntatzen dugu eta gure Erregistrora bultzatzen dugu, eta bigarrenean Nomad-en gure lana abiarazten dugu.
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" {}
}
}
}
}
}
Kontuan izan Erregistro pribatu bat dudala eta docker irudi bat behar bezala ateratzeko bertan saioa hasi behar dudala. Irtenbiderik onena kasu honetan saio-hasiera eta pasahitza sartu Vault-en eta gero Nomad-ekin integratzea da. Nomad-ek berez onartzen du Vault. Baina lehenik eta behin, instala ditzagun Nomad-erako beharrezko politikak Vault-en bertan; deskargatu daitezke:
# 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
Orain, beharrezko politikak sortuta, Vault-ekin integrazioa gehituko dugu job.nomad fitxategiko ataza blokean:
vault {
enabled = true
address = "https://vault.domain.name:8200"
token = "token"
}
Baimena token bidez erabiltzen dut eta hemen erregistratzen dut zuzenean, agente nomada abiaraztean tokena aldagai gisa zehazteko aukera ere badago:
$ VAULT_TOKEN=<token> nomad agent -config /path/to/config
Orain gakoak erabili ditzakegu Vault-ekin. Funtzionamendu-printzipioa erraza da: Nomad lanean fitxategi bat sortzen dugu, aldagaien balioak gordeko dituena, adibidez:
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
}
Planteamendu sinple honekin, Nomad klusterera edukiontziak bidaltzea konfigura dezakezu eta etorkizunean lan egin dezakezu. Esango dut neurri batean Nomad-ekin bat egiten dudala; egokiagoa da Kubernetes-ek konplexutasun gehigarria sor dezakeen eta bere potentzial osoa jabetuko ez den proiektu txikietarako. Gainera, Nomad ezin hobea da hasiberrientzat; erraza da instalatzen eta konfiguratzen. Hala ere, zenbait proiektutan probatzean, arazo bat aurkitzen dut bere lehen bertsioekin - oinarrizko funtzio asko ez daude edo ez dute behar bezala funtzionatzen. Hala ere, Uste dut Nomad-ek garatzen jarraituko duela eta etorkizunean denek behar dituzten funtzioak eskuratuko dituela.
Egilea: Ilya Andreev, Alexey Zhadan eta Live Linux taldeak editatua
Iturria: www.habr.com