Nggawe kluster Nomad nggunakake Konsul lan nggabungake karo Gitlab

Pambuka

Bubar, popularitas Kubernetes saya tambah kanthi cepet - luwih akeh proyek sing ngetrapake. Aku pengin ndemek orkestra kaya Nomad: cocog kanggo proyek sing wis nggunakake solusi liyane saka HashiCorp, contone, Vault lan Konsul, lan proyek kasebut ora rumit babagan infrastruktur. Materi iki bakal ngemot instruksi kanggo nginstal Nomad, nggabungake rong simpul dadi kluster, uga nggabungake Nomad karo Gitlab.

Nggawe kluster Nomad nggunakake Konsul lan nggabungake karo Gitlab

bangku test

Sithik babagan bangku test: telung server virtual digunakake kanthi karakteristik 2 CPU, 4 RAM, 50 Gb SSD, digabung dadi jaringan lokal umum. Jeneng lan alamat 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

Instalasi Nomad, Konsul. Nggawe kluster Nomad

Ayo dadi miwiti karo instalasi dhasar. Senajan persiyapan iku prasaja, Aku bakal njlèntrèhaké kanggo integritas artikel: iki ateges digawe saka konsep lan cathetan kanggo akses cepet yen perlu.

Sadurunge miwiti praktik, kita bakal ngrembug babagan teoritis, amarga ing tahap iki penting kanggo mangerteni struktur mangsa ngarep.

Kita duwe rong kelenjar nomad lan kita pengin gabungke menyang kluster, lan ing mangsa ngarep kita uga butuh skala kluster otomatis - kanggo iki kita butuh Konsul. Kanthi alat iki, clustering lan nambah simpul anyar dadi tugas banget prasaja: simpul Nomad digawe nyambung menyang agen Konsul, lan banjur nyambung menyang klompok Nomad ana. Mulane, ing wiwitan kita bakal nginstal server Konsul, ngatur wewenang http dhasar kanggo panel web (tanpa wewenang minangka standar lan bisa diakses ing alamat eksternal), uga agen Konsul dhewe ing server Nomad, sawise iku kita mung bakal nerusake kanggo Nomad.

Nginstal alat HashiCorp gampang banget: intine, kita mung mindhah file binar menyang direktori bin, nyiyapake file konfigurasi alat kasebut, lan nggawe file layanan.

Ngundhuh file binar Konsul lan unpack menyang direktori ngarep pangguna:

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/

Saiki kita duwe binar konsul sing wis siap kanggo konfigurasi luwih lanjut.

Kanggo nggarap Konsul, kita kudu nggawe kunci unik nggunakake printah keygen:

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

Ayo pindhah menyang nyetel konfigurasi Konsul, nggawe direktori /etc/consul.d/ kanthi struktur ing ngisor iki:

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

Direktori bootstrap bakal ngemot file konfigurasi config.json - ing kono kita bakal nyetel setelan Konsul. Isine:

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

Ayo ndeleng arahan utama lan maknane kanthi kapisah:

  • bootstrap: bener. Kita ngaktifake tambahan otomatis simpul anyar yen disambungake. Aku Wigati sing kita ora nuduhake kene nomer pas simpul samesthine.
  • server: bener. Aktifake mode server. Konsul ing mesin virtual iki saiki bakal dadi siji-sijine server lan master, VM Nomad bakal dadi klien.
  • Datacenter: dc1. Nemtokake jeneng pusat data kanggo nggawe kluster. Sampeyan kudu identik ing klien lan server.
  • encrypt: Panjenengan-kunci. Tombol, sing uga kudu unik lan cocog ing kabeh klien lan server. Digawe nggunakake printah keygen konsul.
  • miwiti_gabung. Ing dhaptar iki, kita nuduhake dhaptar alamat IP sing bakal disambungake. Ing wayahe kita ninggalake mung alamat kita dhewe.

Ing titik iki kita bisa mbukak konsul nggunakake baris perintah:

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

