тааныштыруу
Жакында Kubernetes популярдуулугу тездик менен өсүп жатат - барган сайын көп долбоорлор аны ишке ашырууда. Мен Nomad сыяктуу оркестрге токтолгум келди: бул HashiCorpтун башка чечимдерин колдонгон долбоорлор үчүн идеалдуу, мисалы, Vault жана Consul, жана долбоорлордун өзү инфраструктура жагынан татаал эмес. Бул материалда Nomadды орнотуу, эки түйүндү кластерге бириктирүү, ошондой эле Nomadды Gitlab менен интеграциялоо боюнча нускамалар камтылат.
Сыноочу стенд
Сыноочу стенд жөнүндө бир аз: жалпы локалдык тармакка туташтырылган 2 CPU, 4 RAM, 50 Гб SSD өзгөчөлүктөрү менен үч виртуалдык сервер колдонулат. Алардын аттары жана IP даректери:
- nomad-livelinux-01: 172.30.0.5
- nomad-livelinux-02: 172.30.0.10
- consul-livelinux-01: 172.30.0.15
Nomad орнотуу, консул. Nomad кластерин түзүү
Негизги орнотуудан баштайлы. Орнотуу жөнөкөй болгону менен, мен аны макаланын бүтүндүгү үчүн сүрөттөп берем: ал негизи керек болгондо тез жетүү үчүн долбоорлордон жана эскертүүлөрдөн түзүлгөн.
Практиканы баштоодон мурун, биз теориялык бөлүгүн талкуулайбыз, анткени бул этапта келечектеги түзүлүштү түшүнүү маанилүү.
Бизде эки көчмөн түйүн бар жана биз аларды кластерге бириктиргибиз келет, келечекте бизге кластерди автоматтык түрдө масштабдоо керек – бул үчүн бизге консул керек. Бул куралдын жардамы менен кластерлөө жана жаңы түйүндөрдү кошуу абдан жөнөкөй маселе болуп калат: түзүлгөн Nomad түйүнү Консул агентине туташып, андан кийин учурдагы Nomad кластерине кошулат. Ошондуктан, башында Консул серверин орнотобуз, веб-панел үчүн негизги http авторизациясын конфигурациялайбыз (ал демейки боюнча уруксатсыз жана тышкы даректен кирүүгө болот), ошондой эле Консул агенттеринин өздөрүн Nomad серверлеринде, андан кийин Биз жөн гана Nomadка кетебиз.
HashiCorp куралдарын орнотуу абдан жөнөкөй: негизи, биз жөн гана бинардык файлды бин каталогуна жылдырып, куралдын конфигурация файлын орнотуп, анын кызматтык файлын түзөбүз.
Консул бинардык файлын жүктөп алып, аны колдонуучунун үй каталогуна ачыңыз:
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/
Эми бизде конфигурациялоо үчүн даяр консулдук бинардык бар.
Консул менен иштөө үчүн keygen буйругун колдонуу менен уникалдуу ачкыч түзүшүбүз керек:
root@consul-livelinux-01:~# consul keygen
Төмөнкү түзүм менен /etc/consul.d/ каталогун түзүп, Консул конфигурациясын орнотууга өтөлү:
/etc/consul.d/
├── bootstrap
│ └── config.json
Bootstrap каталогунда config.json конфигурация файлы болот - анда биз Консул орнотууларын орнотобуз. Анын мазмуну:
{
"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"]
}
Келгиле, негизги директиваларды жана алардын маанилерин өзүнчө карап көрөлү:
- жүктөгүч: чын. Жаңы түйүндөр туташкан болсо, аларды автоматтык түрдө кошууну иштетебиз. Мен бул жерде күтүлгөн түйүндөрдүн так санын көрсөтпөгөнүбүздү белгилеймин.
- Server: чын. Сервер режимин иштетүү. Бул виртуалдык машинадагы консул учурда жалгыз сервер жана мастер катары иштейт, Nomad's VM кардарлары болот.
- Текшерүү: dc1. Кластерди түзүү үчүн маалымат борборунун атын көрсөтүңүз. Ал кардарларда да, серверлерде да бирдей болушу керек.
- код: сиздин ачкычыңыз. Ачкыч, ошондой эле уникалдуу болушу керек жана бардык кардарлар менен серверлерде дал келиши керек. consul keygen буйругу менен түзүлгөн.
- баштоо_кошулуу. Бул тизмеде биз байланыш түзүлө турган IP даректердин тизмесин көрсөтөбүз. Учурда өзүбүздүн дарегибизди гана калтырабыз.
Бул учурда биз буйрук сабын колдонуп консулду иштете алабыз:
root@consul-livelinux-01:~# /usr/local/bin/consul agent -config-dir /etc/consul.d/bootstrap -ui
Бул азыр мүчүлүштүктөрдү оңдоонун жакшы жолу, бирок сиз бул ыкманы айкын себептерден улам үзгүлтүксүз колдоно албайсыз. Консулду systemd аркылуу башкаруу үчүн кызмат файлын түзөлү:
root@consul-livelinux-01:~# nano /etc/systemd/system/consul.service
consul.service файлынын мазмуну:
[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
Systemctl аркылуу Консулду ишке киргизиңиз:
root@consul-livelinux-01:~# systemctl start consul
Келгиле, текшерип көрөлү: биздин кызмат иштеп турушу керек жана консул мүчөлөрүнүн буйругун аткаруу менен биз серверибизди көрүшүбүз керек:
root@consul-livelinux:/etc/consul.d# consul members
consul-livelinux 172.30.0.15:8301 alive server 1.5.0 2 dc1 <all>
Кийинки этап: Nginx орнотуу жана прокси жана http авторизациясын орнотуу. Биз nginxти пакет менеджери аркылуу орнотобуз жана /etc/nginx/sites-иштетилген каталогдо 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";
}
}
.htpasswd файлын түзүүнү жана ал үчүн колдонуучу атын жана паролду түзүүнү унутпаңыз. Бул нерсе веб-панель биздин доменди билгендердин бардыгына жеткиликтүү болбошу үчүн талап кылынат. Бирок, Gitlab'ти орнотуп жатканда, биз мындан баш тартышыбыз керек болот - антпесе биз Nomad'га колдонмобузду жайгаштыра албайбыз. Менин долбоордо Gitlab да, Nomad да боз желеде гана, ошондуктан бул жерде мындай көйгөй жок.
Калган эки серверде биз консулдук агенттерди төмөнкү көрсөтмөлөргө ылайык орнотобуз. Биз экилик файл менен кадамдарды кайталайбыз:
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/
Мурунку серверге окшошуп, биз /etc/consul.d конфигурация файлдары үчүн төмөнкү структура менен каталог түзөбүз:
/etc/consul.d/
├── client
│ └── config.json
config.json файлынын мазмуну:
{
"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
}
Өзгөртүүлөрдү сактап, кызмат файлын, анын мазмунун орнотууга өтүңүз:
/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
Биз серверде консулду ишке киргизебиз. Эми, ишке киргизгенден кийин, биз конфигурацияланган кызматты nsul мүчөлөрүнөн көрүшүбүз керек. Бул кардар катары кластерге ийгиликтүү туташкандыгын билдирет. Ошол эле нерсени экинчи серверде кайталаъыз, андан кийин биз Nomadды орнотуп, конфигурациялай баштайбыз.
Nomadтын кененирээк орнотулушу анын расмий документтеринде баяндалат. Орнотуунун эки салттуу ыкмасы бар: бинардык файлды жүктөө жана булактан компиляция. Мен биринчи ыкманы тандайм.
пикир: Долбоор абдан тез өнүгүп жатат, жаңы жаңыртуулар көп чыгарылып турат. Балким, бул макала аяктаганга чейин жаңы версия чыгат. Ошондуктан, окуудан мурун, мен Nomadдын учурдагы версиясын текшерип, жүктөп алууну сунуштайм.
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
Пакеттен чыгаргандан кийин биз 65 МБ салмактагы Nomad бинардык файлын алабыз - ал /usr/local/binге жылдырылышы керек.
Nomad үчүн маалымат каталогун түзүп, анын кызматтык файлын түзөтөлү (ал башында жок болушу мүмкүн):
root@nomad-livelinux-01:~# mkdir --parents /opt/nomad
root@nomad-livelinux-01:~# nano /etc/systemd/system/nomad.service
Ал жерге төмөнкү саптарды чаптаңыз:
[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
Бирок, биз nomadды ишке киргизүүгө шашкан жокпуз - биз анын конфигурация файлын түзө элекпиз:
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
Каталогдун акыркы структурасы төмөнкүдөй болот:
/etc/nomad.d/
├── nomad.hcl
└── server.hcl
nomad.hcl файлы төмөнкү конфигурацияны камтышы керек:
datacenter = "dc1"
data_dir = "/opt/nomad"
server.hcl файлынын мазмуну:
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
}
Экинчи сервердеги конфигурация файлын өзгөртүүнү унутпаңыз - ал жерде сиз http директиванын маанисин өзгөртүүгө туура келет.
Бул этапта акыркы нерсе Nginxти прокси үчүн конфигурациялоо жана http авторизациясын орнотуу. nomad.conf файлынын мазмуну:
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";
}
}
Эми биз тышкы тармак аркылуу веб-панелге кире алабыз. Туташып, серверлер барагына өтүңүз:
Сүрөт 1. Nomad кластериндеги серверлердин тизмеси
Эки сервер тең панелде ийгиликтүү көрсөтүлдү, биз көчмөн түйүн статусунун буйругунун чыгышында бир эле нерсени көрөбүз:
Сүрөт 2. Көчмөн түйүн статусунун буйругунун чыгышы
Консул жөнүндө эмне айтууга болот? Келгиле, карап көрөлү. Консулдун башкаруу панелине, түйүндөрдүн барагына өтүңүз:
Сүрөт 3. Консулдук кластердеги түйүндөрдүн тизмеси
Азыр бизде Консул менен биргеликте даярдалган Nomad иштеп жатат. Акыркы этапта биз кызыктуу бөлүккө өтөбүз: Gitlabдан Nomadга Докер контейнерлерин жеткирүүнү орнотуу, ошондой эле анын башка айрым өзгөчөлүктөрү жөнүндө сүйлөшөбүз.
Gitlab Runner түзүү
Nomad'га докер сүрөттөрүн жайгаштыруу үчүн биз ичинде Nomad бинардык файлы бар өзүнчө жөө күлүктү колдонобуз (баса, бул жерде биз Hashicorp тиркемелеринин дагы бир өзгөчөлүгүн белгилей алабыз - өзүнчө алар бир бинардык файл). Аны жөө күлүк каталогуна жүктөңүз. Келгиле, ал үчүн төмөнкү мазмун менен жөнөкөй Dockerfile түзөлү:
FROM alpine:3.9
RUN apk add --update --no-cache libc6-compat gettext
COPY nomad /usr/local/bin/nomad
Ошол эле долбоордо биз .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}
Натыйжада, биз Gitlab реестринде Көчмөн жөө күлүктүн жеткиликтүү сүрөтүнө ээ болобуз, эми биз түздөн-түз долбоордун репозиторийине кирип, Pipeline түзө алабыз жана Nomad's nomad жумушун конфигурациялай алабыз.
Долбоорду орнотуу
Келиңиз, Nomad үчүн жумуш файлынан баштайлы. Бул макалада менин долбоорум абдан примитивдүү болот: ал бир тапшырмадан турат. .gitlab-ci мазмуну төмөнкүдөй болот:
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
Бул жерде жайылтуу кол менен ишке ашат, бирок сиз аны долбоордун каталогунун мазмунун өзгөртүү үчүн конфигурациялай аласыз. Түтүк эки этаптан турат: сүрөттү чогултуу жана аны көчмөнгө жайылтуу. Биринчи этапта биз докердин сүрөтүн чогултуп, аны реестрибизге киргизебиз, экинчиден биз 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" {}
}
}
}
}
}
Сураныч, менин жеке реестрим бар экенин эске алыңыз жана докердин сүрөтүн ийгиликтүү тартуу үчүн мен ага киришим керек. Бул учурда эң жакшы чечим - Vault'ка логин менен сырсөздү киргизүү жана аны Nomad менен интеграциялоо. Nomad түпкүлүгүндө Vault'ту колдойт. Бирок, адегенде, келгиле, Vault үчүн керектүү саясаттарды орнотуп алалы, аларды жүктөп алууга болот:
# 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
Эми, керектүү саясаттарды түзүп, биз Vault менен интеграцияны job.nomad файлындагы тапшырма блогуна кошобуз:
vault {
enabled = true
address = "https://vault.domain.name:8200"
token = "token"
}
Мен токен боюнча авторизацияны колдоном жана аны түздөн-түз бул жерде каттайм, көчмөн агентти баштаганда токенди өзгөрмө катары көрсөтүү мүмкүнчүлүгү да бар:
$ VAULT_TOKEN=<token> nomad agent -config /path/to/config
Эми биз Vault менен ачкычтарды колдоно алабыз. Иштөө принциби жөнөкөй: биз Nomad жумушунда өзгөрмөлөрдүн маанилерин сактай турган файл түзөбүз, мисалы:
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
}
Бул жөнөкөй ыкма менен сиз Nomad кластерине контейнерлерди жеткирүүнү конфигурациялап, келечекте аны менен иштей аласыз. Кандайдыр бир деңгээлде мен Nomadка боорум ооруйт деп айтайын - бул Kubernetes кошумча татаалдыкты жаратышы мүмкүн болгон чакан долбоорлорго ылайыктуу жана анын толук мүмкүнчүлүктөрүн ишке ашыра албайт. Мындан тышкары, Nomad үйрөнчүктөр үчүн идеалдуу — аны орнотуу жана конфигурациялоо оңой. Бирок, кээ бир долбоорлорду тестирлөөдө мен анын алгачкы версияларында көйгөйгө туш болдум - көптөгөн негизги функциялар жөн эле жок же алар туура иштебейт. Бирок, мен Nomad мындан ары да өнүгүп, келечекте баарына керектүү функцияларга ээ болот деп ишенем.
Автор: Илья Андреев, редактору Алексей Жадан жана Live Linux командасы
Source: www.habr.com