Pag-set up sa usa ka Nomad cluster uban sa Consul ug pag-integrate sa Gitlab

Pasiuna

Karong bag-o, ang pagkapopular sa Kubernetes kusog nga mitubo - nagkadaghang mga proyekto ang nagpatuman niini sa balay. Gusto nakong hikapon ang usa ka orkestra sama sa Nomad: perpekto kini alang sa mga proyekto diin ang ubang mga solusyon gikan sa HashiCorp, sama sa Vault ug Consul, gigamit na, ug ang mga proyekto mismo dili komplikado sa mga termino sa imprastraktura. Kini nga artikulo maghatag mga panudlo alang sa pag-install sa Nomad, paghiusa sa duha ka mga node sa usa ka cluster, ug pag-integrate sa Nomad sa Gitlab.

Pag-set up sa usa ka Nomad cluster uban sa Consul ug pag-integrate sa Gitlab

pagsulay stand

Usa ka gamay bahin sa test bench: tulo ka virtual server nga adunay mga kinaiya sa 2 CPU, 4 RAM, 50 Gb SSD ang gigamit, nagkahiusa sa usa ka komon nga lokal nga network. Ang ilang mga ngalan ug mga adres sa IP:

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

Pag-instalar sa Nomad, Consul. Paghimo og Nomad Cluster

Magsugod kita sa sukaranan nga pag-install. Bisan pa sa kasayon ​​sa pag-instalar, akong ihulagway kini alang sa integridad sa artikulo: sa pagkatinuod, kini gimugna gikan sa mga draft ug mga nota alang sa dali nga pag-access sa kaso sa panginahanglan.

Sa wala pa ipadayon ang pagpraktis, atong hisgutan ang teoretikal nga bahin, tungod kay sa kini nga yugto hinungdanon nga masabtan ang umaabot nga istruktura.

Adunay kami duha ka nomad node ug gusto namon nga i-combine sila sa usa ka cluster, alang usab sa umaabot kinahanglan namon ang awtomatikong pag-scale sa cluster - alang niini kinahanglan namon ang Consul. Uban niini nga himan, ang pag-cluster ug pagdugang sa bag-ong mga node nahimong usa ka yano nga buluhaton: ang gibuhat nga Nomad node nagkonektar sa ahente sa Consul, pagkahuman kini nagkonektar sa kasamtangan nga Nomad cluster. Busa, sa sinugdanan atong i-install ang Consul server, i-configure ang batakang pagtugot sa http para sa web panel (kini pinaagi sa default nga walay pagtugot ug mahimong ma-access sa usa ka eksternal nga adres), ingon man ang mga ahente sa Consul mismo sa Nomad server, human nga ipadayon lang nato sa Nomad.

Ang pag-instalar sa mga galamiton sa HashiCorp yano ra kaayo: sa esensya, ibalhin lang namo ang binary file ngadto sa direktoryo sa bin, i-set up ang configuration file sa himan, ug mugnaon ang service file niini.

I-download ang Consul binary ug i-extract kini sa home directory sa user:

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/

Kami karon adunay consul binary nga andam alang sa dugang nga pag-customize.

Aron makigtambayayong sa Consul, kinahanglan namong maghimo ug talagsaong yawe gamit ang keygen command:

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

Mopadayon kita sa pag-configure sa Consul, paghimo og direktoryo /etc/consul.d/ nga adunay mosunod nga istruktura:

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

Ang bootstrap directory maglangkob sa config.json configuration file - niini atong ibutang ang Consul settings. Ang sulod niini:

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

Atong analisahon nga gilain ang mga nag-unang direktiba ug ang mga kahulugan niini:

  • bootstrap: tinuod. I-enable ang awtomatik nga pagdugang sa bag-ong mga node kung konektado kini. Namatikdan nako nga wala namo gipakita dinhi ang eksaktong gidaghanon sa gipaabot nga mga node.
  • server: tinuod. I-on ang server mode. Ang konsul niining virtual nga makina ang molihok isip bugtong server ug master sa pagkakaron, ang Nomad's VM mahimong mga kliyente.
  • datacenter: dc1. Ipiho ang ngalan sa data center aron mahimo ang cluster. Kinahanglan nga parehas kini sa mga kliyente ug mga server.
  • Encrypt:imong-key. Ang yawe, nga kinahanglan usab nga talagsaon ug magkatugma sa tanan nga mga kliyente ug mga server. Gihimo gamit ang consul keygen command.
  • pagsugod_pag-apil. Niini nga lista, among gipiho ang usa ka lista sa mga IP adres diin himuon ang koneksyon. Sa pagkakaron, atong gibilin lamang ang atong kaugalingong adres.

