Entwodiksyon
Dènyèman, popilarite Kubernetes te grandi rapidman - plis ak plis pwojè ap aplike li. Mwen te vle manyen yon orchestrator tankou Nomad: li pafè pou pwojè ki deja itilize lòt solisyon ki soti nan HashiCorp, pou egzanp, Vault ak Consul, ak pwojè yo tèt yo pa konplèks an tèm de enfrastrikti. Materyèl sa a pral genyen enstriksyon pou enstale Nomad, konbine de nœuds nan yon gwoup, osi byen ke entegre Nomad ak Gitlab.
Ban tès
Yon ti kras sou ban tès la: twa serveurs vityèl yo itilize ak karakteristik sa yo nan 2 CPU, 4 RAM, 50 Gb SSD, ini nan yon rezo lokal komen. Non yo ak adrès IP yo:
- nomad-livelinux-01: 172.30.0.5
- nomad-livelinux-02: 172.30.0.10
- konsil-livelinux-01: 172.30.0.15
Enstalasyon Nomad, Konsil. Kreye yon gwoup nomad
Ann kòmanse ak enstalasyon debaz la. Malgre ke konfigirasyon an te senp, mwen pral dekri li pou dedomajman pou entegrite nan atik la: li te esansyèlman kreye nan proje ak nòt pou aksè rapid lè sa nesesè.
Anvan nou kòmanse pratik, nou pral diskite sou pati teyorik la, paske nan etap sa a li enpòtan pou konprann estrikti nan lavni.
Nou gen de nœuds nomad epi nou vle konbine yo nan yon gwoup, epi nan lavni nou pral bezwen tou otomatik dekalifikasyon gwoup - pou sa a nou pral bezwen Konsil. Avèk zouti sa a, gwoupman ak ajoute nouvo nœuds vin tounen yon travay trè senp: nœud Nomad kreye konekte ak ajan Konsil la, epi answit konekte ak gwoup Nomad ki egziste deja. Se poutèt sa, nan kòmansman an nou pral enstale sèvè Konsil la, konfigirasyon otorizasyon http debaz pou panèl entènèt la (li se san otorizasyon pa default epi yo ka jwenn aksè nan yon adrès ekstèn), osi byen ke ajan Konsil yo tèt yo sou sèvè Nomad yo, apre sa. nou pral sèlman ale nan Nomad.
Enstale zouti HashiCorp yo trè senp: esansyèlman, nou jis deplase fichye binè a nan anyè bin la, mete fichye konfigirasyon zouti a, epi kreye dosye sèvis li yo.
Telechaje fichye binè Consul a epi depake li nan anyè lakay itilizatè a:
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/
Koulye a, nou gen yon pare-fè konsil binè pou plis konfigirasyon.
Pou travay ak Consul, nou bezwen kreye yon kle inik lè l sèvi avèk lòd keygen la:
root@consul-livelinux-01:~# consul keygen
Ann kontinye mete konfigirasyon Konsil la, kreye yon anyè /etc/consul.d/ ak estrikti sa a:
/etc/consul.d/
├── bootstrap
│ └── config.json
Anyè bootstrap la pral genyen yon fichye konfigirasyon config.json - nan li nou pral mete paramèt Konsil yo. Kontni li yo:
{
"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"]
}
Ann gade direktiv prensipal yo ak siyifikasyon yo separeman:
- bootstrap: vre. Nou pèmèt ajoute otomatik nouvo nœuds si yo konekte. Mwen sonje ke nou pa endike isit la kantite egzak nœuds espere.
- sèvè: vre. Pèmèt mòd sèvè. Konsil sou machin vityèl sa a pral aji kòm sèl sèvè ak mèt nan moman sa a, VM Nomad a pral kliyan yo.
- datacenter: dc1. Espesifye non sant done a pou kreye gwoup la. Li dwe idantik sou tou de kliyan ak serveurs.
- ankripte: kle ou. Kle a, ki dwe tou inik ak matche ak sou tout kliyan ak serveurs. Jenere lè l sèvi avèk kòmand keygen konsil la.
- kòmanse_join. Nan lis sa a nou endike yon lis adrès IP kote yo pral fè koneksyon an. Nan moman sa a nou kite sèlman pwòp adrès pa nou.
Nan pwen sa a nou ka kouri konsil lè l sèvi avèk liy lòd la:
root@consul-livelinux-01:~# /usr/local/bin/consul agent -config-dir /etc/consul.d/bootstrap -ui
Sa a se yon bon fason yo debogaj kounye a, sepandan, ou pa yo pral kapab sèvi ak metòd sa a sou yon baz kontinyèl pou rezon evidan. Ann kreye yon fichye sèvis pou jere Consul atravè systemd:
root@consul-livelinux-01:~# nano /etc/systemd/system/consul.service
Sa ki nan fichye consul.service la:
[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
Lanse Consul atravè systemctl:
root@consul-livelinux-01:~# systemctl start consul
Ann tcheke: sèvis nou an dwe fonksyone, epi lè nou egzekite kòmandman manm konsil yo nou ta dwe wè sèvè nou an:
root@consul-livelinux:/etc/consul.d# consul members
consul-livelinux 172.30.0.15:8301 alive server 1.5.0 2 dc1 <all>
Pwochen etap: enstale Nginx ak mete kanpe proxy ak otorizasyon http. Nou enstale nginx atravè manadjè pake a epi nan /etc/nginx/sites-enabled anyè nou kreye yon dosye konfigirasyon consul.conf ak sa ki annapre yo:
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";
}
}
Pa bliye kreye yon fichye .htpasswd epi jenere non itilizatè ak modpas pou li. Atik sa a obligatwa pou panèl entènèt la pa disponib pou tout moun ki konnen domèn nou an. Sepandan, lè nou mete Gitlab, nou pral oblije abandone sa a - otreman nou pa pral kapab deplwaye aplikasyon nou an nan Nomad. Nan pwojè mwen an, tou de Gitlab ak Nomad yo sèlman sou entènèt la gri, kidonk pa gen okenn pwoblèm sa yo isit la.
Sou de sèvè ki rete yo nou enstale ajan Konsil yo dapre enstriksyon sa yo. Nou repete etap sa yo ak dosye binè a:
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/
Pa analoji ak sèvè anvan an, nou kreye yon anyè pou fichye konfigirasyon /etc/consul.d ak estrikti sa a:
/etc/consul.d/
├── client
│ └── config.json
Sa ki nan fichye config.json la:
{
"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
}
Sove chanjman yo epi ale nan mete kanpe fichye sèvis la, sa li yo:
/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
Nou lanse konsil sou sèvè a. Koulye a, apre lansman, nou ta dwe wè sèvis la configuré nan manm nsul yo. Sa a pral vle di ke li gen siksè konekte ak gwoup la kòm yon kliyan. Repete menm bagay la sou dezyèm sèvè a epi apre sa nou ka kòmanse enstale ak konfigirasyon Nomad.
Plis detay enstalasyon Nomad dekri nan dokiman ofisyèl li yo. Gen de metòd enstalasyon tradisyonèl: telechaje yon dosye binè ak konpile soti nan sous. Mwen pral chwazi premye metòd la.
Note: Pwojè a ap devlope trè vit, nouvo mizajou yo souvan lage. Petèt yon nouvo vèsyon pral lage lè atik sa a fini. Se poutèt sa, anvan li, mwen rekòmande tcheke vèsyon aktyèl la nan Nomad nan moman sa a ak telechaje li.
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
Apre debake, nou pral resevwa yon fichye binè Nomad ki peze 65 MB - li dwe deplase nan /usr/local/bin.
Ann kreye yon anyè done pou Nomad epi edite fichye sèvis li a (li gen plis chans pa egziste nan kòmansman an):
root@nomad-livelinux-01:~# mkdir --parents /opt/nomad
root@nomad-livelinux-01:~# nano /etc/systemd/system/nomad.service
Kole liy sa yo la:
[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
Sepandan, nou pa prese lanse nomad - nou poko kreye dosye konfigirasyon li yo:
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
Estrikti anyè final la pral jan sa a:
/etc/nomad.d/
├── nomad.hcl
└── server.hcl
Fichye nomad.hcl ta dwe genyen konfigirasyon sa a:
datacenter = "dc1"
data_dir = "/opt/nomad"
Sa ki nan fichye server.hcl la:
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
}
Pa bliye chanje fichye konfigirasyon an sou dezyèm sèvè a - la w ap bezwen chanje valè http direktiv la.
Dènye bagay nan etap sa a se konfigirasyon Nginx pou proxy ak mete kanpe otorizasyon http. Sa ki nan fichye nomad.conf la:
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";
}
}
Koulye a, nou ka jwenn aksè nan panèl entènèt la atravè yon rezo ekstèn. Konekte epi ale nan paj serveurs yo:
Imaj 1. Lis sèvè nan gwoup Nomad la
Tou de sèvè yo montre avèk siksè nan panèl la, nou pral wè menm bagay la nan pwodiksyon an nan lòd la estati nomade:
Imaj 2. Sòti kòmandman estati nomad la
E Konsil? Ann fè yon gade. Ale nan panèl kontwòl Konsil la, nan paj nœuds yo:
Imaj 3. Lis nœuds nan gwoup Konsil la
Kounye a nou gen yon Nomad ki prepare k ap travay ansanm ak Konsil. Nan etap final la, nou pral rive nan pati amizan an: mete kanpe livrezon kontenè Docker soti nan Gitlab nan Nomad, epi tou pale sou kèk nan lòt karakteristik diferan li yo.
Kreye Gitlab Runner
Pou deplwaye imaj docker nan Nomad, nou pral sèvi ak yon kourè separe ak fichye binè Nomad anndan an (isit la, nan chemen an, nou ka sonje yon lòt karakteristik nan aplikasyon Hashicorp - endividyèlman yo se yon sèl dosye binè). Voye li nan anyè kourè a. Ann kreye yon Dockerfile senp pou li ak kontni sa a:
FROM alpine:3.9
RUN apk add --update --no-cache libc6-compat gettext
COPY nomad /usr/local/bin/nomad
Nan menm pwojè a nou kreye .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}
Kòm yon rezilta, nou pral gen yon imaj ki disponib nan kourè Nomad la nan Rejis Gitlab la, kounye a nou ka ale dirèkteman nan depo pwojè a, kreye yon Pipeline ak konfigirasyon travay nomad Nomad la.
Konfigirasyon pwojè
Ann kòmanse ak dosye travay la pou Nomad. Pwojè mwen an nan atik sa a pral trè primitif: li pral konpoze de yon sèl travay. Sa ki nan .gitlab-ci yo pral jan sa a:
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
Isit la deplwaman an fèt manyèlman, men ou ka configured li pou chanje sa ki nan anyè pwojè a. Pipeline konsiste de de etap: asanble imaj ak deplwaman li nan nomad. Nan premye etap la, nou rasanble yon imaj docker epi pouse li nan Rejis nou an, epi nan dezyèm lan nou lanse travay nou an nan 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" {}
}
}
}
}
}
Tanpri sonje ke mwen gen yon Rejis prive epi pou m rale yon imaj docker avèk siksè mwen bezwen konekte nan li. Pi bon solisyon an nan ka sa a se antre yon login ak modpas nan Vault ak Lè sa a, entegre li ak Nomad. Nomad natif natal sipòte Vault. Men, anvan, ann enstale règleman ki nesesè pou Nomad nan Vault tèt li; yo ka telechaje:
# 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
Koulye a, nou te kreye règleman ki nesesè yo, nou pral ajoute entegrasyon ak Vault nan blòk travay la nan fichye job.nomad la:
vault {
enabled = true
address = "https://vault.domain.name:8200"
token = "token"
}
Mwen sèvi ak otorizasyon pa siy epi anrejistre li dirèkteman isit la, gen tou opsyon pou espesifye siy la kòm yon varyab lè yo kòmanse ajan nomad:
$ VAULT_TOKEN=<token> nomad agent -config /path/to/config
Koulye a, nou ka itilize kle yo ak vout. Prensip la nan operasyon se senp: nou kreye yon dosye nan travay Nomad ki pral estoke valè yo nan varyab, pou egzanp:
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
}
Avèk apwòch senp sa a, ou ka configured livrezon resipyan nan gwoup Nomad la epi travay avèk li nan lavni. Mwen pral di ke nan yon sèten mezi mwen senpatize ak Nomad - li pi apwopriye pou ti pwojè kote Kubernetes ka lakòz plis konpleksite epi yo pa pral reyalize tout potansyèl li. Anplis de sa, Nomad se pafè pou débutan-li fasil enstale ak konfigirasyon. Sepandan, lè tès sou kèk pwojè, mwen rankontre yon pwoblèm ak premye vèsyon li yo - anpil fonksyon debaz yo tou senpleman pa la oswa yo pa travay kòrèkteman. Sepandan, mwen kwè ke Nomad ap kontinye devlope epi alavni li pral jwenn fonksyon yo ke tout moun bezwen.
Otè: Ilya Andreev, edited by Alexey Zhadan ak ekip Live Linux la
Sous: www.habr.com