Nyetel klaster Nomad nganggo Konsul sareng ngahijikeun sareng Gitlab

perkenalan

Anyar-anyar ieu, popularitas Kubernetes parantos ngembang pesat - beuki seueur proyék anu ngalaksanakeunana. Abdi hoyong nyabak orchestrator sapertos Nomad: éta sampurna pikeun proyék-proyék anu parantos nganggo solusi sanés ti HashiCorp, contona, Vault sareng Konsul, sareng proyék-proyék sorangan henteu rumit dina hal infrastruktur. Bahan ieu bakal ngandung paréntah pikeun masang Nomad, ngagabungkeun dua titik kana klaster, ogé ngahijikeun Nomad sareng Gitlab.

Nyetel klaster Nomad nganggo Konsul sareng ngahijikeun sareng Gitlab

bangku tés

Sakedik ngeunaan bangku tés: tilu server virtual dianggo kalayan karakteristik 2 CPU, 4 RAM, 50 Gb SSD, dihijikeun kana jaringan lokal umum. Ngaran jeung alamat IP maranéhanana:

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

Pamasangan Nomad, Konsul. Nyieun klaster Nomad

Hayu urang mimitian ku instalasi dasar. Sanaos pangaturan éta saderhana, kuring bakal ngajelaskeun éta demi integritas tulisan: éta dasarna diciptakeun tina draf sareng catetan pikeun aksés gancang nalika diperyogikeun.

Sateuacan urang ngawitan latihan, urang bakal ngabahas bagian téoritis, sabab dina tahap ieu hal anu penting pikeun ngarti struktur hareup.

Kami gaduh dua titik nomaden sareng kami badé ngahijikeun kana klaster, sareng ka hareup urang ogé peryogi skala klaster otomatis - pikeun ieu kami peryogi Konsul. Kalayan alat ieu, clustering jeung nambahkeun titik anyar janten tugas basajan pisan: Nomad dijieun titik nyambung ka agén Konsul, lajeng nyambung ka Nomad cluster aya. Ku alatan éta, dina awalna urang bakal masang server Konsul, ngonpigurasikeun otorisasina http dasar pikeun panel wéb (éta tanpa otorisasi sacara standar sareng tiasa diaksés dina alamat éksternal), ogé agén Konsul sorangan dina server Nomad, saatos éta. urang ngan bakal neruskeun ka Nomad.

Masang alat HashiCorp saderhana pisan: dasarna, urang ngan ukur mindahkeun file binér kana diréktori bin, nyetél file konfigurasi alat, sareng nyiptakeun file jasa na.

Unduh file biner Konsul sareng bongkar kana diréktori bumi 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/

Ayeuna urang gaduh binér konsul siap-siap pikeun konfigurasi salajengna.

Pikeun damel sareng Konsul, urang kedah nyiptakeun konci unik nganggo paréntah keygen:

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

Hayu urang ngaléngkah ka nyetel konfigurasi Konsul, nyieun hiji diréktori /etc/consul.d/ kalawan struktur handap:

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

Diréktori bootstrap bakal ngandung file konfigurasi config.json - di dinya urang bakal nyetél setélan Konsul. eusina:

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

Hayu urang tingali diréktif utama sareng hartosna nyalira:

  • bootstrap: leres. Urang ngaktifkeun tambahan otomatis titik anyar lamun disambungkeun. Kuring dicatet yén kami henteu nunjukkeun di dieu jumlah pasti tina titik ekspektasi.
  • server: leres. Aktipkeun mode server. Konsul dina mesin virtual ieu bakal janten hiji-hijina server sareng master dina waktos ayeuna, Nomad's VM bakal janten klien.
  • datacenter:dc1. Sebutkeun nami puseur data pikeun nyieun klaster. Éta kedah sami dina duanana klien sareng server.
  • encrypt: Anjeun-konci. Konci, anu ogé kedah unik sareng cocog dina sadaya klien sareng server. Dihasilkeun maké paréntah keygen konsul.
  • start_join. Dina daptar ieu kami nunjukkeun daptar alamat IP anu sambunganna bakal dilakukeun. Di momen urang ninggalkeun ngan alamat urang sorangan.

Dina titik ieu urang tiasa ngajalankeun konsul nganggo garis paréntah:

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

