Ташкили кластери 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, ки баъд аз он кор мекунанд. мо танҳо ба Номад меравем.

Насб кардани абзорҳои 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"]
}

Биёед ба дастурҳои асосӣ ва маънои онҳо алоҳида назар андозем:

  • дастгоҳи пурборшаванда: рост. Мо ба таври худкор илова кардани гиреҳҳои навро имкон медиҳем, агар онҳо пайваст бошанд. Ман қайд мекунам, ки мо дар ин ҷо шумораи дақиқи гиреҳҳои интизориро нишон намедиҳам.
  • сервер: рост. Ҳолати серверро фаъол созед. Консул дар ин мошини виртуалӣ дар айни замон ҳамчун сервер ва устоди ягона амал мекунад, VM's Nomad мизоҷ хоҳад буд.
  • Маркази иттилоотӣ: 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-enabled мо файли конфигуратсияи 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

Пас аз кушодан, мо файли дуии Nomad-ро бо вазни 65 МБ мегирем - он бояд ба /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

Ҳарду серверҳо дар панел бомуваффақият намоиш дода мешаванд, мо дар баромади фармони node node як чизро мебинем:

Ташкили кластери Nomad бо истифода аз Консул ва ҳамгироӣ бо Gitlab
Тасвир 2. Баромади фармони ҳолати гиреҳи номард

Дар бораи консул чӣ? Биёед бубинем. Ба панели идоракунии консул, ба саҳифаи гиреҳҳо гузаред:
Ташкили кластери Nomad бо истифода аз Консул ва ҳамгироӣ бо Gitlab
Тасвир 3. Рӯйхати гиреҳҳо дар кластери консул

Ҳоло мо Nomad омода дорем, ки дар якҷоягӣ бо консул кор мекунад. Дар марҳилаи ниҳоӣ, мо ба қисми шавқовар мерасем: насб кардани интиқоли контейнерҳои Docker аз 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 тасвири дастраси давандаи Nomad хоҳем дошт, акнун мо метавонем мустақиман ба анбори лоиҳа равем, қубур созем ва кори кӯчманчини 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-ро дастгирӣ мекунад. Аммо аввал, биёед сиёсатҳои заруриро барои Nomad дар худи 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 job файл эҷод мекунем, ки арзишҳои тағирёбандаҳоро нигоҳ медорад, масалан:

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 барои шурӯъкунандагон комил аст - насб ва танзим кардани он осон аст. Аммо, ҳангоми санҷиш дар баъзе лоиҳаҳо, ман бо версияҳои аввали он ба мушкилот дучор мешавам - бисёр функсияҳои асосӣ вуҷуд надоранд ё онҳо дуруст кор намекунанд. Бо вуҷуди ин, ман бовар дорам, ки Nomad минбаъд инкишоф меёбад ва дар оянда он вазифаҳоеро, ки ба ҳама лозим аст, соҳиб мешавад.

Муаллиф: Илья Андреев, таҳрир аз ҷониби Алексей Жадан ва дастаи Live Linux


Манбаъ: will.com

Илова Эзоҳ