Консулдун жардамы менен Nomad кластерин түзүү жана Gitlab менен интеграциялоо

тааныштыруу

Жакында Kubernetes популярдуулугу тездик менен өсүп жатат - барган сайын көп долбоорлор аны ишке ашырууда. Мен Nomad сыяктуу оркестрге токтолгум келди: бул HashiCorpтун башка чечимдерин колдонгон долбоорлор үчүн идеалдуу, мисалы, Vault жана Consul, жана долбоорлордун өзү инфраструктура жагынан татаал эмес. Бул материалда Nomadды орнотуу, эки түйүндү кластерге бириктирүү, ошондой эле Nomadды Gitlab менен интеграциялоо боюнча нускамалар камтылат.

Консулдун жардамы менен Nomad кластерин түзүү жана Gitlab менен интеграциялоо

Сыноочу стенд

Сыноочу стенд жөнүндө бир аз: жалпы локалдык тармакка туташтырылган 2 CPU, 4 RAM, 50 Гб SSD өзгөчөлүктөрү менен үч виртуалдык сервер колдонулат. Алардын аттары жана IP даректери:

  1. nomad-livelinux-01: 172.30.0.5
  2. nomad-livelinux-02: 172.30.0.10
  3. 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";
        }
        
}

Эми биз тышкы тармак аркылуу веб-панелге кире алабыз. Туташып, серверлер барагына өтүңүз:

Консулдун жардамы менен Nomad кластерин түзүү жана Gitlab менен интеграциялоо
Сүрөт 1. Nomad кластериндеги серверлердин тизмеси

Эки сервер тең панелде ийгиликтүү көрсөтүлдү, биз көчмөн түйүн статусунун буйругунун чыгышында бир эле нерсени көрөбүз:

Консулдун жардамы менен Nomad кластерин түзүү жана Gitlab менен интеграциялоо
Сүрөт 2. Көчмөн түйүн статусунун буйругунун чыгышы

Консул жөнүндө эмне айтууга болот? Келгиле, карап көрөлү. Консулдун башкаруу панелине, түйүндөрдүн барагына өтүңүз:
Консулдун жардамы менен Nomad кластерин түзүү жана Gitlab менен интеграциялоо
Сүрөт 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

Комментарий кошуу