Konsul ilə Nomad klasterinin qurulması və Gitlab ilə inteqrasiya

Giriş

Son zamanlar Kubernetes-in populyarlığı sürətlə artır - getdikcə daha çox layihə həyata keçirir. Mən Nomad kimi bir orkestrə toxunmaq istədim: o, artıq HashiCorp-un digər həllərindən, məsələn, Vault və Konsuldan istifadə edən layihələr üçün mükəmməldir və layihələrin özü infrastruktur baxımından mürəkkəb deyil. Bu materialda Nomad-ın quraşdırılması, iki qovşağın klasterdə birləşdirilməsi, həmçinin Nomad-ın Gitlab ilə inteqrasiyası üçün təlimatlar olacaq.

Konsul ilə Nomad klasterinin qurulması və Gitlab ilə inteqrasiya

Test stendi

Test skamyası haqqında bir az: ümumi lokal şəbəkədə birləşdirilmiş 2 CPU, 4 RAM, 50 Gb SSD xüsusiyyətləri ilə üç virtual server istifadə olunur. Onların adları və IP ünvanları:

  1. köçəri-livelinux-01: 172.30.0.5
  2. köçəri-livelinux-02: 172.30.0.10
  3. konsul-livelinux-01: 172.30.0.15

Nomad, konsulun quraşdırılması. Nomad klasterinin yaradılması

Əsas quraşdırma ilə başlayaq. Quraşdırma sadə olsa da, məqalənin bütövlüyü naminə onu təsvir edəcəyəm: o, lazım olduqda tez daxil olmaq üçün əsasən qaralama və qeydlərdən yaradılmışdır.

Təcrübəyə başlamazdan əvvəl nəzəri hissəni müzakirə edəcəyik, çünki bu mərhələdə gələcək strukturu başa düşmək vacibdir.

Bizim iki köçəri qovşağımız var və biz onları klasterdə birləşdirmək istəyirik və gələcəkdə bizə avtomatik klaster miqyası da lazım olacaq - bunun üçün bizə Konsul lazım olacaq. Bu alətlə klasterləşmə və yeni qovşaqların əlavə edilməsi çox sadə işə çevrilir: yaradılmış Nomad node Konsul agentinə qoşulur, sonra isə mövcud Nomad klasterinə qoşulur. Buna görə də, başlanğıcda biz Konsul serverini quraşdıracağıq, veb panel üçün əsas http avtorizasiyasını konfiqurasiya edəcəyik (o, standart olaraq icazəsizdir və xarici ünvandan istifadə edilə bilər), həmçinin Nomad serverlərində Konsul agentlərinin özlərini, bundan sonra biz yalnız Nomada davam edəcəyik.

HashiCorp alətlərini quraşdırmaq çox sadədir: mahiyyətcə, biz sadəcə ikili faylı zibil qovluğuna köçürür, alətin konfiqurasiya faylını quraşdırırıq və onun xidmət faylını yaradırıq.

Konsul binar faylını yükləyin və onu istifadəçinin ev kataloquna açın:

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/

İndi əlavə konfiqurasiya üçün hazır konsul binarımız var.

Konsulla işləmək üçün keygen əmrindən istifadə edərək unikal açar yaratmalıyıq:

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

Konsul konfiqurasiyasının qurulmasına keçək, aşağıdakı strukturu olan /etc/consul.d/ kataloqunu yaradaq:

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

Bootstrap kataloqunda config.json konfiqurasiya faylı olacaq - orada biz Konsul parametrlərini təyin edəcəyik. Onun məzmunu:

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

Əsas direktivlərə və onların mənalarına ayrıca baxaq:

  • Bootstrap: doğru. Yeni qovşaqların qoşulduğu halda onların avtomatik əlavə edilməsinə imkan veririk. Qeyd edim ki, biz burada gözlənilən qovşaqların dəqiq sayını göstərmirik.
  • server: doğru. Server rejimini aktivləşdirin. Bu virtual maşındakı konsul hazırda yeganə server və master kimi çıxış edəcək, Nomad's VM müştəriləri olacaq.
  • məlumat mərkəzi: dc1. Klaster yaratmaq üçün məlumat mərkəzinin adını göstərin. Həm müştərilərdə, həm də serverlərdə eyni olmalıdır.
  • şifrelemek: açarınız. Açar, eyni zamanda unikal olmalı və bütün müştərilər və serverlərdə uyğun olmalıdır. Konsul keygen əmrindən istifadə edərək yaradıldı.
  • başlamaq_qoşulmaq. Bu siyahıda əlaqənin ediləcəyi IP ünvanlarının siyahısını göstəririk. Hazırda yalnız öz ünvanımızı qoyuruq.