Iki minangka cara sing apik kanggo debug saiki, nanging sampeyan ora bakal bisa nggunakake metode iki kanthi terus-terusan amarga alasan sing jelas. Ayo nggawe file layanan kanggo ngatur Konsul liwat systemd:

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

Isi file 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

Bukak Konsul liwat systemctl:

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

Ayo priksa: layanan kita kudu mlaku, lan kanthi nglakokake perintah anggota konsul kita kudu ndeleng server kita:

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

Tahap sabanjure: nginstal Nginx lan nyetel proxying lan wewenang http. Kita nginstal nginx liwat manajer paket lan ing direktori /etc/nginx/sites-enabled kita nggawe file konfigurasi consul.conf kanthi isi ing ngisor iki:

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

Aja lali nggawe file .htpasswd lan nggawe jeneng pangguna lan sandhi. Item iki dibutuhake supaya panel web ora kasedhiya kanggo kabeh wong sing ngerti domain kita. Nanging, nalika nyiyapake Gitlab, kita kudu ninggalake iki - yen ora, kita ora bakal bisa masang aplikasi kita menyang Nomad. Ing proyekku, Gitlab lan Nomad mung ana ing web abu-abu, mula ora ana masalah ing kene.

Ing rong server sing isih ana, kita nginstal agen Konsul miturut pandhuan ing ngisor iki. Kita mbaleni langkah-langkah kanthi file binar:

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/

Kanthi analogi karo server sadurunge, kita nggawe direktori kanggo file konfigurasi /etc/consul.d kanthi struktur ing ngisor iki:

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

Isi file 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
     }

Simpen pangowahan lan pindhah menyang nyetel file layanan, isine:

/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

Kita miwiti konsul ing server. Saiki, sawise diluncurake, kita kudu ndeleng layanan sing dikonfigurasi ing anggota nsul. Iki tegese wis kasil nyambung menyang kluster minangka klien. Baleni padha ing server kapindho lan sawise iku kita bisa miwiti nginstal lan configuring Nomad.

Instalasi Nomad sing luwih rinci diterangake ing dokumentasi resmi. Ana rong cara instalasi tradisional: ndownload file binar lan kompilasi saka sumber. Aku bakal milih cara pisanan.

komentar: Proyèk iki berkembang cepet banget, nganyari anyar asring dirilis. Mbok menawa versi anyar bakal dirilis nalika artikel iki rampung. Mulane, sadurunge maca, aku nyaranake mriksa versi Nomad saiki lan ndownload.

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

Sawise mbongkar, kita bakal nampa file binar Nomad sing bobote 65 MB - kudu dipindhah menyang /usr/local/bin.

Ayo nggawe direktori data kanggo Nomad lan ngowahi file layanane (kemungkinan ora bakal ana ing wiwitan):

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

Tempel garis ing ngisor iki ing kana:

[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

Nanging, kita ora cepet-cepet mbukak nomad - kita durung nggawe file konfigurasi:

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

Struktur direktori pungkasan bakal kaya ing ngisor iki:

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

Berkas nomad.hcl kudu ngemot konfigurasi ing ngisor iki:

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

Isi file 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
}

Aja lali ngganti file konfigurasi ing server kapindho - ing kono sampeyan kudu ngganti nilai arahan http.

Babagan pungkasan ing tahap iki yaiku ngatur Nginx kanggo proxying lan nyetel otorisasi http. Isi berkas 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";
        }
        
}

Saiki kita bisa ngakses panel web liwat jaringan eksternal. Sambungake lan pindhah menyang kaca server:

Nggawe kluster Nomad nggunakake Konsul lan nggabungake karo Gitlab
Gambar 1. Dhaptar server ing kluster Nomad

Loro-lorone server kasil ditampilake ing panel, kita bakal weruh bab sing padha ing output perintah status simpul nomad:

Nggawe kluster Nomad nggunakake Konsul lan nggabungake karo Gitlab
Gambar 2. Output perintah status simpul nomad

