Sazkirina komek Nomad bi karanîna Konsul û yekbûna bi Gitlab re

Pîrozbahiyê

Di van demên dawî de, populerbûna Kubernetes bi lez zêde dibe - bêtir û bêtir proje wê bicîh dikin. Min xwest ez dest bavêjim orkestratorek mîna Nomad: ew ji bo projeyên ku berê çareseriyên din ên HashiCorp bikar tînin, mînakî Vault û Konsul, bêkêmasî ye, û proje bixwe di warê binesaziyê de ne tevlihev in. Di vê materyalê de dê rêwerzên ji bo sazkirina Nomad, berhevkirina du girêkan di komekê de, û her weha yekkirina Nomad bi Gitlab re hebe.

Sazkirina komek Nomad bi karanîna Konsul û yekbûna bi Gitlab re

Stand testê

Piçekî di derbarê qonaxa ceribandinê de: sê serverên virtual bi taybetmendiyên 2 CPU, 4 RAM, 50 Gb SSD, di nav tora herêmî ya hevpar de têne yek kirin. Nav û navnîşanên IP-ya wan:

  1. nomad-livelinux-01: 172.30.0.5
  2. nomad-livelinux-02: 172.30.0.10
  3. konsul-livelinux-01: 172.30.0.15

Sazkirina Nomad, Konsul. Çêkirina koma Koçeran

Ka em bi sazkirina bingehîn dest pê bikin. Her çend sazkirin hêsan bû jî, ez ê ji bo yekrêziya gotarê diyar bikim: ew di bingeh de ji pêşnûme û nîşeyan ji bo gihîştina bilez dema ku hewce bike hate afirandin.

Berî ku em dest bi pratîkê bikin, em ê beşa teorîk nîqaş bikin, ji ber ku di vê qonaxê de girîng e ku meriv avahiya pêşerojê fam bike.

Du girêkên me yên koçerî hene û em dixwazin wan di komekê de bi hev re bikin, û di pêşerojê de jî em ê hewceyê pîvandina komê ya otomatîkî bikin - ji bo vê yekê em ê hewceyê Konsulê bibin. Bi vê amûrê, komkirin û lê zêdekirina girêkên nû dibe karekî pir hêsan: girêka Nomad a hatî afirandin bi nûnerê Konsul ve girêdide, û dûv re bi koma Nomad a heyî ve tê girêdan. Ji ber vê yekê, di destpêkê de em ê servera Konsulê saz bikin, destûrnameya http ya bingehîn ji bo panela malperê mîheng bikin (ew ji hêla xwerû bê destûr e û dikare li navnîşanek derveyî were gihîştin), û her weha nûnerên Konsul bixwe li ser serverên Nomad, piştî wê em ê tenê derbasî Koçeriyê bibin.

Sazkirina amûrên HashiCorp pir hêsan e: di bingeh de, em tenê pelê binaryê bar dikin pelrêça bin, pelê veavakirina amûrê saz dikin û pelê karûbarê wê diafirînin.

Pelê binary Consul dakêşin û wê di pelrêça malê ya bikarhêner de vekin:

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/

Naha me ji bo veavakirina bêtir konsulek binaryek amade heye.

Ji bo ku em bi Konsul re bixebitin, pêdivî ye ku em bi karanîna fermana keygen kilîteyek yekta biafirînin:

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

Werin em biçin sazkirina veavakirina Konsulê, pelrêçek /etc/consul.d/ bi avahiyeke jêrîn biafirînin:

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

Pelrêça bootstrap dê pelê veavakirinê config.json hebe - tê de em ê mîhengên Konsulê saz bikin. Naveroka wê:

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

Ka em li rêwerzên sereke û wateyên wan cuda binihêrin:

  • bootstrap: rast. Em lêzêdekirina otomatîkî ya girêkên nû çalak dikin heke ew girêdayî bin. Ez bala xwe didim ku em li vir hejmara rast a girêkên bendewarî destnîşan nakin.
  • server: rast. Moda serverê çalak bike. Konsulê li ser vê makîneya virtual dê di vê gavê de wekî serverek yekane û master tevbigere, VM-ya Nomad dê bibe xerîdar.
  • datacenter: dc1. Navê navenda daneyê diyar bikin ku komê çêbikin. Pêdivî ye ku ew hem li ser xerîdar û hem jî li ser serveran wekhev be.
  • encrypt: kilîta te. Mifteya, ku divê di heman demê de yekta be û li ser hemî xerîdar û pêşkêşkeran bihevre be. Bi karanîna fermana konsulê keygen ve hatî çêkirin.
  • start_join. Di vê navnîşê de em navnîşek navnîşanên IP-ê yên ku dê pêwendiya wan çêbibe destnîşan dikin. Vê gavê em tenê navnîşana xwe dihêlin.

Di vê xalê de em dikarin konsulê bi karanîna rêzika fermanê bimeşînin:

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

Ev rêgezek baş e ku meriv naha xelet bike, lêbelê, hûn ê nikaribin ji ber sedemên diyar vê rêbazê li ser bingehek domdar bikar bînin. Ka em pelê karûbarê biafirînin da ku Konsul bi riya systemd-ê birêve bibin:

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

Naveroka pelê 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

Destpêkirina Konsul bi rêya systemctl:

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

Werin em kontrol bikin: Divê karûbarê me were xebitandin, û bi pêkanîna fermana endamên konsulê divê em servera xwe bibînin:

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

Qonaxa din: sazkirina Nginx û sazkirina destûrnameya proxy û http. Em nginx-ê bi navgîniya gerînendeyê pakêtê saz dikin û di pelrêça /etc/nginx/sites-enabled de em pelek veavakirinê consul.conf bi naverokên jêrîn diafirînin:

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

Ji bîr nekin ku pelek .htpasswd biafirînin û jê re navek bikarhêner û şîfreyek çêbikin. Ev tişt pêdivî ye ku panela malperê ji her kesê ku domaina me dizane re peyda nebe. Lêbelê, dema sazkirina Gitlab-ê, em ê neçar bimînin ku dev ji vê yekê berdin - wekî din em ê nikaribin serîlêdana xwe li Nomad bi cih bikin. Di projeya min de, hem Gitlab û hem jî Nomad tenê li ser tevna gewr in, ji ber vê yekê li vir pirsgirêkek wusa tune.

Li ser du serverên mayî em li gorî rêwerzên jêrîn nûnerên Konsul saz dikin. Em gavan bi pelê binary re dubare dikin:

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/

Li gorî pêşkêşkara berê, em pelrêçek ji bo pelên veavakirinê /etc/consul.d bi strukturek jêrîn diafirînin:

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

Naveroka pelê 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
     }

Guhertinan hilînin û biçin sazkirina pelê karûbarê, naveroka wê:

/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

Em konsulê li ser serverê didin destpêkirin. Naha, piştî destpêkirinê, divê em karûbarê mîhengkirî di endamên nsul de bibînin. Ev tê wê wateyê ku ew bi serfirazî wekî xerîdar bi komê ve girêdayî ye. Heman tişt li ser servera duyemîn dubare bikin û piştî wê em dikarin dest bi sazkirin û mîhengkirina Nomad bikin.

Sazkirina berfirehtir a Nomad di belgeya wê ya fermî de tête diyar kirin. Du rêbazên sazkirinê yên kevneşopî hene: daxistina pelek binary û berhevkirina ji çavkaniyê. Ez ê rêbaza yekem hilbijêrin.

bingotin: Proje pir zû pêş dikeve, nûvekirinên nû pir caran têne berdan. Dibe ku heya ku ev gotar qediya guhertoyek nû were berdan. Ji ber vê yekê, berî xwendinê, ez pêşniyar dikim ku guhertoya heyî ya Nomad niha kontrol bikin û wê dakêşin.

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

Piştî pakkirinê, em ê pelek binary Nomad bi giraniya 65 MB bistînin - divê ew li /usr/local/bin were veguheztin.

Ka em pelrêça daneyê ji bo Nomad biafirînin û pelê karûbarê wê biguherînin (bi îhtîmalek mezin ew ê di destpêkê de nebe):

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

Rêzên jêrîn li wir binivîsin:

[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

Lêbelê, em ji bo destpêkirina nomadê lez nakin - me hîn pelê veavakirina wê neafirandiye:

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

Struktura pelrêça paşîn dê wiha be:

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

Di pelê nomad.hcl de divê veavakirina jêrîn hebe:

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

Naveroka pelê 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
}

Ji bîr nekin ku pelê mîhengê li ser servera duyemîn biguhezînin - li wir hûn ê hewce ne ku nirxa rêbernameya http biguhezînin.

Tişta paşîn di vê qonaxê de ev e ku meriv Nginx-ê ji bo proxykirin û sazkirina destûrnameya http-ê mîheng bike. Naveroka pelê 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";
        }
        
}

Naha em dikarin bi riya torgilokek derveyî xwe bigihînin panela malperê. Têkevin û biçin rûpela serverê:

Sazkirina komek Nomad bi karanîna Konsul û yekbûna bi Gitlab re
Wêne 1. Lîsteya pêşkêşkerên di koma Nomad de

Her du server di panelê de bi serfirazî têne xuyang kirin, em ê heman tiştî di derana fermana rewşa noda nomad de bibînin:

Sazkirina komek Nomad bi karanîna Konsul û yekbûna bi Gitlab re
Wêne 2. Derketina fermana rewşa nodê koçer

Li ser Konsul? Ka em lê binêrin. Biçe panela kontrolê ya Konsulê, li rûpela nodes:
Sazkirina komek Nomad bi karanîna Konsul û yekbûna bi Gitlab re
Wêne 3. Lîsteya girêkên di koma Konsulê de

Niha me koçerek amade kiriye ku bi konsulê re dixebite. Di qonaxa paşîn de, em ê biçin beşa kêfê: sazkirina radestkirina konteynerên Docker ji Gitlab bo Nomad, û her weha behsa hin taybetmendiyên wê yên din ên cihêreng.

Afirandina Gitlab Runner

Ji bo bicîhkirina wêneyên docker li Nomad, em ê di hundurê pelê binaryê Nomad de rêvekek veqetandî bikar bînin (li vir, bi awayê, em dikarin taybetmendiyek din a serîlêdanên Hashicorp-ê destnîşan bikin - bixwe ew pelek yekane binary in). Wê li pelrêça runner barkirin. Ka em ji bo wê bi naveroka jêrîn Dockerfilek hêsan biafirînin:


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

Di heman projeyê de em .gitlab-ci.yml diafirînin:

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}

Wekî encamek, em ê di Registry Gitlab de wêneyek berdest a Nomad bezê hebin, naha em dikarin rasterast biçin depoya projeyê, Pipeline biafirînin û karê nomadê yê Nomad mîheng bikin.

Sazkirina projeyê

Ka em bi dosyaya kar ji bo Nomad dest pê bikin. Projeya min di vê gotarê de dê pir primitive be: ew ê ji yek peywirê pêk were. Naveroka .gitlab-ci dê wiha be:

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

Li vir bicihkirin bi destan pêk tê, lê hûn dikarin wê mîheng bikin da ku naveroka pelrêça projeyê biguhezîne. Pipeline ji du qonaxan pêk tê: kombûna wêneyê û şandina wê ya koçer. Di qonaxa yekem de, em wêneyek dokerê berhev dikin û wê di Registry xwe de dihêlin, û di ya duyemîn de jî em karê xwe li Nomad dest pê dikin.

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

Ji kerema xwe not bikin ku min qeydek taybet heye û ji bo ku ez wêneyek dokerê bi serfirazî bikişînim divê ez têkevim wê. Di vê rewşê de çareseriya çêtirîn ev e ku hûn têketinek û şîfreyek têkevin Vault-ê û dûv re wê bi Nomad re yek bikin. Nomad bi xwezayî piştgirî dide Vault. Lê pêşî, bila em polîtîkayên pêwîst ji bo Nomad di Vault-ê de saz bikin; ew dikarin werin dakêşandin:

# 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

Naha, ku polîtîkayên pêwîst afirandin, em ê entegrasyonê bi Vault re di bloka peywirê de di pelê job.nomad de zêde bikin:

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

Ez destûrnameyê bi nîşanek bikar tînim û wê rasterast li vir tomar bikim, di heman demê de vebijarka diyarkirina tokenê wekî guhêrbar heye dema ku karmendê koçer dest pê dike:

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

Naha em dikarin bişkokên bi Vault re bikar bînin. Prensîba xebitandinê hêsan e: em di karê Nomad de pelek diafirînin ku dê nirxên guhêrbar hilîne, mînakî:

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
}

Bi vê nêzîkatiya hêsan, hûn dikarin radestkirina konteyneran ji koma Nomad re mîheng bikin û di pêşerojê de pê re bixebitin. Ez ê bibêjim ku heya radeyekê ez bi Nomad re sempatî dikim - ew ji bo projeyên piçûktir e ku Kubernetes dikare bibe sedema tevliheviyek zêde û dê potansiyela xwe ya tevahî fam neke. Zêdeyî, Nomad ji bo destpêkan bêkêmasî ye — sazkirin û mîhengkirin hêsan e. Lêbelê, dema ceribandina li ser hin projeyan, ez bi guhertoyên wê yên destpêkê re pirsgirêkek çêdibim - gelek fonksiyonên bingehîn bi tenê ne li wir in an ew rast naxebitin. Lêbelê, ez bawer dikim ku Nomad dê pêşveçûna xwe bidomîne û di pêşerojê de ew ê fonksiyonên ku her kes hewce dike bi dest bixe.

Nivîskar: Ilya Andreev, ji hêla Alexey Zhadan û tîmê Live Linux ve hatî verast kirin


Source: www.habr.com

Add a comment