Bu nöqtədə əmr satırından istifadə edərək konsul işlədə bilərik:

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

Bu, indi sazlamağın yaxşı yoludur, lakin məlum səbəblərə görə bu metoddan davamlı olaraq istifadə edə bilməyəcəksiniz. Konsulu systemd vasitəsilə idarə etmək üçün xidmət faylı yaradaq:

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

consul.service faylının məzmunu:

[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 vasitəsilə Konsulu işə salın:

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

Gəlin yoxlayaq: xidmətimiz işləməlidir və konsul üzvlərinin əmrini yerinə yetirməklə serverimizi görməliyik:

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

Növbəti mərhələ: Nginx-in quraşdırılması və proksi və http avtorizasiyasının qurulması. Paket meneceri vasitəsilə nginx quraşdırırıq və /etc/nginx/sites-enabled kataloqunda aşağıdakı məzmunu olan consul.conf konfiqurasiya faylı yaradırıq:

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 faylı yaratmağı və onun üçün istifadəçi adı və parol yaratmağı unutmayın. Bu element veb panelin bizim domenimizi bilən hər kəs üçün əlçatan olmaması üçün tələb olunur. Bununla belə, Gitlab-ı qurarkən bundan imtina etməli olacağıq - əks halda tətbiqimizi Nomad-a yerləşdirə bilməyəcəyik. Layihəmdə həm Gitlab, həm də Nomad yalnız boz internetdədir, ona görə də burada belə bir problem yoxdur.

Qalan iki serverdə biz aşağıdakı təlimatlara uyğun olaraq Konsul agentlərini quraşdırırıq. İkili fayl ilə addımları təkrarlayırıq:

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/

Əvvəlki serverə bənzətməklə, /etc/consul.d konfiqurasiya faylları üçün aşağıdakı struktura malik kataloq yaradırıq:

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

config.json faylının məzmunu:

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

Dəyişiklikləri yadda saxlayın və xidmət faylını, onun məzmununu qurmağa davam edin:

/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 serverdə konsulu işə salırıq. İndi işə salındıqdan sonra nsul üzvlərində konfiqurasiya edilmiş xidməti görməliyik. Bu o demək olacaq ki, o, müştəri kimi klasterə uğurla qoşulub. Eyni şeyi ikinci serverdə də təkrarlayın və bundan sonra Nomad-ı quraşdırmağa və konfiqurasiya etməyə başlaya bilərik.

Nomad-ın daha ətraflı quraşdırılması onun rəsmi sənədlərində təsvir edilmişdir. İki ənənəvi quraşdırma üsulu var: binar faylı yükləmək və mənbədən tərtib etmək. Mən birinci üsulu seçəcəyəm.

Qeyd: Layihə çox sürətlə inkişaf edir, tez-tez yeni yeniləmələr buraxılır. Ola bilsin ki, bu məqalə tamamlanana qədər yeni versiya çıxacaq. Buna görə də oxumazdan əvvəl Nomad-ın hazırkı versiyasını yoxlamağı və onu yükləməyi məsləhət görürəm.

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

Paketi açdıqdan sonra biz 65 MB ağırlığında Nomad binar faylını alacağıq - o, /usr/local/bin-ə köçürülməlidir.

Nomad üçün məlumat kataloqu yaradaq və onun xidmət faylını redaktə edək (çox güman ki, əvvəlində mövcud olmayacaq):

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

Orada aşağıdakı sətirləri yapışdırın:

[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

Bununla belə, biz nomad-ı işə salmağa tələsmirik - onun konfiqurasiya faylını hələ yaratmamışıq:

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

Son kataloq strukturu aşağıdakı kimi olacaq:

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

nomad.hcl faylında aşağıdakı konfiqurasiya olmalıdır:

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

server.hcl faylının məzmunu:

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
}

İkinci serverdə konfiqurasiya faylını dəyişməyi unutmayın - orada http direktivinin dəyərini dəyişməli olacaqsınız.

Bu mərhələdəki son şey Nginx-i proxy etmək və http avtorizasiyasını qurmaq üçün konfiqurasiya etməkdir. nomad.conf faylının məzmunu:

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

İndi biz xarici şəbəkə vasitəsilə veb panelə daxil ola bilərik. Qoşulun və serverlər səhifəsinə keçin:

Konsul ilə Nomad klasterinin qurulması və Gitlab ilə inteqrasiya
Şəkil 1. Nomad klasterindəki serverlərin siyahısı

Hər iki server uğurla paneldə göstərilir, biz köçəri node status əmrinin çıxışında eyni şeyi görəcəyik:

Konsul ilə Nomad klasterinin qurulması və Gitlab ilə inteqrasiya
Şəkil 2. Noad node status əmrinin çıxışı

Bəs konsul? Gəlin nəzər salaq. Konsulun idarəetmə panelinə, qovşaqlar səhifəsinə keçin:
Konsul ilə Nomad klasterinin qurulması və Gitlab ilə inteqrasiya
Şəkil 3. Konsul klasterindəki qovşaqların siyahısı

İndi konsulla birlikdə işləyən bir Nomad hazırlamışıq. Son mərhələdə biz əyləncəli hissəyə keçəcəyik: Docker konteynerlərinin Gitlab-dan Nomad-a çatdırılmasını qurmaq, həmçinin onun bəzi digər fərqli xüsusiyyətləri haqqında danışmaq.

Gitlab Runner yaradılması

Docker şəkillərini Nomad-a yerləşdirmək üçün içərisində Nomad binar faylı olan ayrıca runnerdən istifadə edəcəyik (yeri gəlmişkən, Hashicorp tətbiqlərinin başqa bir xüsusiyyətini qeyd edə bilərik - ayrı-ayrılıqda onlar tək ikili fayldır). Onu runner qovluğuna yükləyin. Bunun üçün aşağıdakı məzmunlu sadə Dockerfile yaradaq:


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

Eyni layihədə biz .gitlab-ci.yml yaradırıq:

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}

