Консулыг ашиглан Nomad кластер байгуулж, Gitlab-тай нэгтгэх

Танилцуулга

Сүүлийн үед Kubernetes-ийн нэр хүнд хурдацтай өсч байна - улам олон төсөл үүнийг хэрэгжүүлж байна. Би Номад шиг найрал хөгжимчний тухай ярихыг хүссэн: энэ нь HashiCorp-ийн бусад шийдлүүдийг аль хэдийн ашиглаж байгаа төслүүдэд тохиромжтой, жишээ нь Vault болон Consul, төслүүд нь өөрөө дэд бүтцийн хувьд нарийн төвөгтэй биш юм. Энэ материал нь Nomad-ийг суулгах, хоёр зангилааг кластер болгон нэгтгэх, мөн Nomad-ийг Gitlab-тай нэгтгэх зааврыг агуулсан болно.

Консулыг ашиглан Nomad кластер байгуулж, Gitlab-тай нэгтгэх

Туршилтын тавиур

Туршилтын ширээний талаар бага зэрэг: 2 CPU, 4 RAM, 50 Gb SSD шинж чанартай гурван виртуал серверийг ашигладаг бөгөөд нийтлэг дотоод сүлжээнд нэгдсэн. Тэдний нэр, IP хаяг:

  1. nomad-livelinux-01: 172.30.0.5
  2. nomad-livelinux-02: 172.30.0.10
  3. консул-livelinux-01: 172.30.0.15

Nomad-ийн суурилуулалт, Консул. Nomad кластер байгуулах

Үндсэн суулгацаас эхэлье. Хэдийгээр тохиргоо нь энгийн байсан ч нийтлэлийн бүрэн бүтэн байдлын үүднээс би үүнийг тайлбарлах болно: энэ нь шаардлагатай үед хурдан нэвтрэх зорилгоор ноорог, тэмдэглэлээс хийгдсэн болно.

Дадлага хийхээсээ өмнө бид онолын хэсгийг хэлэлцэх болно, учир нь энэ үе шатанд ирээдүйн бүтцийг ойлгох нь чухал юм.

Бидэнд хоёр нүүдэлчин зангилаа байгаа бөгөөд бид тэдгээрийг нэгтгэх хүсэлтэй байгаа бөгөөд ирээдүйд автомат кластерийн масштаб хэрэгтэй болно - үүний тулд бидэнд консул хэрэгтэй болно. Энэ хэрэгслийн тусламжтайгаар кластер хийх, шинэ зангилаа нэмэх нь маш энгийн ажил болж хувирдаг: үүсгэсэн Nomad зангилаа нь Консулын төлөөлөгчтэй холбогдож, дараа нь одоо байгаа Nomad кластерт холбогддог. Тиймээс эхэнд бид Консул серверийг суулгаж, вэб самбарт зориулсан үндсэн http зөвшөөрлийг тохируулах (энэ нь анхдагчаар зөвшөөрөлгүй бөгөөд гадаад хаягаар хандах боломжтой), мөн Консулын агентууд өөрсдөө Nomad серверүүд дээр ажиллах болно. Бид зөвхөн Номад руу явна.

HashiCorp-ийн хэрэгслүүдийг суулгах нь маш энгийн: үндсэндээ бид хоёртын файлыг хогийн сан руу зөөж, хэрэгслийн тохиргооны файлыг тохируулж, үйлчилгээний файлыг үүсгэнэ.

Консулын хоёртын файлыг татаж аваад хэрэглэгчийн гэрийн лавлах руу задлаарай:

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/

Одоо бид цаашдын тохиргоонд зориулж бэлэн консулын хоёртын файлтай байна.

Консултай ажиллахын тулд бид keygen командыг ашиглан өвөрмөц түлхүүр үүсгэх хэрэгтэй.

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

Дараах бүтэцтэй /etc/consul.d/ лавлах үүсгэн Консулын тохиргоогоо үргэлжлүүлье.

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

Ачаалах лавлах нь config.json тохиргооны файлыг агуулж байх болно - үүнд бид Консулын тохиргоог хийх болно. Түүний агуулга:

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

Үндсэн заавар, тэдгээрийн утгыг тусад нь авч үзье.

  • эхлүүлэгч: үнэн. Хэрэв холбогдсон бол бид шинэ зангилааг автоматаар нэмэхийг идэвхжүүлдэг. Хүлээгдэж буй зангилааны тоог бид энд заагаагүй гэдгийг би тэмдэглэж байна.
  • сервер: үнэн. Серверийн горимыг идэвхжүүлнэ үү. Энэхүү виртуал машин дээрх консул нь одоогоор цорын ганц сервер, мастераар ажиллах бөгөөд үйлчлүүлэгч нь Номадын VM байх болно.
  • мэдээллийн төв: dc1. Кластер үүсгэхийн тулд дата төвийн нэрийг зааж өгнө үү. Энэ нь үйлчлүүлэгч болон серверийн аль алинд нь адилхан байх ёстой.
  • шифрлэх: таны түлхүүр. Түлхүүр нь өвөрмөц байх ёстой бөгөөд бүх үйлчлүүлэгч болон серверүүд дээр таарч байх ёстой. Consul keygen командыг ашиглан үүсгэсэн.
  • нэгдэх_эхлэх. Энэ жагсаалтад бид холболт хийх IP хаягуудын жагсаалтыг заана. Одоогоор бид зөвхөн өөрсдийн хаягийг үлдээж байна.

