Постављање кластера Номад користећи Цонсул и интеграција са Гитлаб-ом

Увод

У последње време популарност Кубернетеса брзо расте - све више пројеката га спроводи. Желео сам да се дотакнем оркестратора као што је Номад: савршен је за пројекте који већ користе друга решења ХасхиЦорп-а, на пример, Ваулт и Цонсул, а сами пројекти нису сложени у смислу инфраструктуре. Овај материјал ће садржати упутства за инсталирање Номада, комбиновање два чвора у кластер, као и интеграцију Номада са Гитлабом.

Постављање кластера Номад користећи Цонсул и интеграција са Гитлаб-ом

Тест постоље

Мало о тест клупи: користе се три виртуелна сервера са карактеристикама 2 ЦПУ, 4 РАМ-а, 50 Гб ССД, уједињени у заједничку локалну мрежу. Њихова имена и ИП адресе:

  1. номад-ливелинук-01: КСНУМКС
  2. номад-ливелинук-02: КСНУМКС
  3. конзул-ливелинук-01: КСНУМКС

Инсталација Номада, конзул. Креирање кластера Номада

Почнимо са основном инсталацијом. Иако је подешавање било једноставно, описаћу га ради интегритета чланка: у суштини је направљен од нацрта и белешки за брзи приступ када је то потребно.

Пре него што почнемо са праксом, разговараћемо о теоријском делу, јер је у овој фази важно разумети будућу структуру.

Имамо два номадска чвора и желимо да их комбинујемо у кластер, а у будућности ће нам требати и аутоматско скалирање кластера - за ово ће нам требати Цонсул. Са овим алатом, груписање и додавање нових чворова постаје веома једноставан задатак: креирани Номад чвор се повезује са Цонсул агентом, а затим се повезује са постојећим Номад кластером. Стога ћемо на почетку инсталирати Цонсул сервер, конфигурисати основну хттп ауторизацију за веб панел (подразумевано је без ауторизације и може му се приступити на спољној адреси), као и саме Цонсул агенте на Номад серверима, након чега наставићемо само до Номада.

Инсталирање ХасхиЦорп алата је врло једноставно: у суштини, ми само преместимо бинарну датотеку у директоријум бин, подесимо конфигурациону датотеку алата и креирамо њен сервисни фајл.

Преузмите Цонсул бинарну датотеку и распакујте је у кућни директоријум корисника:

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/

Сада имамо готов конзулски бинар за даљу конфигурацију.

Да бисмо радили са Цонсул-ом, потребно је да креирамо јединствени кључ помоћу наредбе кеиген:

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

Пређимо на подешавање конфигурације Цонсул, креирајући директоријум /етц/цонсул.д/ са следећом структуром:

/etc/consul.d/
├── 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"]
}

Погледајмо главне директиве и њихова значења одвојено:

  • боотстрап: истина. Омогућавамо аутоматско додавање нових чворова ако су повезани. Напомињем да овде не наводимо тачан број очекиваних чворова.
  • сервер: истина. Омогући режим сервера. Конзул на овој виртуелној машини ће деловати као једини сервер и господар у овом тренутку, Номадов ВМ ће бити клијенти.
  • Центар за податке: дц1. Наведите име центра података за креирање кластера. Мора бити идентичан и на клијентима и на серверима.
  • шифрирање: ваш кључ. Кључ, који такође мора да буде јединствен и да се подудара на свим клијентима и серверима. Генерисано коришћењем наредбе цонсул кеиген.
  • старт_јоин. У овој листи наводимо листу ИП адреса на које ће се успоставити веза. Тренутно остављамо само своју адресу.

У овом тренутку можемо покренути цонсул користећи командну линију:

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

Ово је сада добар начин за отклањање грешака, међутим, из очигледних разлога нећете моћи да користите овај метод стално. Хајде да направимо сервисни фајл за управљање Цонсул-ом преко системд-а:

root@consul-livelinux-01:~# nano /etc/systemd/system/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

Покрените Цонсул преко системцтл:

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>

Следећа фаза: инсталирање Нгинк-а и подешавање проксија и хттп ауторизације. Инсталирамо нгинк преко менаџера пакета и у директоријуму /етц/нгинк/ситес-енаблед креирамо конфигурациону датотеку цонсул.цонф са следећим садржајем:

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

Не заборавите да креирате .хтпассвд датотеку и генеришете корисничко име и лозинку за њу. Ова ставка је неопходна како веб панел не би био доступан свима који познају наш домен. Међутим, када постављамо Гитлаб, мораћемо да напустимо ово - иначе нећемо моћи да применимо нашу апликацију на Номад. У мом пројекту, и Гитлаб и Номад су само на сивој мрежи, тако да овде нема таквог проблема.

На преостала два сервера инсталирамо Цонсул агенте према следећим упутствима. Понављамо кораке са бинарном датотеком:

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/
├── client
│   └── 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
     }

Сачувајте промене и пређите на подешавање сервисне датотеке, њеног садржаја:

/етц/системд/систем/цонсул.сервице:

