Nomadi klastrite seadistamine koos Consuli ja integratsiooniga Gitlabi

Sissejuhatus

Viimasel ajal on Kubernetes populaarsus kiiresti kasvanud - ĂŒha rohkem projekte rakendab seda enda juures. Sooviksin aga rÀÀkida sellisest orkestrist nagu Nomad: see sobib suurepĂ€raselt projektidele, kus kasutatakse juba teisi HashiCorpi lahendusi, nagu Vault ja Consul, ning kus projektid ei ole infrastruktuuri osas eriti keerulised. KĂ€esolevas materjalis on juhend Nomadi installimiseks, kahe sĂ”lme ĂŒhendamiseks klastriks ning Nomadi integreerimiseks Gitlabiga.

Nomadi klastrite seadistamine koos Consuli ja integratsiooniga Gitlabi

Testseade

Natuke katsehoonest: kasutatakse kolme virtuaalserverit, millel on omadused 2 CPU, 4 RAM, 50 Gb SSD, ĂŒhendatud ĂŒhte kohaliku vĂ”rku. Nende nimed ja IP-aadressid:

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

Nomadi ja Consuli installimine. Nomadi klastrite loomine

Alustame pÔhinstallatsiooniga. Kuigi installatsioon on lihtne, kirjeldan seda artikli terviklikkuse huvides: pÔhimÔtteliselt on see loodud visanditest ja mÀrkmetest kiireks ligipÀÀsuks vajadusel.

Enne praktikaga alustamist arutame teoreetilist osa, kuna kÀesoleval etapil on oluline mÔista tulevast struktuuri.

Meil on olemas kaks Nomadi sĂ”lme ja soovime need klastriks ĂŒhendada; samuti vajame tulevikus automaatset klastrite skaleerimist — selleks on meil vaja Consulit. Selle tööriista abil muutub klastrite loomine ja uute sĂ”lmede lisamine vĂ€ga lihtsaks: loodud Nomadi sĂ”lm ĂŒhendub Consuli agentidega, pĂ€rast mida toimub ĂŒhendamine olemasoleva Nomadi klastriga. SeetĂ”ttu installime kĂ”igepealt Consuli serveri, seadistame pĂ”hilise http autentimise veebipaneeli jaoks (see on vaikimisi ilma autentimiseta ja vĂ”ib olla kergesti ligipÀÀsetav vĂ€lise aadressi kaudu), samuti ise Consuli agentide Nomadi serverites, enne kui hakkame Nomadit seadistama.

HashiCorpi tööriistade installimine on vÀga lihtne: pÔhimÔtteliselt liigutame lihtsalt binaarfaili bin kausta, seadistame tööriista konfiguratsioonifaili ja loome selle teenuse faili.

Laadime alla Consuli binaarfaili ja extrageerime selle kasutaja kodukausta:

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/

NĂŒĂŒd on meil olemas valmis binaarfail consul edasiseks seadistamiseks.

Consul'iga töötamiseks peame looma unikaalse vÔtme kÀsuga keygen:

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

Liigume edasi Consul'i konfiguratsiooni seadistamise juurde, loome katalooge /etc/consul.d/ jÀrgmise struktuuriga:

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

Kataloogis bootstrap asub konfiguratsioonifail config.json — seal mÀÀratleme Consul'i seaded. Selle sisu:

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

AnalĂŒĂŒsime eraldi peamisi direktiive ja nende vÀÀrtusi:

  • bootstrap: true. LĂŒlitame sisse automaatse uute nodede lisamise nende ĂŒhendamisel. Tahan mĂ€rkida, et me ei mÀÀra siin oodatavate nodede tĂ€pset arvu.
  • server: true. LĂŒlitame sisse serveri reĆŸiimi. Consul toimib sellel virtuaalsel masinal praegu ainus server ja master, Nomad'i VM-d on klientideks.
  • datacenter: dc1. MÀÀrame andmekeskuse nime klastrisse loomiseks. See peab olema identne nii klientidel kui ka serveritel.
  • encrypt: your-key. VĂ”ti, mis peab samuti olema ainulaadne ja ĂŒhtlane kĂ”igis klientides ja serverites. Genereeritakse kĂ€suga consul keygen.
  • start_join. Selles nimekirjas mÀÀrame IP-aadresside loendi, millega ĂŒhendame. Praegu jĂ€tame ainult oma aadressi.

Selles etapis saame kÀivitada consul'i kÀsurealt:

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

See on praegu hea tĂ”rkeotsingumeetod, kuid pĂŒsivalt ei saa seda HBO nĂ€htavatel pĂ”hjustel kasutada. Loome teenuse faili Consul'i haldamiseks sĂŒsteemis systemd:

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

Faili consul.service sisu:

[Unit]
Description=Consul'i kÀivitamise protsess
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

KÀivitame Consul'i lÀbi systemctl:

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

Kontrollime: teenus peab olema kÀivitatud ja kÀsu consul members tÀitmisel peaksime nÀgema meie serverit:

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

JÀrgmine etapp: Nginx'i paigaldamine ja pööramise, http autentimise seadistamine. Paigaldame nginx'i pakihalduri kaudu ja kataloogis \/etc\/nginx\/sites-enabled loome konfiguratsioonifaili consul.conf jÀrgmise sisuga:

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

Ärge unustage luua .htpasswd faili ja genereerida sellele kasutajanimi ja parool. See samm on vajalik, et veebipaneel ei oleks kergesti juurdepÀÀsetav kĂ”igile, kes teavad meie domeeni. Kuid Gitlabi seadistamisel tuleb sellest loobuda - vastasel juhul ei saa me oma rakendust Nomadi juurutada. Minu projektis asuvad nii GitLab kui ka Nomad ainult hallis vĂ”rgus, seega pole sellist probleemi siin.

Teistel kahel serveril paigaldame Consul agentide jÀrgides jÀrgmisi juhiseid. Korrake toiminguid binaarfailiga:

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/

Sarnaselt eelnevale serverile loome konfigureerimisfailide katalooge /etc/consul.d jÀrgmise struktuuriga:

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

config.json faili sisu:

{
    "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", # kohaliku vm aadress
    "start_join": ["172.30.0.15"], # kaugserveri Consul aadress
    "ports": {
      "dns": 53
     }

Salvestame muudatused ja liigume teenusefaili seadistamise juurde, selle sisu:

/etc/systemd/system/consul.service:

[Unit]
Description="HashiCorp Consul - teenuse vÔrgulahendus"
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

KĂ€ivitame Consuli serveris. NĂŒĂŒd, pĂ€rast kĂ€ivitamist, peaksime nsul members nĂ€gema seadistatud teenust. See tĂ€hendab, et see on edukalt liitunud klastriga kui klient. Korrake sama ka teisel serveril ja seejĂ€rel saame alustada Nomadi paigaldamist ja seadistamist.

Podrobne mintaia Nomadi paigaldamine on kirjeldatud selle ametlikus dokumentatsioonis. On kaks traditsioonilist paigaldusviisi: binaarfaili allalaadimine ja lÀhtekoodist kompileerimine. Valin esimese variandi.

MÀrkus: projekt areneb vÀga kiiresti, sageli ilmuvad uued vÀrskendused. VÔimalik, et artikli valmimise ajaks ilmub uus versioon. Seega soovitan enne lugemist kontrollida hetke Nomadi versiooni ja alla laadida just see.

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

PĂ€rast dekomprimeerimist saame 65 MB suuruse Nomad binaarfaili - see tuleb viia /usr/local/bin.

Loome Nomad'i jaoks andmekausta ja muudame selle teenuse faili (tÔenÀoliselt pole seda alguses olemas):

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

Kopeerime sinna jÀrgmised read:

[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

Kuid Àrge kiirustage nomadi kÀivitamiseks - me pole veel loonud tema konfiguratsioonifaili:

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Ôplik kaustastruktuur on jÀrgmine:

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

Fail nomad.hcl peab sisaldama jÀrgmist konfiguratsiooni:

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

Faili server.hcl sisu:

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
}

Ärge unustage muuta konfiguratsioonifaili teisel serveril - seal tuleb muuta http direktiivi vÀÀrtust.

Viimase sammuna on Nginxi seadistamine, et edastada ja seadistada http autentimine. Faili nomad.conf sisu:

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 "Parooli kaitstud ala";
        }
        
}

NĂŒĂŒd saame pÀÀseda veebipaneelile lĂ€bi vĂ€lise vĂ”rgu. Ühendume ja liigume servers lehele:

Nomadi klastrite seadistamine koos Consuli ja integratsiooniga Gitlabi
Kujutis 1. Nimekiri Nomadi klastris olevatest serveritest

MÔlemad serverid kuvatakse edukalt paneelil, sama nÀeme ka kÀsku nomad node status vÀljastusel:

Nomadi klastrite seadistamine koos Consuli ja integratsiooniga Gitlabi
Kujutis 2. KÀsku nomad node status vÀljund

