Inngangur
Undanfarið hafa vinsældir Kubernetes farið ört vaxandi - fleiri og fleiri verkefni eru að hrinda því í framkvæmd. Mig langaði að snerta hljómsveitarstjóra eins og Nomad: hann er fullkominn fyrir verkefni sem nota nú þegar aðrar lausnir frá HashiCorp, til dæmis Vault og Consul, og verkefnin sjálf eru ekki flókin hvað varðar innviði. Þetta efni mun innihalda leiðbeiningar um uppsetningu Nomad, sameina tvo hnúta í þyrping, auk þess að samþætta Nomad við Gitlab.
Prófstandur
Smá um prófunarbekkinn: þrír sýndarþjónar eru notaðir með eiginleika 2 örgjörva, 4 vinnsluminni, 50 Gb SSD, sameinuð í sameiginlegt staðarnet. Nöfn þeirra og IP tölur:
- nomad-livelinux-01: 172.30.0.5
- nomad-livelinux-02: 172.30.0.10
- consul-livelinux-01: 172.30.0.15
Uppsetning Nomad, ræðismanns. Að búa til hirðingjaklasa
Byrjum á grunnuppsetningunni. Þrátt fyrir að uppsetningin hafi verið einföld, mun ég lýsa henni vegna heiðarleika greinarinnar: hún var í meginatriðum búin til úr drögum og athugasemdum til að fá skjótan aðgang þegar þörf krefur.
Áður en við byrjum að æfa munum við ræða fræðilega hlutann, því á þessu stigi er mikilvægt að skilja framtíðarskipulagið.
Við erum með tvo hirðingjahnúta og viljum sameina þá í klasa og í framtíðinni þurfum við líka sjálfvirka klasaskala - til þess þurfum við Consul. Með þessu tóli verður klasa og bæta við nýjum hnútum mjög einfalt verkefni: búið til Nomad hnútur tengist Consul umboðsmanninum og tengist síðan við núverandi Nomad klasa. Þess vegna munum við í upphafi setja upp Consul netþjóninn, stilla grunn http heimild fyrir vefspjaldið (það er sjálfgefið án heimildar og hægt er að nálgast það á utanaðkomandi heimilisfangi), sem og Consul umboðsmenn sjálfir á Nomad netþjónum, eftir það við munum aðeins halda áfram til Nomad.
Að setja upp verkfæri HashiCorp er mjög einfalt: í rauninni færum við bara tvöfalda skrána í bin möppuna, setjum upp stillingarskrá tólsins og búum til þjónustuskrá þess.
Sæktu Consul tvíundarskrána og pakkaðu henni upp í heimamöppu notandans:
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ú höfum við tilbúið ræðismannstvíundarkerfi fyrir frekari stillingar.
Til að vinna með Consul þurfum við að búa til einstakan lykil með keygen skipuninni:
root@consul-livelinux-01:~# consul keygen
Við skulum halda áfram að setja upp Consul stillinguna, búa til möppu /etc/consul.d/ með eftirfarandi uppbyggingu:
/etc/consul.d/
├── bootstrap
│ └── config.json
Bootstrap skráin mun innihalda stillingarskrá config.json - í henni munum við stilla Consul stillingarnar. Innihald þess:
{
"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"]
}
Við skulum skoða helstu tilskipanir og merkingu þeirra sérstaklega:
- stígvél: satt. Við gerum sjálfvirka viðbót við nýja hnúta ef þeir eru tengdir. Ég tek fram að við tilgreinum ekki hér nákvæman fjölda væntanlegra hnúta.
- miðlara: satt. Virkja miðlaraham. Consul á þessari sýndarvél mun starfa sem eini þjónninn og meistarinn í augnablikinu, VM Nomad mun vera viðskiptavinirnir.
- gagnaver:dc1. Tilgreindu nafn gagnaversins til að búa til þyrpinguna. Það verður að vera eins á bæði viðskiptavinum og netþjónum.
- Dulkóða: þinn-lykill. Lykillinn, sem verður einnig að vera einstakur og passa á öllum viðskiptavinum og netþjónum. Búið til með því að nota consul keygen skipunina.
- start_join. Í þessum lista tilgreinum við lista yfir IP tölur sem tengingin verður við. Í augnablikinu skiljum við aðeins eftir okkar eigið heimilisfang.
Á þessum tímapunkti getum við keyrt ræðismann með því að nota skipanalínuna:
root@consul-livelinux-01:~# /usr/local/bin/consul agent -config-dir /etc/consul.d/bootstrap -ui
Þetta er góð leið til að kemba núna, en þú munt ekki geta notað þessa aðferð stöðugt af augljósum ástæðum. Við skulum búa til þjónustuskrá til að stjórna Consul í gegnum systemd:
root@consul-livelinux-01:~# nano /etc/systemd/system/consul.service
Innihald consul.service skrárinnar:
[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
Ræstu Consul í gegnum systemctl:
root@consul-livelinux-01:~# systemctl start consul
Við skulum athuga: þjónusta okkar verður að vera í gangi og með því að framkvæma skipun ræðismanna ættum við að sjá netþjóninn okkar:
root@consul-livelinux:/etc/consul.d# consul members
consul-livelinux 172.30.0.15:8301 alive server 1.5.0 2 dc1 <all>
Næsta stig: að setja upp Nginx og setja upp umboð og http heimild. Við setjum upp nginx í gegnum pakkastjórann og í /etc/nginx/sites-enabled skránni búum við til stillingarskrá consul.conf með eftirfarandi innihaldi:
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";
}
}
Ekki gleyma að búa til .htpasswd skrá og búa til notendanafn og lykilorð fyrir hana. Þetta atriði er nauðsynlegt svo að vefspjaldið sé ekki aðgengilegt öllum sem þekkja lénið okkar. Hins vegar, þegar þú setur upp Gitlab, verðum við að yfirgefa þetta - annars getum við ekki sent forritið okkar til Nomad. Í verkefninu mínu eru bæði Gitlab og Nomad eingöngu á gráa vefnum, svo það er ekkert slíkt vandamál hér.
Á hinum tveimur netþjónunum setjum við upp Consul umboðsmenn samkvæmt eftirfarandi leiðbeiningum. Við endurtökum skrefin með tvíundarskránni:
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/
Á hliðstæðan hátt við fyrri netþjóninn búum við til möppu fyrir stillingarskrár /etc/consul.d með eftirfarandi uppbyggingu:
/etc/consul.d/
├── client
│ └── config.json
Innihald config.json skráarinnar:
{
"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
}
Vistaðu breytingarnar og haltu áfram að setja upp þjónustuskrána, innihald hennar:
/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
Við ræsum ræðismann á þjóninum. Nú, eftir ræsingu, ættum við að sjá stilltu þjónustuna í nsul meðlimum. Þetta þýðir að það hefur tengst þyrpingunni sem viðskiptavinur. Endurtaktu það sama á öðrum netþjóni og eftir það getum við byrjað að setja upp og stilla Nomad.
Nánari uppsetningu á Nomad er lýst í opinberum skjölum þess. Það eru tvær hefðbundnar uppsetningaraðferðir: að hlaða niður tvöfaldri skrá og setja saman frá uppruna. Ég mun velja fyrstu aðferðina.
Athugið: Verkefnið er að þróast mjög hratt, nýjar uppfærslur eru oft gefnar út. Kannski verður ný útgáfa gefin út þegar þessari grein er lokið. Þess vegna, áður en þú lest, mæli ég með því að athuga núverandi útgáfu af Nomad í augnablikinu og hala henni niður.
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
Eftir að hafa verið pakkað upp munum við fá Nomad tvíundarskrá sem vegur 65 MB - hana verður að færa í /usr/local/bin.
Við skulum búa til gagnaskrá fyrir Nomad og breyta þjónustuskránni hennar (líklega mun hún ekki vera til í upphafi):
root@nomad-livelinux-01:~# mkdir --parents /opt/nomad
root@nomad-livelinux-01:~# nano /etc/systemd/system/nomad.service
Límdu eftirfarandi línur þar:
[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
Hins vegar erum við ekkert að flýta okkur að ræsa nomad - við höfum ekki enn búið til stillingarskrá þess:
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
Endanleg möppuuppbygging verður sem hér segir:
/etc/nomad.d/
├── nomad.hcl
└── server.hcl
Nomad.hcl skráin ætti að innihalda eftirfarandi stillingar:
datacenter = "dc1"
data_dir = "/opt/nomad"
Innihald server.hcl skráarinnar:
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
}
Ekki gleyma að breyta stillingarskránni á öðrum netþjóni - þar þarftu að breyta gildi http tilskipunarinnar.
Það síðasta á þessu stigi er að stilla Nginx fyrir umboð og setja upp http heimild. Innihald nomad.conf skráarinnar:
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ú getum við fengið aðgang að vefspjaldinu í gegnum ytra net. Tengstu og farðu á netþjónasíðuna:
Mynd 1. Listi yfir netþjóna í Nomad þyrpingunni
Báðir netþjónarnir birtast með góðum árangri á spjaldinu, við munum sjá það sama í úttakinu af stöðuskipun hirðingjahnútsins:
Mynd 2. Úttak af stöðuskipun hirðingjahnútsins
Hvað með ræðismann? Við skulum skoða. Farðu á Consul stjórnborðið, á hnútasíðuna:
Mynd 3. Listi yfir hnúta í Consul klasanum
Nú höfum við undirbúið Nomad sem starfar í samvinnu við ræðismann. Á lokastigi munum við komast að skemmtilega hlutanum: að setja upp afhendingu á Docker gámum frá Gitlab til Nomad, og einnig tala um nokkra af öðrum sérkennum þess.
Að búa til Gitlab Runner
Til að dreifa Docker-myndum á Nomad, munum við nota sérstakan hlaupara með Nomad-tvíundarskránni inni (hér, við the vegur, getum við tekið eftir öðrum eiginleikum Hashicorp forrita - hver fyrir sig eru þau ein tvöfaldur skrá). Hladdu því upp í hlauparaskrána. Við skulum búa til einfalda Dockerfile fyrir það með eftirfarandi efni:
FROM alpine:3.9
RUN apk add --update --no-cache libc6-compat gettext
COPY nomad /usr/local/bin/nomad
Í sama verkefni búum við til .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}
Fyrir vikið munum við hafa tiltæka mynd af Nomad hlauparanum í Gitlab Registry, nú getum við farið beint í verkefnageymsluna, búið til leiðslu og stillt hirðingjastarf Nomad.
Verkefnauppsetning
Byrjum á vinnuskránni fyrir Nomad. Verkefnið mitt í þessari grein verður frekar frumstætt: það mun samanstanda af einu verkefni. Innihald .gitlab-ci verður sem hér segir:
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
Hér fer dreifingin fram handvirkt, en þú getur stillt hana til að breyta innihaldi verkefnaskrárinnar. Leiðsla samanstendur af tveimur stigum: myndasamsetningu og dreifing hennar til hirðingja. Á fyrsta stigi setjum við saman bryggjumynd og ýtum henni inn í Registry okkar og á því síðara ræsum við starfið okkar í 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" {}
}
}
}
}
}
Vinsamlega athugið að ég er með einkaskrá og til að ná fram dokkumynd þarf ég að skrá mig inn á hana. Besta lausnin í þessu tilfelli er að slá inn notandanafn og lykilorð í Vault og samþætta það síðan við Nomad. Nomad styður innfæddan Vault. En fyrst skulum við setja upp nauðsynlegar reglur fyrir Nomad í Vault sjálfu; hægt er að hlaða þeim niður:
# 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ú, eftir að hafa búið til nauðsynlegar reglur, munum við bæta samþættingu við Vault í verkefnablokkinni í job.nomad skránni:
vault {
enabled = true
address = "https://vault.domain.name:8200"
token = "token"
}
Ég nota heimild eftir tákni og skrái hana beint hér, það er líka möguleiki á að tilgreina táknið sem breytu þegar ég byrja á hirðingjaumboðsmanni:
$ VAULT_TOKEN=<token> nomad agent -config /path/to/config
Nú getum við notað lyklana með Vault. Meginreglan um aðgerðir er einföld: við búum til skrá í Nomad starf sem mun geyma gildi breyta, til dæmis:
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
}
Með þessari einföldu nálgun er hægt að stilla afhendingu gáma til Nomad klasans og vinna með hann í framtíðinni. Ég mun segja að að vissu leyti hef ég samúð með Nomad - það er hentugra fyrir lítil verkefni þar sem Kubernetes getur valdið aukinni flókið og mun ekki gera sér fulla grein fyrir möguleikum sínum. Auk þess er Nomad fullkomið fyrir byrjendur - það er auðvelt að setja upp og stilla. Hins vegar, þegar ég prófa sum verkefni, lendi ég í vandræðum með fyrstu útgáfur þess - margar grunnaðgerðir eru einfaldlega ekki til staðar eða þær virka ekki rétt. Hins vegar tel ég að Nomad muni halda áfram að þróast og í framtíðinni muni það öðlast þá virkni sem allir þurfa.
Höfundur: Ilya Andreev, ritstýrt af Alexey Zhadan og Live Linux teyminu
Heimild: www.habr.com