Niini nga punto, makasugod kita sa konsul gamit ang command line:

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

Kini usa ka maayong paagi sa pag-debug karon, bisan pa, dili kini molihok sa usa ka permanente nga basehan alang sa klaro nga mga hinungdan. Magbuhat ta ug service file para madumala ang Consul pinaagi sa systemd:

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

Ang sulod sa file sa 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

Pagdalag Consul pinaagi sa systemctl:

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

Among gisusi: ang among serbisyo kinahanglan nga modagan, ug pinaagi sa pagpadagan sa consul nga mga membro sa sugo nga among makita ang among server:

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

Ang sunod nga lakang: pag-instalar sa Nginx ug pag-set up sa proxying, pagtugot sa http. I-install ang nginx pinaagi sa package manager ug sa /etc/nginx/sites-enabled directory paghimo ug consul.conf configuration file nga adunay mosunod nga sulod:

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

Ayaw kalimot paghimo ug .htpasswd file ug paghimo ug username ug password para niini. Kini nga butang gikinahanglan aron ang web panel dili magamit sa tanan nga nakaila sa among domain. Bisan pa, kung mag-set up sa Gitlab, kinahanglan namon nga isalikway kini - kung dili, dili namon ma-deploy ang among aplikasyon sa Nomad. Sa akong proyekto, ang Gitlab ug Nomad naa ra sa grey network, mao nga wala’y ingon nga problema dinhi.

Sa nahabilin nga duha ka mga server, i-install ang mga ahente sa Consul sumala sa mosunod nga mga panudlo. Gisubli namon ang mga lakang gamit ang binary file:

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/

Pinaagi sa analohiya sa miaging server, naghimo kami usa ka direktoryo alang sa mga file sa pag-configure /etc/consul.d nga adunay mosunod nga istruktura:

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

Kontento sa config.json file:

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

Gitipigan namon ang mga pagbag-o ug gipadayon ang pag-set up sa file sa serbisyo, ang mga sulud niini mao ang:

/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

Nagsugod kami sa konsul sa server. Karon, pagkahuman magsugod, kinahanglan naton makita ang gi-configure nga serbisyo sa mga miyembro sa nsul. Kini magpasabot nga siya malampuson nga nakonektar sa cluster isip usa ka kliyente. Balika ang parehas sa ikaduha nga server ug pagkahuman mahimo naton magsugod sa pag-install ug pag-configure sa Nomad.

Ang usa ka mas detalyado nga pag-instalar sa Nomad gihulagway sa opisyal nga dokumentasyon niini. Adunay duha ka tradisyonal nga pamaagi sa pag-install: pag-download sa binary file ug pag-compile gikan sa gigikanan. Pilion ko ang una nga paagi.

Примечание: ang proyekto dali nga nag-uswag, ang mga bag-ong update kanunay nga gipagawas. Tingali, sa panahon nga ang artikulo makompleto, usa ka bag-ong bersyon ang ipagawas. Busa, sa wala pa magbasa, girekomenda nako nga susihon ang karon nga bersyon sa Nomad ug i-download kini.

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

Pagkahuman sa pag-unpack, makakuha kami usa ka 65 MB Nomad binary file - kinahanglan kini ibalhin sa /usr/local/bin.

Maghimo kita og direktoryo sa datos alang sa Nomad ug i-edit ang file sa serbisyo niini (tingali wala kini sa pagsugod):

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

Isulod ang mosunod nga mga linya didto:

[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

Bisan pa, wala kami magdali sa paglansad sa nomad - wala pa namo nahimo ang configuration file niini:

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

Ang resulta nga istruktura sa direktoryo mao ang mosunod:

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

Ang nomad.hcl file kinahanglang adunay mosunod nga configuration:

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

Server.hcl file sulod:

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
}

Ayaw kalimti ang pag-usab sa configuration file sa ikaduhang server - kinahanglan nimo nga usbon ang bili sa http directive didto.

Ang katapusan nga butang sa kini nga yugto mao ang pag-set up sa Nginx sa proxy ug pag-install sa pagtugot sa http. Mga sulod sa nomad.conf file:

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

Karon mahimo na namon nga ma-access ang web panel sa gawas nga network. Sumpaysumpaya ug adto sa pahina sa mga server:

Pag-set up sa usa ka Nomad cluster uban sa Consul ug pag-integrate sa Gitlab
Hulagway 1. Listahan sa mga server sa usa ka Nomad cluster

Ang duha ka mga server malampuson nga gipakita sa panel, atong makita ang parehas sa output sa nomad node status command:

Pag-set up sa usa ka Nomad cluster uban sa Consul ug pag-integrate sa Gitlab
Hulagway 2. Nomad node status command output

Unsa man ang Consul? Atong tan-awon. Adto sa Consul control panel, ngadto sa nodes page:
Pag-set up sa usa ka Nomad cluster uban sa Consul ug pag-integrate sa Gitlab
Hulagway 3. Listahan sa mga node sa cluster sa Consul

Karon kami adunay Nomad nga andam, nagtrabaho kauban ang Consul. Sa katapusan nga yugto, moadto kami sa labing makapaikag nga bahin: i-set up namon ang paghatud sa mga sudlanan sa Docker gikan sa Gitlab hangtod sa Nomad, ug hisgutan usab ang pipila sa uban pang mga lahi nga bahin niini.

Paghimo og Gitlab Runner

Aron ma-deploy ang mga docker nga mga imahe sa Nomad, mogamit kami usa ka lahi nga runner nga adunay binary file sa Nomad sa sulod (dinhi, sa ingon, usa pa nga bahin sa mga aplikasyon sa Hashicorp ang mamatikdan - matag usa sila ra ang binary file). I-upload kini sa direktoryo sa runner. Maghimo kita usa ka yano nga Dockerfile alang niini nga adunay mosunod nga sulud:


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

Sa parehas nga proyekto, paghimo .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}

Ingon usa ka sangputanan, makabaton kami usa ka magamit nga imahe sa Nomad runner sa Gitlab Registry, karon mahimo na kami direkta nga moadto sa repositoryo sa proyekto, maghimo usa ka Pipeline ug i-set up ang nomad nga trabaho sa Nomad.

Pag-setup sa proyekto

Magsugod ta sa file sa trabaho para sa Nomad. Ang akong proyekto niini nga artikulo mahimong karaan: kini naglangkob sa usa ka buluhaton. Ang sulod sa .gitlab-ci mao ang mosunod:

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

Dinhi, ang pag-deploy gihimo nga mano-mano, apan mahimo nimo kini i-configure aron mabag-o ang sulud sa direktoryo sa proyekto. Ang pipeline, sa laing bahin, naglangkob sa duha ka mga yugto: gikan sa asembliya sa imahe ug ang pag-deploy niini ngadto sa nomad. Sa una nga yugto, among gitukod ang docker nga imahe ug iduso kini sa among Registry, ug sa ikaduhang yugto, among gilunsad ang among trabaho sa 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" {}
                }
            }
        }
    }
}

Palihug timan-i nga ako adunay usa ka pribado nga Registry ug alang sa usa ka malampuson nga pagbira sa docker nga imahe kinahanglan nako nga mag-log in niini. Ang labing kaayo nga solusyon sa kini nga kaso mao ang pagtapos sa pag-login ug password sa Vault ug dayon i-integrate kini sa Nomad. Gisuportahan sa Nomad ang Vault nga lumad. Apan una, sa Vault mismo, among itakda ang kinahanglan nga mga palisiya alang sa Nomad, mahimo silang ma-download:

# 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

Karon, sa paghimo sa gikinahanglan nga mga palisiya, kami makadugang sa integrasyon sa Vault sa task block sa job.nomad file:

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

Gigamit nako ang pagtugot sa token ug isulat kini direkta dinhi, adunay usa usab nga kapilian nga ipiho ang token ingon usa ka variable sa pagsugod sa nomad nga ahente:

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

Karon magamit na namo ang mga yawe sa Vault. Ang prinsipyo sa operasyon yano ra: naghimo kami usa ka file sa trabaho sa Nomad nga magtipig sa mga kantidad sa mga variable, pananglitan:

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
}

Uban niining yano nga pamaagi, mahimo nimong i-set up ang paghatod sa mga sudlanan sa Nomad cluster ug magtrabaho uban niini sa umaabot. Isulti ko nga sa usa ka sukod naluoy ako sa Nomad - kini mas angay alang sa gagmay nga mga proyekto diin ang Kubernetes mahimong hinungdan sa dugang nga mga kalisud ug dili makaamgo sa tibuuk nga potensyal niini. Dugang pa, ang Nomad maayo alang sa mga nagsugod - dali nga i-install ug i-configure. Bisan pa, kung gisulayan ang pipila nga mga proyekto, nasugatan nako ang problema sa una nga mga bersyon niini - daghang mga sukaranan nga mga gimbuhaton wala gyud o wala sila molihok sa husto. Bisan pa, nagtuo ako nga ang Nomad magpadayon sa pag-uswag ug sa umaabot makuha niini ang mga gimbuhaton nga gikinahanglan sa tanan.

Awtor: Ilya Andreev, giedit ni Alexey Zhadan ug sa Live Linux team


Source: www.habr.com

Idugang sa usa ka comment