Энэ үед бид тушаалын мөрийг ашиглан консулыг ажиллуулж болно:

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

Энэ нь одоо дибаг хийх сайн арга боловч тодорхой шалтгааны улмаас та энэ аргыг байнга ашиглах боломжгүй болно. Консулыг systemd-ээр удирдах үйлчилгээний файл үүсгэцгээе:

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

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

Systemctl-ээр дамжуулан Консулыг ажиллуулна уу:

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

Шалгаж үзье: манай үйлчилгээ ажиллаж байх ёстой бөгөөд консулын гишүүдийн тушаалыг гүйцэтгэснээр бид серверээ харах болно:

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

Дараагийн шат: Nginx суулгаж, прокси болон http зөвшөөрлийг тохируулах. Бид багц менежерээр дамжуулан nginx-г суулгаж, /etc/nginx/sites-enabled лавлах дотор дараах контент бүхий consul.conf тохиргооны файлыг үүсгэнэ.

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

.htpasswd файл үүсгэж, түүнд хэрэглэгчийн нэр, нууц үг үүсгэхээ бүү мартаарай. Вэб самбарыг манай домэйныг мэддэг хүн бүрт ашиглах боломжгүй байхын тулд энэ зүйл шаардлагатай. Гэсэн хэдий ч Gitlab-ийг тохируулахдаа бид үүнийг орхих хэрэгтэй болно - эс тэгвээс бид програмаа Nomad-д байршуулах боломжгүй болно. Миний төсөлд Gitlab болон Nomad хоёулаа зөвхөн саарал вэб дээр байдаг тул энд ийм асуудал байхгүй.

Үлдсэн хоёр сервер дээр бид дараах зааврын дагуу консулын агентуудыг суулгадаг. Бид хоёртын файлтай алхмуудыг давтана:

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/

Өмнөх сервертэй ижил төстэй байдлаар бид дараах бүтэцтэй /etc/consul.d тохиргооны файлуудын лавлах үүсгэнэ.

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

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
     }

Өөрчлөлтүүдийг хадгалаад үйлчилгээний файл, түүний агуулгыг тохируулах руу шилжинэ үү:

/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

Бид сервер дээр консул ажиллуулна. Одоо, ажиллуулсны дараа бид nsul гишүүдэд тохируулсан үйлчилгээг харах ёстой. Энэ нь кластерт үйлчлүүлэгчийн хувьд амжилттай холбогдсон гэсэн үг юм. Хоёрдахь сервер дээр ижил зүйлийг давтаж, үүний дараа бид Nomad-ийг суулгаж, тохируулж эхэлнэ.

Nomad-ийн илүү нарийвчилсан суурилуулалтыг албан ёсны баримт бичигт тайлбарласан болно. Суулгах уламжлалт хоёр арга байдаг: хоёртын файлыг татаж авах, эх сурвалжаас эмхэтгэх. Би эхний аргыг сонгох болно.

тайлбар: Төсөл маш хурдан хөгжиж байна, шинэ шинэчлэлтүүд ихэвчлэн гардаг. Магадгүй энэ нийтлэл дуусахад шинэ хувилбар гарах байх. Тиймээс уншихаасаа өмнө Номад-ын одоогийн хувилбарыг шалгаж, татаж авахыг зөвлөж байна.

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

Савласаны дараа бид 65 МБ жинтэй Nomad хоёртын файлыг хүлээн авах болно - үүнийг /usr/local/bin руу зөөх ёстой.

Nomad-д өгөгдлийн лавлах үүсгээд түүний үйлчилгээний файлыг засъя (энэ нь эхэндээ байхгүй байх магадлалтай):

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

Дараах мөрүүдийг тэнд буулгана уу.

[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

Гэсэн хэдий ч бид nomad-ийг эхлүүлэх гэж яарахгүй байна - бид түүний тохиргооны файлыг хараахан үүсгээгүй байна:

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

Төгсгөлийн лавлах бүтэц нь дараах байдалтай байна.

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

nomad.hcl файл нь дараах тохиргоог агуулсан байх ёстой:

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

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
}

Хоёрдахь сервер дээрх тохиргооны файлыг өөрчлөхөө бүү мартаарай - тэнд та http зааврын утгыг өөрчлөх шаардлагатай болно.

Энэ үе шатанд хамгийн сүүлчийн зүйл бол Nginx-ийг прокси хийх, http зөвшөөрлийг тохируулах явдал юм. 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";
        }
        
}

Одоо бид гадаад сүлжээгээр вэб самбарт хандах боломжтой. Холбогдох ба серверийн хуудас руу очно уу:

Консулыг ашиглан Nomad кластер байгуулж, Gitlab-тай нэгтгэх
Зураг 1. Nomad кластер дахь серверүүдийн жагсаалт

