It-twaqqif ta' cluster Nomad bl-użu ta' Consul u l-integrazzjoni ma' Gitlab

Introduzzjoni

Riċentement, il-popolarità ta 'Kubernetes kienet qed tikber malajr - aktar u aktar proġetti qed jimplimentawha. Xtaqt tmiss orkestratur bħal Nomad: hija perfetta għal proġetti li diġà jużaw soluzzjonijiet oħra minn HashiCorp, pereżempju, Vault u Consul, u l-proġetti nfushom mhumiex kumplessi f'termini ta 'infrastruttura. Dan il-materjal se jkun fih struzzjonijiet għall-installazzjoni ta 'Nomad, li jgħaqqad żewġ nodi fi cluster, kif ukoll li jintegra Nomad ma' Gitlab.

It-twaqqif ta' cluster Nomad bl-użu ta' Consul u l-integrazzjoni ma' Gitlab

Stand tat-test

Ftit dwar il-bank tat-test: tliet servers virtwali huma użati bil-karatteristiċi ta '2 CPU, 4 RAM, 50 Gb SSD, magħquda f'netwerk lokali komuni. L-ismijiet u l-indirizzi IP tagħhom:

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

Installazzjoni ta' Nomad, Konslu. Ħolqien ta 'cluster Nomad

Nibdew bl-installazzjoni bażika. Għalkemm is-setup kien sempliċi, ser niddeskriviha għall-fini tal-integrità tal-artikolu: essenzjalment inħoloq minn abbozzi u noti għal aċċess rapidu meta meħtieġ.

Qabel ma nibdew il-prattika, ser niddiskutu l-parti teoretika, għaliex f'dan l-istadju huwa importanti li nifhmu l-istruttura futura.

Għandna żewġ nodi nomadi u rridu ngħaqqduhom fi cluster, u fil-futur ser ikollna bżonn ukoll skalar awtomatiku tal-clusters - għal dan ikollna bżonn Konslu. B'din l-għodda, ir-raggruppament u ż-żieda ta 'nodi ġodda jsiru ħidma sempliċi ħafna: in-nodu Nomad maħluq jgħaqqad mal-aġent tal-Konslu, u mbagħad jgħaqqad mal-cluster Nomad eżistenti. Għalhekk, fil-bidu se ninstallaw is-server tal-Konslu, nikkonfiguraw l-awtorizzazzjoni http bażika għall-pannell tal-web (hija mingħajr awtorizzazzjoni awtomatikament u tista 'tkun aċċessata f'indirizz estern), kif ukoll l-aġenti tal-Konslu nfushom fuq servers Nomad, u wara se nipproċedu biss għal Nomad.

L-installazzjoni tal-għodod ta 'HashiCorp hija sempliċi ħafna: essenzjalment, aħna biss nimxu l-fajl binarju għad-direttorju tal-bin, inwaqqfu l-fajl ta' konfigurazzjoni tal-għodda, u noħolqu l-fajl tas-servizz tiegħu.

Niżżel il-fajl binarju tal-Konslu u spakkjah fid-direttorju tad-dar tal-utent:

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/

Issa għandna konslu binarju lest għal aktar konfigurazzjoni.

Biex naħdmu mal-Konslu, għandna bżonn noħolqu ċavetta unika billi tuża l-kmand keygen:

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

Ejja ngħaddu għat-twaqqif tal-konfigurazzjoni tal-Konslu, billi noħolqu direttorju /etc/consul.d/ bl-istruttura li ġejja:

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

Id-direttorju tal-bootstrap se jkun fih fajl ta 'konfigurazzjoni config.json - fih se nissettjaw is-settings tal-Konslu. Il-kontenut tiegħu:

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

Ejja nħarsu lejn id-direttivi ewlenin u t-tifsiriet tagħhom separatament:

  • bootstrap: veru. Aħna nippermettu żieda awtomatika ta 'nodi ġodda jekk ikunu konnessi. Ninnota li aħna ma nindikawx hawn in-numru eżatt ta 'nodi mistennija.
  • servers: veru. Ippermetti l-modalità tas-server. Konslu fuq din il-magna virtwali se jaġixxi bħala l-uniku server u kaptan fil-mument, il-VM ta 'Nomad se jkunu l-klijenti.
  • Datacenter: dc1. Speċifika l-isem taċ-ċentru tad-dejta biex toħloq il-cluster. Għandu jkun identiku kemm fuq il-klijenti kif ukoll fuq is-servers.
  • kriptaġġ: iċ-ċavetta tiegħek. Iċ-ċavetta, li għandha wkoll tkun unika u taqbel mal-klijenti u s-servers kollha. Ġenerat bl-użu tal-kmand keygen tal-konslu.
  • start_join. F'din il-lista aħna nindikaw lista ta 'indirizzi IP li għalihom se ssir il-konnessjoni. Bħalissa nħallu l-indirizz tagħna biss.