Kuidas on Consul'i poolt? Vaatame. Liigume Consul'i juhtpaneelile lehele nodes:
Nomadi klastrite seadistamine koos Consuli ja integratsiooniga Gitlabi
Kujutis 3. Nimekiri nodidest Consul'i klastris

NĂŒĂŒd on meil olemas ettevalmistatud Nomad, mis töötab koos Consul'iga. LĂ”ppetapis asume kĂ”ige huvitavama juurde: seadistame Docker konteinerite tarnimise GitLabist Nomadi, samuti arutame mĂ”ningaid teisi selle eripĂ€ra.

GitLab Runneri loomine

Docker piltide ĂŒleslaadimiseks Nomadi kasutame eraldi runnerit, mille sees on Nomadi binaarfail (siinjuures vĂ”ib mainida veel ĂŒhte Hashicorpi rakenduste omadust — eraldi on nad ainus binaarfail). Laadige see runneri katalooge. Selle jaoks loome kĂ”ige lihtsama Dockerfile'i, mille sisu on jĂ€rgmine:


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

Samas projektis loome .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}

LĂ”ppkokkuvĂ”ttes on meil GitLab Registry'sse saadaval Nomadi runneri pilt, nĂŒĂŒd saame liikuda otse projekti reposse, loome Pipeline'i ja seadistame Nomadi töö.

Projekti seadistamine

Alustame Nomadi jaoks job faili koostamisega. Minu projekt selles artiklis on piisavalt primitiivne: see koosneb ĂŒhest ĂŒlesandest. .gitlab-ci sisu on jĂ€rgmine:

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}'  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

Siin toimub juurutamine kÀsitsi, kuid saate selle seadistada projekti katalooge sisu muutmiseks. Pipeline koosneb kahest etapist: pildi koostamisest ja selle juurutamisest Nomadis. Esimeses etapis koostame docker pildi ja edastame selle meie Registry'sse, teises aga kÀivitame meie töö Nomadis.

töö "monitoring-status" {
    andmekeskused = ["dc1"]
    migreeri {
        max_parallel = 3
        health_check = "checks"
        min_healthy_time = "15s"
        healthy_deadline = "5m"
    }

    grupp "zhadan.ltd" {
        count = 1
        uuenda {
            max_parallel      = 1
            min_healthy_time  = "30s"
            healthy_deadline  = "5m"
            progress_deadline = "10m"
            auto_revert       = true
        }
        ĂŒlesanne "service-monitoring" {
            juht {
                docker = "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" {}
                    }
                }
            }
        }
    }
}

Palun pöörake tÀhelepanu, et mul on privaatne Registry ja Docker-i pildi edukaks tÔmbamiseks on mul vajalik seal autentida. Parim lahendus antud juhul on registreerida kasutajanimi ja parool Vaulti ning integreerida see Nomadiga. Nomad toetab Vaulti natiivselt. Kuid esialgu seadistame Vaultis vajalikud poliitikad Nomadile, need on vÔimalik laadida:

# 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

NĂŒĂŒd, kui oleme loonud vajalikud poliitikad, lisame job.nomad faili task plokki integreerimise Vaultiga:

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

Kasutame authenti tokenite kaudu ja mÀÀran selle otse siin, ka on olemas variant mÀÀrata token kÀivitamisel nomad agenti muutuja kaudu:

$ VAULT_TOKEN= nomad agent -config /path/to/config

NĂŒĂŒd saame kasutada vĂ”tmeid Vaultist. Tööprincip on lihtne: loome failis Nomad job, mis sisaldab muutujate vÀÀrtusi, nĂ€iteks:

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
}

Nii lihtsa lĂ€henemisega saab seadistada konteinerite saatmist Nomadi klastrisse ja hiljem sellega töötada. Pean ĂŒtlema, et mingil mÀÀral meeldib mulle Nomad – see sobib paremini vĂ€iksematele projektidele, kus Kubernetes vĂ”ib tuua lisajĂ”udlust ja ei realiseeri oma potentsiaali tĂ€ielikult. Lisaks sobib Nomad suurepĂ€raselt algajatele – see on lihtsalt paigaldatav ja konfigureeritav. Siiski, testides mĂ”ningate projektidega, olen kohanud probleeme selle varasemate versioonidega – paljusid pĂ”hilisi funktsioone lihtsalt pole vĂ”i need töötavad valesti. Sellegipoolest usun, et Nomad areneb edasi ja tulevikus saab sellest brauserivahend, mis pakub kĂ”igile vajalikke funktsioone.

Autor: Ilya Andrejev, Alexei Ćœadan ja ‚Live Linux‘ meeskonna toimetusel


Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster