Mete kanpe yon gwoup Nomad lè l sèvi avèk Consul ak entegre ak Gitlab

Entwodiksyon

Dènyèman, popilarite Kubernetes te grandi rapidman - plis ak plis pwojè ap aplike li. Mwen te vle manyen yon orchestrator tankou Nomad: li pafè pou pwojè ki deja itilize lòt solisyon ki soti nan HashiCorp, pou egzanp, Vault ak Consul, ak pwojè yo tèt yo pa konplèks an tèm de enfrastrikti. Materyèl sa a pral genyen enstriksyon pou enstale Nomad, konbine de nœuds nan yon gwoup, osi byen ke entegre Nomad ak Gitlab.

Mete kanpe yon gwoup Nomad lè l sèvi avèk Consul ak entegre ak Gitlab

Ban tès

Yon ti kras sou ban tès la: twa serveurs vityèl yo itilize ak karakteristik sa yo nan 2 CPU, 4 RAM, 50 Gb SSD, ini nan yon rezo lokal komen. Non yo ak adrès IP yo:

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

Enstalasyon Nomad, Konsil. Kreye yon gwoup nomad

Ann kòmanse ak enstalasyon debaz la. Malgre ke konfigirasyon an te senp, mwen pral dekri li pou dedomajman pou entegrite nan atik la: li te esansyèlman kreye nan proje ak nòt pou aksè rapid lè sa nesesè.

Anvan nou kòmanse pratik, nou pral diskite sou pati teyorik la, paske nan etap sa a li enpòtan pou konprann estrikti nan lavni.

Nou gen de nœuds nomad epi nou vle konbine yo nan yon gwoup, epi nan lavni nou pral bezwen tou otomatik dekalifikasyon gwoup - pou sa a nou pral bezwen Konsil. Avèk zouti sa a, gwoupman ak ajoute nouvo nœuds vin tounen yon travay trè senp: nœud Nomad kreye konekte ak ajan Konsil la, epi answit konekte ak gwoup Nomad ki egziste deja. Se poutèt sa, nan kòmansman an nou pral enstale sèvè Konsil la, konfigirasyon otorizasyon http debaz pou panèl entènèt la (li se san otorizasyon pa default epi yo ka jwenn aksè nan yon adrès ekstèn), osi byen ke ajan Konsil yo tèt yo sou sèvè Nomad yo, apre sa. nou pral sèlman ale nan Nomad.

Enstale zouti HashiCorp yo trè senp: esansyèlman, nou jis deplase fichye binè a nan anyè bin la, mete fichye konfigirasyon zouti a, epi kreye dosye sèvis li yo.

Telechaje fichye binè Consul a epi depake li nan anyè lakay itilizatè a:

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/

Koulye a, nou gen yon pare-fè konsil binè pou plis konfigirasyon.

Pou travay ak Consul, nou bezwen kreye yon kle inik lè l sèvi avèk lòd keygen la:

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

Ann kontinye mete konfigirasyon Konsil la, kreye yon anyè /etc/consul.d/ ak estrikti sa a:

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

Anyè bootstrap la pral genyen yon fichye konfigirasyon config.json - nan li nou pral mete paramèt Konsil yo. Kontni li yo:

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

Ann gade direktiv prensipal yo ak siyifikasyon yo separeman:

  • bootstrap: vre. Nou pèmèt ajoute otomatik nouvo nœuds si yo konekte. Mwen sonje ke nou pa endike isit la kantite egzak nœuds espere.
  • sèvè: vre. Pèmèt mòd sèvè. Konsil sou machin vityèl sa a pral aji kòm sèl sèvè ak mèt nan moman sa a, VM Nomad a pral kliyan yo.
  • datacenter: dc1. Espesifye non sant done a pou kreye gwoup la. Li dwe idantik sou tou de kliyan ak serveurs.
  • ankripte: kle ou. Kle a, ki dwe tou inik ak matche ak sou tout kliyan ak serveurs. Jenere lè l sèvi avèk kòmand keygen konsil la.
  • kòmanse_join. Nan lis sa a nou endike yon lis adrès IP kote yo pral fè koneksyon an. Nan moman sa a nou kite sèlman pwòp adrès pa nou.

Nan pwen sa a nou ka kouri konsil lè l sèvi avèk liy lòd la:

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

Sa a se yon bon fason yo debogaj kounye a, sepandan, ou pa yo pral kapab sèvi ak metòd sa a sou yon baz kontinyèl pou rezon evidan. Ann kreye yon fichye sèvis pou jere Consul atravè systemd:

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

Sa ki nan fichye consul.service la:

[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

Lanse Consul atravè systemctl:

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

Ann tcheke: sèvis nou an dwe fonksyone, epi lè nou egzekite kòmandman manm konsil yo nou ta dwe wè sèvè nou an:

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

Pwochen etap: enstale Nginx ak mete kanpe proxy ak otorizasyon http. Nou enstale nginx atravè manadjè pake a epi nan /etc/nginx/sites-enabled anyè nou kreye yon dosye konfigirasyon consul.conf ak sa ki annapre yo:

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

Pa bliye kreye yon fichye .htpasswd epi jenere non itilizatè ak modpas pou li. Atik sa a obligatwa pou panèl entènèt la pa disponib pou tout moun ki konnen domèn nou an. Sepandan, lè nou mete Gitlab, nou pral oblije abandone sa a - otreman nou pa pral kapab deplwaye aplikasyon nou an nan Nomad. Nan pwojè mwen an, tou de Gitlab ak Nomad yo sèlman sou entènèt la gri, kidonk pa gen okenn pwoblèm sa yo isit la.

Sou de sèvè ki rete yo nou enstale ajan Konsil yo dapre enstriksyon sa yo. Nou repete etap sa yo ak dosye binè a:

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/

Pa analoji ak sèvè anvan an, nou kreye yon anyè pou fichye konfigirasyon /etc/consul.d ak estrikti sa a:

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

Sa ki nan fichye config.json la:

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

Sove chanjman yo epi ale nan mete kanpe fichye sèvis la, sa li yo:

/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

Nou lanse konsil sou sèvè a. Koulye a, apre lansman, nou ta dwe wè sèvis la configuré nan manm nsul yo. Sa a pral vle di ke li gen siksè konekte ak gwoup la kòm yon kliyan. Repete menm bagay la sou dezyèm sèvè a epi apre sa nou ka kòmanse enstale ak konfigirasyon Nomad.

Plis detay enstalasyon Nomad dekri nan dokiman ofisyèl li yo. Gen de metòd enstalasyon tradisyonèl: telechaje yon dosye binè ak konpile soti nan sous. Mwen pral chwazi premye metòd la.

Note: Pwojè a ap devlope trè vit, nouvo mizajou yo souvan lage. Petèt yon nouvo vèsyon pral lage lè atik sa a fini. Se poutèt sa, anvan li, mwen rekòmande tcheke vèsyon aktyèl la nan Nomad nan moman sa a ak telechaje li.

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

Apre debake, nou pral resevwa yon fichye binè Nomad ki peze 65 MB - li dwe deplase nan /usr/local/bin.

Ann kreye yon anyè done pou Nomad epi edite fichye sèvis li a (li gen plis chans pa egziste nan kòmansman an):

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

Kole liy sa yo la:

[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

Sepandan, nou pa prese lanse nomad - nou poko kreye dosye konfigirasyon li yo:

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

Estrikti anyè final la pral jan sa a:

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

Fichye nomad.hcl ta dwe genyen konfigirasyon sa a:

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

Sa ki nan fichye server.hcl la:

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
}

Pa bliye chanje fichye konfigirasyon an sou dezyèm sèvè a - la w ap bezwen chanje valè http direktiv la.

Dènye bagay nan etap sa a se konfigirasyon Nginx pou proxy ak mete kanpe otorizasyon http. Sa ki nan fichye nomad.conf la:

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

Koulye a, nou ka jwenn aksè nan panèl entènèt la atravè yon rezo ekstèn. Konekte epi ale nan paj serveurs yo:

Mete kanpe yon gwoup Nomad lè l sèvi avèk Consul ak entegre ak Gitlab
Imaj 1. Lis sèvè nan gwoup Nomad la

Tou de sèvè yo montre avèk siksè nan panèl la, nou pral wè menm bagay la nan pwodiksyon an nan lòd la estati nomade:

Mete kanpe yon gwoup Nomad lè l sèvi avèk Consul ak entegre ak Gitlab
Imaj 2. Sòti kòmandman estati nomad la

E Konsil? Ann fè yon gade. Ale nan panèl kontwòl Konsil la, nan paj nœuds yo:
Mete kanpe yon gwoup Nomad lè l sèvi avèk Consul ak entegre ak Gitlab
Imaj 3. Lis nœuds nan gwoup Konsil la

Kounye a nou gen yon Nomad ki prepare k ap travay ansanm ak Konsil. Nan etap final la, nou pral rive nan pati amizan an: mete kanpe livrezon kontenè Docker soti nan Gitlab nan Nomad, epi tou pale sou kèk nan lòt karakteristik diferan li yo.

Kreye Gitlab Runner

Pou deplwaye imaj docker nan Nomad, nou pral sèvi ak yon kourè separe ak fichye binè Nomad anndan an (isit la, nan chemen an, nou ka sonje yon lòt karakteristik nan aplikasyon Hashicorp - endividyèlman yo se yon sèl dosye binè). Voye li nan anyè kourè a. Ann kreye yon Dockerfile senp pou li ak kontni sa a:


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

Nan menm pwojè a nou kreye .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}

