Konsul yordamida Nomad klasterini o'rnatish va Gitlab bilan integratsiya

kirish

So'nggi paytlarda Kubernetesning mashhurligi tez sur'atlar bilan o'sib bormoqda - tobora ko'proq loyihalar uni amalga oshirmoqda. Men Nomad kabi orkestrga tegmoqchi edim: u HashiCorp-ning boshqa echimlaridan foydalanadigan loyihalar uchun juda mos keladi, masalan, Vault va Konsul va loyihalarning o'zi infratuzilma nuqtai nazaridan murakkab emas. Ushbu materialda Nomad-ni o'rnatish, ikkita tugunni klasterga birlashtirish, shuningdek Nomad-ni Gitlab bilan integratsiya qilish bo'yicha ko'rsatmalar mavjud.

Konsul yordamida Nomad klasterini o'rnatish va Gitlab bilan integratsiya

Sinov stend

Sinov dastgohi haqida bir oz: umumiy mahalliy tarmoqqa birlashtirilgan 2 protsessor, 4 RAM, 50 Gb SSD xususiyatlariga ega uchta virtual serverdan foydalaniladi. Ularning nomlari va IP manzillari:

  1. ko'chmanchi-livelinux-01: 172.30.0.5
  2. ko'chmanchi-livelinux-02: 172.30.0.10
  3. konsul-livelinux-01: 172.30.0.15

Nomadning o'rnatilishi, konsul. Nomad klasterini yaratish

Keling, asosiy o'rnatishdan boshlaylik. O'rnatish oddiy bo'lsa-da, maqolaning yaxlitligi uchun men buni tasvirlab beraman: u kerak bo'lganda tezkor kirish uchun asosan qoralama va eslatmalardan yaratilgan.

Amaliyotni boshlashdan oldin biz nazariy qismni muhokama qilamiz, chunki bu bosqichda kelajakdagi tuzilmani tushunish muhimdir.

Bizda ikkita ko'chmanchi tugun bor va biz ularni klasterga birlashtirmoqchimiz va kelajakda bizga avtomatik klaster miqyosi ham kerak bo'ladi - buning uchun bizga konsul kerak bo'ladi. Ushbu vosita yordamida klasterlash va yangi tugunlarni qo'shish juda oddiy vazifaga aylanadi: yaratilgan Nomad tuguni Konsul agentiga ulanadi, keyin esa mavjud Nomad klasteriga ulanadi. Shuning uchun, boshida biz Konsul serverini o'rnatamiz, veb-panel uchun asosiy http avtorizatsiyasini sozlaymiz (u sukut bo'yicha ruxsatsiz va tashqi manzildan foydalanish mumkin), shuningdek Nomad serverlarida Konsul agentlarining o'zlari, shundan so'ng. biz faqat Nomadga o'tamiz.

HashiCorp vositalarini o'rnatish juda oddiy: asosan biz ikkilik faylni bin katalogiga o'tkazamiz, asbobning konfiguratsiya faylini o'rnatamiz va uning xizmat faylini yaratamiz.

Konsul ikkilik faylini yuklab oling va uni foydalanuvchining uy katalogiga oching:

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/

Endi bizda keyingi konfiguratsiya uchun tayyor konsul binari bor.

Konsul bilan ishlash uchun keygen buyrug'i yordamida noyob kalit yaratishimiz kerak:

root@consul-livelinux-01:~# consul keygen

Keling, quyidagi tuzilishga ega /etc/consul.d/ katalogini yaratib, Konsul konfiguratsiyasini o'rnatishga o'tamiz:

/etc/consul.d/
├── bootstrap
│   └── config.json

Bootstrap katalogida config.json konfiguratsiya fayli bo'ladi - unda biz Konsul sozlamalarini o'rnatamiz. Uning tarkibi:

{
"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"]
}