Nəticədə, Gitlab Reyestrində Köçəri qaçışçısının mövcud şəklinə sahib olacağıq, indi biz birbaşa layihə deposuna gedə, Boru Kəməri yarada və Nomad-ın köçəri işini konfiqurasiya edə bilərik.

Layihənin qurulması

Nomad üçün iş faylı ilə başlayaq. Bu məqalədəki layihəm olduqca primitiv olacaq: bir vəzifədən ibarət olacaq. .gitlab-ci məzmunu aşağıdakı kimi olacaq:

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

Burada yerləşdirmə əl ilə baş verir, lakin siz onu layihə kataloqunun məzmununu dəyişdirmək üçün konfiqurasiya edə bilərsiniz. Boru kəməri iki mərhələdən ibarətdir: təsvirin yığılması və onun köçəriyə yerləşdirilməsi. Birinci mərhələdə biz doker şəklini yığırıq və onu Reyestrimizə daxil edirik, ikinci mərhələdə isə Nomad-da işimizi işə salırıq.

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

Nəzərə alın ki, mənim şəxsi reyestrim var və docker şəklini uğurla çəkmək üçün ona daxil olmalıyam. Bu vəziyyətdə ən yaxşı həll Vault-a giriş və parol daxil etmək və sonra onu Nomad ilə inteqrasiya etməkdir. Nomad yerli olaraq Vault-u dəstəkləyir. Ancaq əvvəlcə Vault-da Nomad üçün lazımi siyasətləri quraşdıraq; onları endirmək olar:

# 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

İndi lazımi siyasətləri yaratdıqdan sonra job.nomad faylındakı tapşırıq blokunda Vault ilə inteqrasiya əlavə edəcəyik:

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

Mən token ilə avtorizasiyadan istifadə edirəm və onu birbaşa burada qeydiyyatdan keçirirəm, köçəri agenti işə salarkən tokeni dəyişən kimi göstərmək seçimi də var:

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

İndi biz Vault ilə açarlardan istifadə edə bilərik. Əməliyyat prinsipi sadədir: biz Nomad işində dəyişənlərin dəyərlərini saxlayacaq bir fayl yaradırıq, məsələn:

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
}

Bu sadə yanaşma ilə siz Nomad klasterinə konteynerlərin çatdırılmasını konfiqurasiya edə və gələcəkdə onunla işləyə bilərsiniz. Deyim ki, mən Nomad-a müəyyən dərəcədə rəğbət bəsləyirəm - bu, Kubernetes-in əlavə mürəkkəblik yarada biləcəyi və bütün potensialını reallaşdıra bilməyəcəyi kiçik layihələr üçün daha uyğundur. Üstəlik, Nomad yeni başlayanlar üçün mükəmməldir - onu quraşdırmaq və konfiqurasiya etmək asandır. Bununla belə, bəzi layihələrdə sınaqdan keçirərkən onun ilkin versiyalarında problemlə qarşılaşıram - bir çox əsas funksiyalar sadəcə orada yoxdur və ya düzgün işləmir. Bununla belə, inanıram ki, “Nomad” bundan sonra da inkişaf edəcək və gələcəkdə hər kəsə lazım olan funksiyaları qazanacaq.

Müəllif: İlya Andreev, Alexey Jadan və Live Linux komandası tərəfindən redaktə edilmişdir


Mənbə: www.habr.com

Добавить комментарий