Kepiye Konsul? Ayo dideleng. Pindhah menyang panel kontrol Konsul, menyang kaca simpul:
Nggawe kluster Nomad nggunakake Konsul lan nggabungake karo Gitlab
Gambar 3. Daftar simpul ing kluster Konsul

Saiki kita duwe Nomad sing disiapake kerja bareng karo Konsul. Ing tahap pungkasan, kita bakal entuk bagean sing nyenengake: nyiyapake pangiriman wadah Docker saka Gitlab menyang Nomad, lan uga ngomong babagan sawetara fitur khas liyane.

Nggawe Gitlab Runner

Kanggo nyebarake gambar docker menyang Nomad, kita bakal nggunakake pelari sing kapisah karo file binar Nomad ing njero (ing kene, kanthi cara, kita bisa nyathet fitur liyane saka aplikasi Hashicorp - kanthi individu minangka file binar siji). Upload menyang direktori runner. Ayo nggawe Dockerfile sing prasaja kanthi konten ing ngisor iki:


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

Ing proyek sing padha, kita nggawe .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}

Akibaté, kita bakal duwe gambar sing kasedhiya saka runner Nomad ing Gitlab Registry, saiki kita bisa langsung menyang repositori proyek, nggawe Pipeline lan ngatur proyek nomad Nomad.

Persiyapan proyek

Ayo dadi miwiti karo file proyek kanggo Nomad. Proyekku ing artikel iki bakal cukup primitif: bakal kalebu siji tugas. Isi .gitlab-ci bakal kaya ing ngisor iki:

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

Ing kene penyebarane ditindakake kanthi manual, nanging sampeyan bisa ngatur kanggo ngganti isi direktori proyek. Pipeline kasusun saka rong tahap: perakitan gambar lan panyebaran menyang nomad. Ing tataran kapisan, kita ngumpulake gambar docker lan push menyang Registry kita, lan ing kaloro kita miwiti proyek ing 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" {}
                }
            }
        }
    }
}

Wigati dimangerteni manawa aku duwe Registry pribadi lan supaya bisa narik gambar docker, aku kudu mlebu. Solusi sing paling apik ing kasus iki yaiku ngetik login lan sandhi menyang Vault lan banjur nggabungake karo Nomad. Nomad asli ndhukung Vault. Nanging dhisik, ayo nginstal kabijakan sing dibutuhake kanggo Nomad ing Vault dhewe; bisa didownload:

# 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

Saiki, sawise nggawe kabijakan sing dibutuhake, kita bakal nambah integrasi karo Vault ing blok tugas ing file job.nomad:

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

Aku nggunakake wewenang dening token lan ndhaptar langsung ing kene, ana uga pilihan kanggo nemtokake token minangka variabel nalika miwiti agen nomad:

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

Saiki kita bisa nggunakake tombol karo Vault. Prinsip operasi gampang: kita nggawe file ing proyek Nomad sing bakal nyimpen nilai variabel, contone:

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
}

Kanthi pendekatan sing prasaja iki, sampeyan bisa ngatur pangiriman kontaner menyang kluster Nomad lan bisa digunakake ing mangsa ngarep. Aku bakal ngomong sing kanggo sawetara ombone aku sympathize karo Nomad - iku luwih cocok kanggo proyek cilik ngendi Kubernetes bisa nimbulaké kerumitan tambahan lan ora bakal éling potensial lengkap. Kajaba iku, Nomad cocog kanggo pamula-gampang nginstal lan ngatur. Nanging, nalika nyoba sawetara proyek, aku nemoni masalah karo versi awal - akeh fungsi dhasar sing ora ana utawa ora bisa digunakake kanthi bener. Nanging, aku percaya yen Nomad bakal terus berkembang lan ing mangsa ngarep bakal entuk fungsi sing dibutuhake saben wong.

Pengarang: Ilya Andreev, disunting dening Alexey Zhadan lan tim Live Linux


Source: www.habr.com

Add a comment