Keling, asosiy ko'rsatmalar va ularning ma'nolarini alohida ko'rib chiqaylik:

  • yuklash: rost. Agar ular ulangan bo'lsa, biz yangi tugunlarni avtomatik qo'shishni yoqamiz. Shuni ta'kidlash kerakki, biz bu erda kutilgan tugunlarning aniq sonini ko'rsatmayapmiz.
  • server: rost. Server rejimini yoqing. Ushbu virtual mashinadagi konsul hozirda yagona server va master vazifasini bajaradi, Nomad's VM mijozlari bo'ladi.
  • ma'lumotlar markazi: dc1. Klaster yaratish uchun ma'lumotlar markazi nomini belgilang. U mijozlar va serverlarda bir xil bo'lishi kerak.
  • shifrlash: sizning kalitingiz. Kalit, shuningdek, noyob bo'lishi va barcha mijozlar va serverlarda mos kelishi kerak. Konsul keygen buyrug'i yordamida yaratilgan.
  • start_join. Ushbu ro'yxatda biz ulanish amalga oshiriladigan IP manzillar ro'yxatini ko'rsatamiz. Ayni paytda biz faqat o'z manzilimizni qoldiramiz.

Ushbu nuqtada biz konsulni buyruq qatori yordamida ishga tushirishimiz mumkin:

root@consul-livelinux-01:~# /usr/local/bin/consul agent -config-dir /etc/consul.d/bootstrap -ui

Bu hozir nosozliklarni tuzatishning yaxshi usuli, ammo aniq sabablarga ko'ra siz bu usuldan doimiy ravishda foydalana olmaysiz. Konsulni systemd orqali boshqarish uchun xizmat faylini yarataylik:

root@consul-livelinux-01:~# nano /etc/systemd/system/consul.service

consul.service faylining mazmuni:

[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 orqali konsulni ishga tushiring:

root@consul-livelinux-01:~# systemctl start consul

Keling, tekshirib ko'ramiz: bizning xizmatimiz ishlayotgan bo'lishi kerak va konsul a'zolari buyrug'ini bajarish orqali biz serverimizni ko'rishimiz kerak:

root@consul-livelinux:/etc/consul.d# consul members
consul-livelinux    172.30.0.15:8301  alive   server  1.5.0  2         dc1  <all>

Keyingi bosqich: Nginx-ni o'rnatish va proksi-server va http avtorizatsiyasini sozlash. Biz nginx-ni paket menejeri orqali o'rnatamiz va /etc/nginx/sites-enabled katalogida quyidagi tarkibga ega consul.conf konfiguratsiya faylini yaratamiz:

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 faylini yaratishni va u uchun foydalanuvchi nomi va parolni yaratishni unutmang. Ushbu element veb-panel bizning domenimizni biladigan har bir kishi uchun mavjud bo'lmasligi uchun talab qilinadi. Biroq, Gitlab-ni o'rnatishda biz bundan voz kechishimiz kerak - aks holda biz dasturimizni Nomad-ga joylashtira olmaymiz. Mening loyihamda Gitlab ham, Nomad ham faqat kulrang tarmoqda, shuning uchun bu erda bunday muammo yo'q.

Qolgan ikkita serverda biz quyidagi ko'rsatmalarga muvofiq Konsul agentlarini o'rnatamiz. Ikkilik fayl bilan amallarni takrorlaymiz:

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/

Oldingi serverga o'xshab, biz /etc/consul.d konfiguratsiya fayllari uchun quyidagi tuzilishga ega katalog yaratamiz:

/etc/consul.d/
├── client
│   └── config.json

config.json fayli tarkibi:

{
    "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
     }

O'zgarishlarni saqlang va xizmat faylini, uning mazmunini sozlashga o'ting:

/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

Biz serverda konsulni ishga tushiramiz. Endi, ishga tushirilgandan so'ng, biz nsul a'zolarida sozlangan xizmatni ko'rishimiz kerak. Bu mijoz sifatida klasterga muvaffaqiyatli ulanganligini anglatadi. Ikkinchi serverda ham xuddi shunday takrorlang va shundan so'ng biz Nomad-ni o'rnatish va sozlashni boshlashimiz mumkin.

Nomad-ning batafsil o'rnatilishi uning rasmiy hujjatlarida tasvirlangan. Ikkita an'anaviy o'rnatish usuli mavjud: ikkilik faylni yuklab olish va manbadan kompilyatsiya qilish. Men birinchi usulni tanlayman.

nota: Loyiha juda tez rivojlanmoqda, yangi yangilanishlar tez-tez chiqariladi. Ehtimol, ushbu maqola tugashi bilan yangi versiya chiqariladi. Shuning uchun, o'qishdan oldin, men hozirda Nomadning joriy versiyasini tekshirishni va uni yuklab olishni tavsiya qilaman.

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

Paketni ochgandan so'ng, biz og'irligi 65 MB bo'lgan Nomad ikkilik faylini olamiz - u /usr/local/bin-ga ko'chirilishi kerak.

Keling, Nomad uchun ma'lumotlar katalogini yaratamiz va uning xizmat faylini tahrirlaymiz (u boshida mavjud bo'lmasligi mumkin):

root@nomad-livelinux-01:~# mkdir --parents /opt/nomad
root@nomad-livelinux-01:~# nano /etc/systemd/system/nomad.service

U erga quyidagi qatorlarni joylashtiring:

[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

Biroq, biz nomadni ishga tushirishga shoshilmayapmiz - biz hali uning konfiguratsiya faylini yaratmadik:

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

Yakuniy katalog tuzilishi quyidagicha bo'ladi:

/etc/nomad.d/
├── nomad.hcl
└── server.hcl

nomad.hcl fayli quyidagi konfiguratsiyani o'z ichiga olishi kerak:

datacenter = "dc1"
data_dir = "/opt/nomad"

server.hcl faylining tarkibi:

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
}

Ikkinchi serverdagi konfiguratsiya faylini o'zgartirishni unutmang - u erda http direktivasi qiymatini o'zgartirishingiz kerak bo'ladi.

Ushbu bosqichdagi oxirgi narsa Nginx-ni proksi-server uchun sozlash va http avtorizatsiyasini sozlashdir. nomad.conf faylining tarkibi:

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";
        }
        
}

Endi biz tashqi tarmoq orqali veb-panelga kirishimiz mumkin. Ulang va serverlar sahifasiga o'ting:

Konsul yordamida Nomad klasterini o'rnatish va Gitlab bilan integratsiya
Rasm 1. Nomad klasteridagi serverlar ro'yxati

Ikkala server ham panelda muvaffaqiyatli ko'rsatiladi, biz ko'chmanchi tugun holati buyrug'ining chiqishida bir xil narsani ko'ramiz:

Konsul yordamida Nomad klasterini o'rnatish va Gitlab bilan integratsiya
Rasm 2. Nomad node status buyrug'ining chiqishi

Konsul haqida nima deyish mumkin? Keling, ko'rib chiqaylik. Konsul boshqaruv paneliga, tugunlar sahifasiga o'ting:
Konsul yordamida Nomad klasterini o'rnatish va Gitlab bilan integratsiya
Rasm 3. Konsul klasteridagi tugunlar ro'yxati

Endi bizda konsul bilan hamkorlikda ishlaydigan tayyor Nomad bor. Yakuniy bosqichda biz qiziqarli qismga o'tamiz: Docker konteynerlarini Gitlab-dan Nomad-ga yetkazib berishni sozlash, shuningdek, uning boshqa o'ziga xos xususiyatlari haqida gapirish.

Gitlab Runner yaratish

Nomad-ga docker tasvirlarini joylashtirish uchun biz ichida Nomad ikkilik fayli bo'lgan alohida runnerdan foydalanamiz (bu erda, aytmoqchi, Hashicorp ilovalarining yana bir xususiyatini qayd etishimiz mumkin - alohida-alohida ular bitta ikkilik fayl). Uni runner katalogiga yuklang. Buning uchun quyidagi tarkibga ega oddiy Dockerfile yarataylik:


FROM alpine:3.9
RUN apk add --update --no-cache libc6-compat gettext
COPY nomad /usr/local/bin/nomad

Xuddi shu loyihada biz .gitlab-ci.yml ni yaratamiz:

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}

Natijada, biz Gitlab registrida Nomad yuguruvchisining mavjud tasviriga ega bo'lamiz, endi biz to'g'ridan-to'g'ri loyiha omboriga o'tishimiz, quvur liniyasini yaratishimiz va Nomadning ko'chmanchi ishini sozlashimiz mumkin.

Loyihani sozlash

Keling, Nomad uchun ish faylidan boshlaylik. Ushbu maqoladagi mening loyiham juda ibtidoiy bo'ladi: u bitta vazifadan iborat bo'ladi. .gitlab-ci tarkibi quyidagicha bo'ladi:

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

Bu erda joylashtirish qo'lda amalga oshiriladi, lekin siz uni loyiha katalogining mazmunini o'zgartirish uchun sozlashingiz mumkin. Quvur ikki bosqichdan iborat: tasvirni yig'ish va uni ko'chmanchiga joylashtirish. Birinchi bosqichda biz docker tasvirini yig'amiz va uni registrimizga joylashtiramiz, ikkinchidan esa Nomadda ishimizni boshlaymiz.

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" {}
                }
            }
        }
    }
}

E'tibor bering, mening shaxsiy registrim bor va docker tasvirini muvaffaqiyatli olish uchun unga kirishim kerak. Bu holda eng yaxshi yechim Vault-ga login va parolni kiritish va keyin uni Nomad bilan integratsiya qilishdir. Nomad aslida Vault-ni qo'llab-quvvatlaydi. Lekin birinchi navbatda, Nomad uchun kerakli siyosatlarni Vault-ning o'zida o'rnatamiz; ularni yuklab olish mumkin:

# 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

Endi, kerakli siyosatlarni yaratgandan so'ng, biz Vault bilan integratsiyani job.nomad faylidagi vazifalar blokiga qo'shamiz:

vault {
  enabled = true
  address = "https://vault.domain.name:8200"
  token = "token"
}

Men token bo'yicha avtorizatsiyadan foydalanaman va uni to'g'ridan-to'g'ri shu yerda ro'yxatdan o'tkazaman, ko'chmanchi agentni ishga tushirishda tokenni o'zgaruvchi sifatida ko'rsatish imkoniyati ham mavjud:

$ VAULT_TOKEN=<token> nomad agent -config /path/to/config

Endi biz Vault bilan kalitlardan foydalanishimiz mumkin. Ishlash printsipi oddiy: biz Nomad ishida o'zgaruvchilar qiymatlarini saqlaydigan fayl yaratamiz, masalan:

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
}

Ushbu oddiy yondashuv bilan siz konteynerlarni Nomad klasteriga yetkazib berishni sozlashingiz va kelajakda u bilan ishlashingiz mumkin. Aytmoqchimanki, men Nomadga ma'lum darajada hamdardman - bu Kubernetes qo'shimcha murakkablikni keltirib chiqarishi mumkin bo'lgan va o'z imkoniyatlarini to'liq amalga oshira olmaydigan kichik loyihalar uchun ko'proq mos keladi. Bundan tashqari, Nomad yangi boshlanuvchilar uchun juda mos — uni o‘rnatish va sozlash oson. Biroq, ba'zi loyihalarni sinovdan o'tkazayotganda, men uning dastlabki versiyalarida muammoga duch kelaman - ko'plab asosiy funktsiyalar mavjud emas yoki ular to'g'ri ishlamaydi. Biroq, men ishonamanki, Nomad rivojlanishda davom etadi va kelajakda u hamma uchun zarur bo'lgan funktsiyalarga ega bo'ladi.

Muallif: Ilya Andreev, Aleksey Jadan va Live Linux jamoasi tomonidan tahrirlangan


Manba: www.habr.com

a Izoh qo'shish