[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

Покрећемо Цонсул на серверу. Сада, након покретања, требало би да видимо конфигурисану услугу у нсул члановима. То ће значити да се успешно повезао са кластером као клијент. Поновите исто на другом серверу и након тога можемо да почнемо да инсталирамо и конфигуришемо Номад.

Детаљнија инсталација Номада описана је у његовој званичној документацији. Постоје две традиционалне методе инсталације: преузимање бинарне датотеке и компајлирање из извора. Ја ћу изабрати први метод.

Приметити: Пројекат се развија веома брзо, често се објављују нове исправке. Можда ће нова верзија бити објављена до завршетка овог чланка. Стога, пре читања, препоручујем да проверите тренутну верзију Номада у овом тренутку и да је преузмете.

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 МБ - мора се преместити у /уср/лоцал/бин.

Хајде да направимо директоријум података за Номад и уредимо његов сервисни фајл (највероватније неће постојати на почетку):

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

Међутим, не журимо да покренемо номад - још нисмо направили његову конфигурациону датотеку:

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

Датотека номад.хцл треба да садржи следећу конфигурацију:

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

Садржај датотеке сервер.хцл:

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
}

Не заборавите да промените конфигурациону датотеку на другом серверу - тамо ћете морати да промените вредност хттп директиве.

Последња ствар у овој фази је конфигурисање Нгинк-а за прокси и подешавање хттп ауторизације. Садржај датотеке номад.цонф:

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. Листа сервера у кластеру Номад

Оба сервера су успешно приказана на панелу, видећемо исту ствар у излазу команде статус номад ноде:

Постављање кластера Номад користећи Цонсул и интеграција са Гитлаб-ом
Слика 2. Излаз команде статуса номадског чвора

Шта је са Конзулом? Хајде да погледамо. Идите на контролну таблу Цонсул, на страницу чворова:
Постављање кластера Номад користећи Цонсул и интеграција са Гитлаб-ом
Слика 3. Листа чворова у Цонсул кластеру

Сада имамо припремљеног Номада који ради у сарадњи са Конзулом. У завршној фази, доћи ћемо до забавног дела: подешавања испоруке Доцкер контејнера од Гитлаба до Номада, а такође ћемо говорити о неким од његових других карактеристичних карактеристика.

Креирање Гитлаб Руннер-а

Да бисмо поставили доцкер слике у Номад, користићемо посебан покретач са Номад бинарном датотеком унутра (овде, узгред, можемо приметити још једну особину Хасхицорп апликација - појединачно су једна бинарна датотека). Отпремите га у директоријум покретача. Хајде да направимо једноставан Доцкерфиле за њега са следећим садржајем:


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

У истом пројекту креирамо .гитлаб-ци.имл:

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}

Као резултат тога, имаћемо доступну слику Номад тркача у Гитлаб регистру, сада можемо да идемо директно у репозиторијум пројекта, креирамо цевовод и конфигуришемо Номадов номадски посао.

Подешавање пројекта

Почнимо са досијеом посла за Номад. Мој пројекат у овом чланку ће бити прилично примитиван: састојаће се од једног задатка. Садржај .гитлаб-ци ће бити следећи:

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

Овде се имплементација одвија ручно, али можете је конфигурисати да промени садржај директоријума пројекта. Пипелине се састоји од две фазе: састављање слике и њено постављање на номад. У првој фази састављамо доцкер слику и гурамо је у наш регистар, а у другој покрећемо наш посао у Номаду.

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

Имајте на уму да имам приватни регистар и да бих успешно извукао доцкер слику, морам да се пријавим на њега. Најбоље решење у овом случају је да унесете логин и лозинку у Ваулт, а затим их интегришете са Номадом. Номад изворно подржава Ваулт. Али прво, хајде да инсталирамо потребне смернице за Номад у самом трезору; могу се преузети:

# 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 {
  enabled = true
  address = "https://vault.domain.name:8200"
  token = "token"
}

Користим ауторизацију по токену и региструјем је директно овде, постоји и опција да се токен наведе као променљива при покретању номад агента:

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

Сада можемо да користимо кључеве са Ваулт-ом. Принцип рада је једноставан: креирамо датотеку у Номад послу која ће чувати вредности променљивих, на пример:

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
}

Овим једноставним приступом можете конфигурисати испоруку контејнера у Номад кластер и радити са њим у будућности. Рећи ћу да у извесној мери саосећам са Номадом - он је погоднији за мале пројекте где Кубернетес може изазвати додатну сложеност и неће остварити свој пуни потенцијал. Осим тога, Номад је савршен за почетнике — лако се инсталира и конфигурише. Међутим, када тестирам неке пројекте, наилазим на проблем са његовим раним верзијама - многе основне функције једноставно не постоје или не раде исправно. Ипак, верујем да ће Номад наставити да се развија и да ће у будућности добијати функције које су свима потребне.

Аутор: Иља Андреев, уредник Алексеј Жадан и Ливе Линук тим


Извор: ввв.хабр.цом

Додај коментар