Ieu mangrupikeun cara anu saé pikeun debug ayeuna, tapi anjeun moal tiasa nganggo metode ieu terus-terusan kusabab alesan anu jelas. Hayu urang ngadamel file jasa pikeun ngatur Konsul via systemd:

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

Eusi 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

Ngajalankeun Konsul via systemctl:

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

Hayu urang parios: jasa urang kedah jalan, sareng ku ngalaksanakeun paréntah anggota konsul urang kedah ningali server kami:

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

Tahap salajengna: masang Nginx sareng nyetél proxying sareng otorisasi http. Urang masang nginx ngaliwatan manajer pakét sareng dina diréktori /etc/nginx/sites-enabled urang nyiptakeun file konfigurasi consul.conf kalayan eusi di handap ieu:

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

Tong hilap ngadamel file .htpasswd sareng ngahasilkeun nami pangguna sareng kecap konci pikeun éta. Item ieu diperyogikeun supados panel wéb henteu sayogi pikeun sadayana anu terang domain kami. Nanging, nalika nyetél Gitlab, urang kedah ngantunkeun ieu - upami henteu, urang moal tiasa nyebarkeun aplikasi urang ka Nomad. Dina proyék kuring, duanana Gitlab sareng Nomad ngan ukur dina wéb abu, janten teu aya masalah sapertos kitu di dieu.

Dina dua server sésana urang install agén Konsul nurutkeun parentah di handap ieu. Urang ngulang léngkah kalayan file binér:

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/

Ku analogi jeung server saméméhna, urang nyieun hiji diréktori pikeun file konfigurasi /etc/consul.d kalawan struktur handap:

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

Eusi 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 parobahanana sareng teraskeun kana nyetél file jasa, eusina:

/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

Urang ngajalankeun konsul on server. Ayeuna, saatos peluncuran, urang kedah ningali jasa anu dikonpigurasi dina anggota nsul. Ieu bakal hartosna yén éta parantos suksés nyambung ka kluster salaku klien. Ulang sami dina server kadua teras saatos éta urang tiasa ngamimitian masang sareng ngonpigurasikeun Nomad.

Pamasangan Nomad anu langkung lengkep dijelaskeun dina dokuméntasi resmina. Aya dua metode pamasangan tradisional: unduh file binér sareng kompilasi tina sumber. Kuring bakal milih metodeu munggaran.

nyarios: Proyék ngembang pisan gancang, apdet anyar sering dileupaskeun. Panginten versi énggal bakal dileupaskeun nalika tulisan ieu réngsé. Kukituna, sateuacan maca, kuring nyarankeun parios versi Nomad ayeuna sareng unduh.

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

Saatos ngabongkar, urang bakal nampi file binér Nomad anu beuratna 65 MB - éta kedah dipindahkeun ka /usr/local/bin.

Hayu urang ngadamel diréktori data pikeun Nomad sareng ngédit file jasa na (paling dipikaresep moal aya di awal):

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

Tempelkeun garis-garis ieu di dinya:

[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, kami henteu buru-buru ngaluncurkeun nomad - kami henteu acan nyiptakeun file konfigurasina:

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 diréktori ahir bakal kieu:

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

Berkas nomad.hcl kedah ngandung konfigurasi ieu:

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

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

Tong hilap ngarobih file konfigurasi dina server kadua - di dinya anjeun kedah ngarobih nilai diréktif http.

Hal anu terakhir dina tahap ieu nyaéta ngonpigurasikeun Nginx pikeun proxying sareng nyetél otorisasi http. Eusi file 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";
        }
        
}

Ayeuna urang tiasa ngaksés panel wéb ngalangkungan jaringan éksternal. Sambungkeun sareng angkat ka halaman server:

Nyetel klaster Nomad nganggo Konsul sareng ngahijikeun sareng Gitlab
Gambar 1 Daptar server dina klaster Nomad

Kadua server suksés ditampilkeun dina panel, urang bakal ningali hal anu sami dina kaluaran paréntah status titik nomad:

Nyetel klaster Nomad nganggo Konsul sareng ngahijikeun sareng Gitlab
Gambar 2 Kaluaran paréntah status titik nomad

Kumaha upami Konsul? Hayu urang tingali. Pindah ka panel kontrol Konsul, ka kaca titik:
Nyetel klaster Nomad nganggo Konsul sareng ngahijikeun sareng Gitlab
Gambar 3 Daptar titik dina klaster Konsul

Ayeuna kami gaduh Nomad anu disiapkeun damel babarengan sareng Konsul. Dina tahap ahir, urang bakal angkat ka bagian anu pikaresepeun: nyetél pangiriman wadah Docker ti Gitlab ka Nomad, sareng ogé nyarioskeun sababaraha fitur has anu sanés.

Nyiptakeun Gitlab Runner

Pikeun nyebarkeun gambar docker ka Nomad, kami bakal nganggo runner anu misah sareng file binér Nomad di jero (di dieu, ku jalan kitu, urang tiasa nyatet fitur sanés tina aplikasi Hashicorp - masing-masing mangrupikeun file binér tunggal). Unggah ka diréktori runner. Hayu urang ngadamel Dockerfile saderhana pikeun éta kalayan eusi ieu:


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

Dina proyék sarua urang nyieun .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}

Hasilna, urang bakal boga gambar sadia tina runner Nomad dina Gitlab Registry, ayeuna urang bisa langsung ka Repository proyék, nyieun Pipeline sarta ngonpigurasikeun pakasaban nomad urang.

Setélan proyék

Hayu urang mimitian ku file pakasaban pikeun Nomad. Proyék kuring dina tulisan ieu bakal rada primitif: éta bakal diwangun ku hiji tugas. Eusi .gitlab-ci bakal kieu:

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

Di dieu deployment lumangsung sacara manual, tapi anjeun bisa ngonpigurasikeun eta pikeun ngarobah eusi diréktori proyék. Pipeline diwangun ku dua tahap: assembly gambar na deployment -na pikeun nomad. Dina tahap kahiji, urang ngumpul gambar docker sarta nyorong kana pendaptaran urang, sarta dina kadua urang ngajalankeun pakasaban urang di 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" {}
                }
            }
        }
    }
}

Punten dicatet yén kuring gaduh pendaptaran swasta sareng pikeun suksés narik gambar docker kuring kedah lebet kana éta. Solusi anu pangsaéna dina hal ieu nyaéta ngalebetkeun login sareng kecap akses kana Vault teras ngahijikeun sareng Nomad. Nomad asli ngadukung Vault. Tapi ke heula, hayu urang pasang kawijakan anu dipikabutuh pikeun Nomad di Vault sorangan; aranjeunna tiasa diunduh:

# 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

Ayeuna, saatos nyiptakeun kawijakan anu diperyogikeun, kami bakal nambihan integrasi sareng Vault dina blok tugas dina file job.nomad:

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

Kuring nganggo otorisasi ku token sareng ngadaptarkeun langsung di dieu, aya ogé pilihan pikeun nangtukeun token salaku variabel nalika ngamimitian agén nomad:

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

Ayeuna urang tiasa nganggo konci sareng Vault. Prinsip operasi saderhana: urang nyiptakeun file dina padamelan Nomad anu bakal nyimpen nilai-nilai variabel, contona:

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
}

Kalayan pendekatan saderhana ieu, anjeun tiasa ngonpigurasikeun pangiriman wadah ka kluster Nomad sareng damel sareng éta di hareup. Kuring bakal disebutkeun yen mun extent sababaraha kuring simpati ka Nomad - éta leuwih cocog pikeun proyék-proyék leutik dimana Kubernetes bisa ngabalukarkeun pajeulitna tambahan sarta moal sadar poténsi pinuh na. Tambih Deui, Nomad sampurna pikeun pamula-gampang dipasang sareng dikonpigurasikeun. Nanging, nalika nguji sababaraha proyék, kuring mendakan masalah sareng versi awalna - seueur fungsi dasarna henteu aya atanapi henteu jalanna leres. Nanging, kuring yakin yén Nomad bakal terus ngembangkeun sareng ka hareupna bakal kéngingkeun fungsi anu diperyogikeun ku sadayana.

Panulis: Ilya Andreev, diédit ku Alexey Zhadan sareng tim Live Linux


sumber: www.habr.com

Tambahkeun komentar