F'dan il-punt nistgħu nħaddmu konsul billi tuża l-linja tal-kmand:

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

Dan huwa mod tajjeb biex tiddibaggja issa, madankollu, mhux se tkun tista 'tuża dan il-metodu fuq bażi kontinwa għal raġunijiet ovvji. Ejja noħolqu fajl tas-servizz biex timmaniġġja lil Consul permezz tas-systemd:

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

Kontenut tal-fajl 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

Tnedija Konslu permezz systemctl:

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

Ejja niċċekkjaw: is-servizz tagħna għandu jkun qed jaħdem, u billi nwettqu l-kmand tal-membri tal-konslu għandna naraw is-server tagħna:

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

L-istadju li jmiss: l-installazzjoni ta 'Nginx u t-twaqqif ta' proxy u awtorizzazzjoni http. Aħna ninstallaw nginx permezz tal-maniġer tal-pakketti u fid-direttorju /etc/nginx/sites-enabled noħolqu fajl ta' konfigurazzjoni consul.conf bil-kontenut li ġej:

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

Tinsiex toħloq fajl .htpasswd u tiġġenera username u password għaliha. Dan l-oġġett huwa meħtieġ sabiex il-pannell tal-web ma jkunx disponibbli għal kull min jaf id-dominju tagħna. Madankollu, meta nwaqqfu Gitlab, ikollna nabbandunaw dan - inkella ma nkunux nistgħu niskjeraw l-applikazzjoni tagħna għan-Nomad. Fil-proġett tiegħi, kemm Gitlab kif ukoll Nomad huma biss fuq il-web griż, għalhekk m'hemm l-ebda problema bħal din hawn.

Fuq iż-żewġ servers li jifdal aħna ninstallaw aġenti Konslu skont l-istruzzjonijiet li ġejjin. Nirrepetu l-passi bil-fajl binarju:

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/

B'analoġija mas-server preċedenti, noħolqu direttorju għall-fajls ta 'konfigurazzjoni /etc/consul.d bl-istruttura li ġejja:

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

Kontenut tal-fajl 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
     }

Issejvja l-bidliet u kompli biex twaqqaf il-fajl tas-servizz, il-kontenut tiegħu:

/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

Inniedu konsul fuq is-server. Issa, wara t-tnedija, għandna naraw is-servizz konfigurat fil-membri nsul. Dan se jfisser li jkun ikkonnettjat b'suċċess mal-cluster bħala klijent. Irrepeti l-istess fuq it-tieni server u wara nistgħu nibdew ninstallaw u nikkonfiguraw Nomad.

Installazzjoni aktar dettaljata ta 'Nomad hija deskritta fid-dokumentazzjoni uffiċjali tagħha. Hemm żewġ metodi ta 'installazzjoni tradizzjonali: tniżżil ta' fajl binarju u kumpilazzjoni mis-sors. Jien ser nagħżel l-ewwel metodu.

Innota: Il-proġett qed jiżviluppa malajr ħafna, ħafna drabi jiġu rilaxxati aġġornamenti ġodda. Forsi verżjoni ġdida tkun rilaxxata sa meta dan l-artikolu jitlesta. Għalhekk, qabel ma taqra, nirrakkomanda li tiċċekkja l-verżjoni attwali ta 'Nomad fil-mument u tniżżilha.

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

Wara l-unpacking, se nirċievu fajl binarju Nomad li jiżen 65 MB - għandu jiġi mċaqlaq għal /usr/local/bin.

Ejja noħolqu direttorju tad-dejta għal Nomad u neditjaw il-fajl tas-servizz tiegħu (x'aktarx mhux se jeżisti fil-bidu):

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

Past il-linji li ġejjin hemmhekk:

[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

Madankollu, m'għandniex għaġla biex inniedu n-nomad - għadna ma ħloqniex il-fajl tal-konfigurazzjoni tiegħu:

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

L-istruttura tad-direttorju finali se tkun kif ġej:

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

Il-fajl nomad.hcl għandu jkun fih il-konfigurazzjoni li ġejja:

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

Kontenut tal-fajl 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
}

Tinsiex tibdel il-fajl tal-konfigurazzjoni fuq it-tieni server - hemm ikollok bżonn tibdel il-valur tad-direttiva http.

L-aħħar ħaġa f'dan l-istadju hija li tikkonfigura Nginx għal proxy u twaqqaf awtorizzazzjoni http. Kontenut tal-fajl 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";
        }
        
}

Issa nistgħu naċċessaw il-pannell tal-web permezz ta 'netwerk estern. Qabbad u mur fil-paġna tas-servers:

It-twaqqif ta' cluster Nomad bl-użu ta' Consul u l-integrazzjoni ma' Gitlab
Immaġni 1. Lista ta 'servers fil-cluster Nomad

Iż-żewġ servers jintwerew b'suċċess fil-panel, se naraw l-istess ħaġa fl-output tal-kmand tal-istatus tan-nodu nomad:

It-twaqqif ta' cluster Nomad bl-użu ta' Consul u l-integrazzjoni ma' Gitlab
Immaġni 2. Output tal-kmand tal-istatus tan-nomade nomad

Xi ngħidu dwar il-Konslu? Ejja nagħtu ħarsa. Mur fil-pannell tal-kontroll tal-Konslu, fil-paġna tan-nodi:
It-twaqqif ta' cluster Nomad bl-użu ta' Consul u l-integrazzjoni ma' Gitlab
Immaġni 3. Lista ta 'nodi fil-cluster Konslu

Issa għandna Nomad ippreparat li jaħdem flimkien mal-Konslu. Fl-istadju finali, se naslu għall-parti divertenti: nistabbilixxu l-kunsinna ta 'kontenituri Docker minn Gitlab għal Nomad, u nitkellmu wkoll dwar xi wħud mill-karatteristiċi distintivi l-oħra tagħha.

Noħolqu Gitlab Runner

Biex niskjeraw immaġini docker għal Nomad, se nużaw runner separat bil-fajl binarju Nomad ġewwa (hawn, bil-mod, nistgħu ninnotaw karatteristika oħra tal-applikazzjonijiet Hashicorp - individwalment huma fajl binarju wieħed). Tellah fid-direttorju tar-runner. Ejja noħolqu Dockerfile sempliċi għaliha bil-kontenut li ġej:


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

Fl-istess proġett noħolqu .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}

Bħala riżultat, se jkollna immaġni disponibbli tan-Nomad runner fir-Reġistru Gitlab, issa nistgħu mmorru direttament għar-repożitorju tal-proġett, noħolqu Pipeline u kkonfiguraw ix-xogħol nomad ta 'Nomad.

Setup tal-proġett

Nibdew bil-fajl tax-xogħol għal Nomad. Il-proġett tiegħi f'dan l-artikolu se jkun pjuttost primittiv: se jikkonsisti f'kompitu wieħed. Il-kontenut ta '.gitlab-ci se jkun kif ġej:

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

Hawnhekk l-iskjerament iseħħ manwalment, iżda tista 'tikkonfiguraha biex tibdel il-kontenut tad-direttorju tal-proġett. Il-pipeline jikkonsisti f'żewġ stadji: l-assemblaġġ tal-immaġni u l-iskjerament tiegħu għal nomad. Fl-ewwel stadju, aħna niġbru immaġni ta 'docker u nimbottawha fir-Reġistru tagħna, u fit-tieni niddew ix-xogħol tagħna f'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" {}
                }
            }
        }
    }
}

Jekk jogħġbok innota li għandi Reġistru privat u biex niġbed immaġini docker b'suċċess għandi bżonn nilloggja fiha. L-aħjar soluzzjoni f'dan il-każ hija li ddaħħal login u password fil-Vault u mbagħad tintegraha ma' Nomad. Nomad jappoġġa b'mod nattiv Vault. Imma l-ewwel, ejja ninstallaw il-politiki meħtieġa għal Nomad fil-Vault innifsu; jistgħu jitniżżlu:

# 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

Issa, wara li ħloqna l-politiki meħtieġa, se nżidu l-integrazzjoni mal-Vault fil-blokk tal-kompiti fil-fajl job.nomad:

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

Jiena nuża awtorizzazzjoni b'token u nirreġistraha direttament hawn, hemm ukoll l-għażla li tispeċifika t-token bħala varjabbli meta nibda l-aġent nomad:

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

Issa nistgħu nużaw iċ-ċwievet b'Vault. Il-prinċipju tat-tħaddim huwa sempliċi: noħolqu fajl f'impjieg Nomad li jaħżen il-valuri tal-varjabbli, pereżempju:

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
}

B'dan l-approċċ sempliċi, tista 'tikkonfigura l-kunsinna ta' kontenituri lill-cluster Nomad u taħdem miegħu fil-futur. Jien se ngħid li sa ċertu punt nisimpatizza ma 'Nomad - huwa aktar adattat għal proġetti żgħar fejn Kubernetes jista' jikkawża kumplessità addizzjonali u mhux se jirrealizza l-potenzjal sħiħ tiegħu. Barra minn hekk, Nomad hija perfetta għal dawk li jibdew—huwa faċli biex tinstalla u tikkonfigura. Madankollu, meta nittestja fuq xi proġetti, niltaqa 'ma' problema bil-verżjonijiet bikrija tagħha - ħafna funzjonijiet bażiċi sempliċement mhumiex hemm jew ma jaħdmux b'mod korrett. Madankollu, nemmen li Nomad se jkompli jiżviluppa u fil-futur jakkwista l-funzjonijiet li għandu bżonn kulħadd.

Awtur: Ilya Andreev, editjat minn Alexey Zhadan u t-tim Live Linux


Sors: www.habr.com

Żid kumment