Kòm yon rezilta, nou pral gen yon imaj ki disponib nan kourè Nomad la nan Rejis Gitlab la, kounye a nou ka ale dirèkteman nan depo pwojè a, kreye yon Pipeline ak konfigirasyon travay nomad Nomad la.

Konfigirasyon pwojè

Ann kòmanse ak dosye travay la pou Nomad. Pwojè mwen an nan atik sa a pral trè primitif: li pral konpoze de yon sèl travay. Sa ki nan .gitlab-ci yo pral jan sa a:

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

Isit la deplwaman an fèt manyèlman, men ou ka configured li pou chanje sa ki nan anyè pwojè a. Pipeline konsiste de de etap: asanble imaj ak deplwaman li nan nomad. Nan premye etap la, nou rasanble yon imaj docker epi pouse li nan Rejis nou an, epi nan dezyèm lan nou lanse travay nou an nan 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" {}
                }
            }
        }
    }
}

Tanpri sonje ke mwen gen yon Rejis prive epi pou m rale yon imaj docker avèk siksè mwen bezwen konekte nan li. Pi bon solisyon an nan ka sa a se antre yon login ak modpas nan Vault ak Lè sa a, entegre li ak Nomad. Nomad natif natal sipòte Vault. Men, anvan, ann enstale règleman ki nesesè pou Nomad nan Vault tèt li; yo ka telechaje:

# 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

Koulye a, nou te kreye règleman ki nesesè yo, nou pral ajoute entegrasyon ak Vault nan blòk travay la nan fichye job.nomad la:

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

Mwen sèvi ak otorizasyon pa siy epi anrejistre li dirèkteman isit la, gen tou opsyon pou espesifye siy la kòm yon varyab lè yo kòmanse ajan nomad:

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

Koulye a, nou ka itilize kle yo ak vout. Prensip la nan operasyon se senp: nou kreye yon dosye nan travay Nomad ki pral estoke valè yo nan varyab, pou egzanp:

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
}

Avèk apwòch senp sa a, ou ka configured livrezon resipyan nan gwoup Nomad la epi travay avèk li nan lavni. Mwen pral di ke nan yon sèten mezi mwen senpatize ak Nomad - li pi apwopriye pou ti pwojè kote Kubernetes ka lakòz plis konpleksite epi yo pa pral reyalize tout potansyèl li. Anplis de sa, Nomad se pafè pou débutan-li fasil enstale ak konfigirasyon. Sepandan, lè tès sou kèk pwojè, mwen rankontre yon pwoblèm ak premye vèsyon li yo - anpil fonksyon debaz yo tou senpleman pa la oswa yo pa travay kòrèkteman. Sepandan, mwen kwè ke Nomad ap kontinye devlope epi alavni li pral jwenn fonksyon yo ke tout moun bezwen.

Otè: Ilya Andreev, edited by Alexey Zhadan ak ekip Live Linux la


Sous: www.habr.com

Add nouvo kòmantè