Consul көмегімен Nomad кластерін орнату және Gitlab-пен интеграциялау

Кіріспе

Жақында Kubernetes-тің танымалдығы тез өсуде - оны көбірек жобалар жүзеге асыруда. Мен Nomad сияқты оркестрге тоқталғым келді: бұл HashiCorp басқа шешімдерін қолданатын жобалар үшін өте қолайлы, мысалы, Vault және Consul, және жобалардың өзі инфрақұрылым тұрғысынан күрделі емес. Бұл материалда Nomad орнату, екі түйінді кластерге біріктіру, сондай-ақ Nomad-ты Gitlab-пен біріктіру нұсқаулары болады.

Consul көмегімен Nomad кластерін орнату және Gitlab-пен интеграциялау

сынақ стенді

Сынақ үстелі туралы аздап: жалпы жергілікті желіге біріктірілген 2 процессор, 4 жедел жады, 50 Гб SSD сипаттамалары бар үш виртуалды сервер қолданылады. Олардың аттары мен IP мекенжайлары:

  1. nomad-livelinux-01: 172.30.0.5
  2. nomad-livelinux-02: 172.30.0.10
  3. консул-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"]
}

Негізгі директиваларды және олардың мағыналарын бөлек қарастырайық:

  • жүктеу: шын. Егер олар қосылған болса, біз жаңа түйіндерді автоматты түрде қосуды қосамыз. Мен мұнда күтілетін түйіндердің нақты санын көрсетпейтінімізді ескертемін.
  • сервер: шын. Сервер режимін қосыңыз. Осы виртуалды машинадағы консул қазіргі уақытта жалғыз сервер және мастер ретінде әрекет етеді, 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";
        }
        
}

Енді біз сыртқы желі арқылы веб-панельге қол жеткізе аламыз. Қосылыңыз және серверлер бетіне өтіңіз:

Consul көмегімен Nomad кластерін орнату және Gitlab-пен интеграциялау
Сурет 1. Nomad кластеріндегі серверлер тізімі

Екі сервер де панельде сәтті көрсетілді, біз көшпенді түйін күйі пәрменінің шығысында бірдей нәрсені көреміз:

Consul көмегімен Nomad кластерін орнату және Gitlab-пен интеграциялау
Сурет 2. Көшпелі түйін күйі командасының шығысы

Консул ше? Қарап көрейік. Консулдың басқару тақтасына, түйіндер бетіне өтіңіз:
Consul көмегімен Nomad кластерін орнату және Gitlab-пен интеграциялау
Сурет 3. Консул кластеріндегі түйіндер тізімі

Қазір бізде Консулмен бірігіп жұмыс істейтін дайын Nomad бар. Соңғы кезеңде біз қызықты бөлікке өтеміз: Gitlab-тен Nomad-қа Docker контейнерлерін жеткізуді орнату, сонымен қатар оның басқа да ерекше ерекшеліктері туралы сөйлесеміз.

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 реестрінде бізде Nomad жүгірушісінің қол жетімді кескіні болады, енді біз тікелей жоба репозиторийіне өтіп, 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 ішіне Nomad үшін қажетті саясаттарды орнатайық, оларды жүктеп алуға болады:

# 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

Енді қажетті саясаттарды жасағаннан кейін біз job.nomad файлындағы тапсырмалар блогында Vault интеграциясын қосамыз:

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-қа белгілі бір дәрежеде жанашыр екенімді айтайын - бұл Кубернетес қосымша күрделілік тудыруы мүмкін және оның әлеуетін толық іске асырмайтын шағын жобалар үшін қолайлы. Сонымен қатар, Nomad жаңадан бастаушылар үшін өте қолайлы — оны орнату және конфигурациялау оңай. Дегенмен, кейбір жобаларда тестілеу кезінде мен оның бастапқы нұсқаларында мәселеге тап болдым - көптеген негізгі функциялар жай жоқ немесе олар дұрыс жұмыс істемейді. Дегенмен, «Номад» одан әрі дамып, болашақта барлығына қажетті функцияларды иеленетініне сенемін.

Авторы: Илья Андреев, өңдеген Алексей Жадан және Live Linux командасы


Ақпарат көзі: www.habr.com

пікір қалдыру