Хоёр сервер хоёулаа самбар дээр амжилттай гарч ирсэн тул бид нүүдлийн зангилааны статус командын гаралтад ижил зүйлийг харах болно.

Консулыг ашиглан Nomad кластер байгуулж, Gitlab-тай нэгтгэх
Зураг 2. Noad node status командын гаралт

Консулыг яах вэ? Ингээд харцгаая. Консулын хяналтын самбар, зангилааны хуудас руу очно уу:
Консулыг ашиглан Nomad кластер байгуулж, Gitlab-тай нэгтгэх
Зураг 3. Консулын кластер дахь зангилааны жагсаалт

Одоо бид Консултай хамтран ажиллах бэлтгэлтэй Номад байна. Эцсийн шатанд бид хөгжилтэй хэсэг рүү орох болно: Гитлабаас Номад руу Docker чингэлэг хүргэх, мөн түүний бусад онцлог шинж чанаруудын талаар ярих болно.

Gitlab Runner үүсгэх

Docker-ийн зургийг Nomad-д байрлуулахын тулд бид дотор нь Nomad хоёртын файлтай тусдаа гүйгчийг ашиглах болно (дашрамд хэлэхэд, бид Hashicorp програмуудын өөр нэг онцлогийг тэмдэглэж болно - тус тусад нь тэдгээр нь нэг хоёртын файл юм). Үүнийг гүйгч лавлах руу байршуулна уу. Дараах агуулга бүхий энгийн Dockerfile үүсгэцгээе.


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

Үүнтэй ижил төслөөр бид .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}

Үүний үр дүнд бид Gitlab бүртгэлд Nomad runner-ийн боломжтой дүрстэй байх болно, одоо бид шууд төслийн репозитор руу орж, Pipeline үүсгэж, Nomad's nomad job-ийг тохируулах боломжтой.

Төслийн тохиргоо

Номад зориулсан ажлын файлаас эхэлье. Энэ нийтлэл дэх миний төсөл нэлээд энгийн байх болно: энэ нь нэг даалгавараас бүрдэх болно. .gitlab-ci-ийн агуулга дараах байдалтай байна.

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

Энд байршуулалт нь гараар хийгддэг, гэхдээ та төслийн лавлах агуулгыг өөрчлөхийн тулд үүнийг тохируулж болно. Дамжуулах хоолой нь зураг угсрах, түүнийг нүүдэлд байрлуулах гэсэн хоёр үе шатаас бүрдэнэ. Эхний шатанд бид докерын дүрсийг цуглуулж, бүртгэлдээ оруулдаг, хоёрдугаарт бид Номад дахь ажлаа эхлүүлдэг.

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

Би хувийн бүртгэлийн газартай бөгөөд докерын дүрсийг амжилттай татахын тулд түүн рүү нэвтрэх шаардлагатайг анхаарна уу. Энэ тохиолдолд хамгийн сайн шийдэл бол Vault-д нэвтрэх нэр, нууц үгээ оруулаад дараа нь Nomad-тэй нэгтгэх явдал юм. Nomad үндсэндээ Vault-г дэмждэг. Гэхдээ эхлээд Vault-д Nomad-д шаардлагатай бодлогуудыг суулгая; тэдгээрийг татаж авч болно:

# 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

Одоо шаардлагатай бодлогуудыг үүсгэсний дараа бид job.nomad файлын ажлын блокт Vault-тай нэгтгэх болно.

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

Би токеноор зөвшөөрлийг ашиглаж, энд шууд бүртгүүлэх боломжтой, мөн нүүдэлчин агентийг эхлүүлэх үед токеныг хувьсагч болгон зааж өгөх сонголт бас бий:

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

Одоо бид түлхүүрүүдийг Vault ашиглан ашиглаж болно. Үйлдлийн зарчим нь энгийн: бид Nomad job-д хувьсагчийн утгыг хадгалах файл үүсгэдэг, жишээлбэл:

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
}

Энэхүү энгийн аргын тусламжтайгаар та Номад кластерт чингэлэг хүргэх тохиргоог хийж, цаашид хамтран ажиллах боломжтой. Би ямар нэг хэмжээгээр Номадыг өрөвдөж байна гэж хэлэх болно - энэ нь Кубернетес нэмэлт төвөгтэй байдлыг үүсгэж болох жижиг төслүүдэд илүү тохиромжтой бөгөөд түүний чадавхийг бүрэн дүүрэн хэрэгжүүлэхгүй байх болно. Нэмж дурдахад Nomad нь эхлэгчдэд төгс тохирно-суулгах, тохируулахад хялбар. Гэсэн хэдий ч, зарим төслүүд дээр туршилт хийх үед би түүний анхны хувилбаруудад асуудал тулгардаг - олон үндсэн функцууд зүгээр л байхгүй эсвэл тэдгээр нь зөв ажиллахгүй байна. Гэхдээ “Номад” цаашдаа хөгжиж, цаашид хүн бүрт хэрэгтэй функцуудыг эзэмшинэ гэдэгт итгэж байна.

Зохиогч: Илья Андреев, Алексей Жадан болон Live Linux багийн найруулсан


Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх