Giriş
Son zamanlar Kubernetes-in populyarlığı sürətlə artır - getdikcə daha çox layihə həyata keçirir. Mən Nomad kimi bir orkestrə toxunmaq istədim: o, artıq HashiCorp-un digər həllərindən, məsələn, Vault və Konsuldan istifadə edən layihələr üçün mükəmməldir və layihələrin özü infrastruktur baxımından mürəkkəb deyil. Bu materialda Nomad-ın quraşdırılması, iki qovşağın klasterdə birləşdirilməsi, həmçinin Nomad-ın Gitlab ilə inteqrasiyası üçün təlimatlar olacaq.
Test stendi
Test skamyası haqqında bir az: ümumi lokal şəbəkədə birləşdirilmiş 2 CPU, 4 RAM, 50 Gb SSD xüsusiyyətləri ilə üç virtual server istifadə olunur. Onların adları və IP ünvanları:
- köçəri-livelinux-01: 172.30.0.5
- köçəri-livelinux-02: 172.30.0.10
- konsul-livelinux-01: 172.30.0.15
Nomad, konsulun quraşdırılması. Nomad klasterinin yaradılması
Əsas quraşdırma ilə başlayaq. Quraşdırma sadə olsa da, məqalənin bütövlüyü naminə onu təsvir edəcəyəm: o, lazım olduqda tez daxil olmaq üçün əsasən qaralama və qeydlərdən yaradılmışdır.
Təcrübəyə başlamazdan əvvəl nəzəri hissəni müzakirə edəcəyik, çünki bu mərhələdə gələcək strukturu başa düşmək vacibdir.
Bizim iki köçəri qovşağımız var və biz onları klasterdə birləşdirmək istəyirik və gələcəkdə bizə avtomatik klaster miqyası da lazım olacaq - bunun üçün bizə Konsul lazım olacaq. Bu alətlə klasterləşmə və yeni qovşaqların əlavə edilməsi çox sadə işə çevrilir: yaradılmış Nomad node Konsul agentinə qoşulur, sonra isə mövcud Nomad klasterinə qoşulur. Buna görə də, başlanğıcda biz Konsul serverini quraşdıracağıq, veb panel üçün əsas http avtorizasiyasını konfiqurasiya edəcəyik (o, standart olaraq icazəsizdir və xarici ünvandan istifadə edilə bilər), həmçinin Nomad serverlərində Konsul agentlərinin özlərini, bundan sonra biz yalnız Nomada davam edəcəyik.
HashiCorp alətlərini quraşdırmaq çox sadədir: mahiyyətcə, biz sadəcə ikili faylı zibil qovluğuna köçürür, alətin konfiqurasiya faylını quraşdırırıq və onun xidmət faylını yaradırıq.
Konsul binar faylını yükləyin və onu istifadəçinin ev kataloquna açın:
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/
İndi əlavə konfiqurasiya üçün hazır konsul binarımız var.
Konsulla işləmək üçün keygen əmrindən istifadə edərək unikal açar yaratmalıyıq:
root@consul-livelinux-01:~# consul keygen
Konsul konfiqurasiyasının qurulmasına keçək, aşağıdakı strukturu olan /etc/consul.d/ kataloqunu yaradaq:
/etc/consul.d/
├── bootstrap
│ └── config.json
Bootstrap kataloqunda config.json konfiqurasiya faylı olacaq - orada biz Konsul parametrlərini təyin edəcəyik. Onun məzmunu:
{
"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"]
}
Əsas direktivlərə və onların mənalarına ayrıca baxaq:
- Bootstrap: doğru. Yeni qovşaqların qoşulduğu halda onların avtomatik əlavə edilməsinə imkan veririk. Qeyd edim ki, biz burada gözlənilən qovşaqların dəqiq sayını göstərmirik.
- server: doğru. Server rejimini aktivləşdirin. Bu virtual maşındakı konsul hazırda yeganə server və master kimi çıxış edəcək, Nomad's VM müştəriləri olacaq.
- məlumat mərkəzi: dc1. Klaster yaratmaq üçün məlumat mərkəzinin adını göstərin. Həm müştərilərdə, həm də serverlərdə eyni olmalıdır.
- şifrelemek: açarınız. Açar, eyni zamanda unikal olmalı və bütün müştərilər və serverlərdə uyğun olmalıdır. Konsul keygen əmrindən istifadə edərək yaradıldı.
- başlamaq_qoşulmaq. Bu siyahıda əlaqənin ediləcəyi IP ünvanlarının siyahısını göstəririk. Hazırda yalnız öz ünvanımızı qoyuruq.
Bu nöqtədə əmr satırından istifadə edərək konsul işlədə bilərik:
root@consul-livelinux-01:~# /usr/local/bin/consul agent -config-dir /etc/consul.d/bootstrap -ui
Bu, indi sazlamağın yaxşı yoludur, lakin məlum səbəblərə görə bu metoddan davamlı olaraq istifadə edə bilməyəcəksiniz. Konsulu systemd vasitəsilə idarə etmək üçün xidmət faylı yaradaq:
root@consul-livelinux-01:~# nano /etc/systemd/system/consul.service
consul.service faylının məzmunu:
[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 vasitəsilə Konsulu işə salın:
root@consul-livelinux-01:~# systemctl start consul
Gəlin yoxlayaq: xidmətimiz işləməlidir və konsul üzvlərinin əmrini yerinə yetirməklə serverimizi görməliyik:
root@consul-livelinux:/etc/consul.d# consul members
consul-livelinux 172.30.0.15:8301 alive server 1.5.0 2 dc1 <all>
Növbəti mərhələ: Nginx-in quraşdırılması və proksi və http avtorizasiyasının qurulması. Paket meneceri vasitəsilə nginx quraşdırırıq və /etc/nginx/sites-enabled kataloqunda aşağıdakı məzmunu olan consul.conf konfiqurasiya faylı yaradırıq:
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 faylı yaratmağı və onun üçün istifadəçi adı və parol yaratmağı unutmayın. Bu element veb panelin bizim domenimizi bilən hər kəs üçün əlçatan olmaması üçün tələb olunur. Bununla belə, Gitlab-ı qurarkən bundan imtina etməli olacağıq - əks halda tətbiqimizi Nomad-a yerləşdirə bilməyəcəyik. Layihəmdə həm Gitlab, həm də Nomad yalnız boz internetdədir, ona görə də burada belə bir problem yoxdur.
Qalan iki serverdə biz aşağıdakı təlimatlara uyğun olaraq Konsul agentlərini quraşdırırıq. İkili fayl ilə addımları təkrarlayırıq:
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/
Əvvəlki serverə bənzətməklə, /etc/consul.d konfiqurasiya faylları üçün aşağıdakı struktura malik kataloq yaradırıq:
/etc/consul.d/
├── client
│ └── config.json
config.json faylının məzmunu:
{
"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
}
Dəyişiklikləri yadda saxlayın və xidmət faylını, onun məzmununu qurmağa davam edin:
/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
Biz serverdə konsulu işə salırıq. İndi işə salındıqdan sonra nsul üzvlərində konfiqurasiya edilmiş xidməti görməliyik. Bu o demək olacaq ki, o, müştəri kimi klasterə uğurla qoşulub. Eyni şeyi ikinci serverdə də təkrarlayın və bundan sonra Nomad-ı quraşdırmağa və konfiqurasiya etməyə başlaya bilərik.
Nomad-ın daha ətraflı quraşdırılması onun rəsmi sənədlərində təsvir edilmişdir. İki ənənəvi quraşdırma üsulu var: binar faylı yükləmək və mənbədən tərtib etmək. Mən birinci üsulu seçəcəyəm.
Qeyd: Layihə çox sürətlə inkişaf edir, tez-tez yeni yeniləmələr buraxılır. Ola bilsin ki, bu məqalə tamamlanana qədər yeni versiya çıxacaq. Buna görə də oxumazdan əvvəl Nomad-ın hazırkı versiyasını yoxlamağı və onu yükləməyi məsləhət görürəm.
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
Paketi açdıqdan sonra biz 65 MB ağırlığında Nomad binar faylını alacağıq - o, /usr/local/bin-ə köçürülməlidir.
Nomad üçün məlumat kataloqu yaradaq və onun xidmət faylını redaktə edək (çox güman ki, əvvəlində mövcud olmayacaq):
root@nomad-livelinux-01:~# mkdir --parents /opt/nomad
root@nomad-livelinux-01:~# nano /etc/systemd/system/nomad.service
Orada aşağıdakı sətirləri yapışdırın:
[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
Bununla belə, biz nomad-ı işə salmağa tələsmirik - onun konfiqurasiya faylını hələ yaratmamışıq:
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
Son kataloq strukturu aşağıdakı kimi olacaq:
/etc/nomad.d/
├── nomad.hcl
└── server.hcl
nomad.hcl faylında aşağıdakı konfiqurasiya olmalıdır:
datacenter = "dc1"
data_dir = "/opt/nomad"
server.hcl faylının məzmunu:
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
}
İkinci serverdə konfiqurasiya faylını dəyişməyi unutmayın - orada http direktivinin dəyərini dəyişməli olacaqsınız.
Bu mərhələdəki son şey Nginx-i proxy etmək və http avtorizasiyasını qurmaq üçün konfiqurasiya etməkdir. nomad.conf faylının məzmunu:
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";
}
}
İndi biz xarici şəbəkə vasitəsilə veb panelə daxil ola bilərik. Qoşulun və serverlər səhifəsinə keçin:
Şəkil 1. Nomad klasterindəki serverlərin siyahısı
Hər iki server uğurla paneldə göstərilir, biz köçəri node status əmrinin çıxışında eyni şeyi görəcəyik:
Şəkil 2. Noad node status əmrinin çıxışı
Bəs konsul? Gəlin nəzər salaq. Konsulun idarəetmə panelinə, qovşaqlar səhifəsinə keçin:
Şəkil 3. Konsul klasterindəki qovşaqların siyahısı
İndi konsulla birlikdə işləyən bir Nomad hazırlamışıq. Son mərhələdə biz əyləncəli hissəyə keçəcəyik: Docker konteynerlərinin Gitlab-dan Nomad-a çatdırılmasını qurmaq, həmçinin onun bəzi digər fərqli xüsusiyyətləri haqqında danışmaq.
Gitlab Runner yaradılması
Docker şəkillərini Nomad-a yerləşdirmək üçün içərisində Nomad binar faylı olan ayrıca runnerdən istifadə edəcəyik (yeri gəlmişkən, Hashicorp tətbiqlərinin başqa bir xüsusiyyətini qeyd edə bilərik - ayrı-ayrılıqda onlar tək ikili fayldır). Onu runner qovluğuna yükləyin. Bunun üçün aşağıdakı məzmunlu sadə Dockerfile yaradaq:
FROM alpine:3.9
RUN apk add --update --no-cache libc6-compat gettext
COPY nomad /usr/local/bin/nomad
Eyni layihədə biz .gitlab-ci.yml yaradırıq:
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}
Nəticədə, Gitlab Reyestrində Köçəri qaçışçısının mövcud şəklinə sahib olacağıq, indi biz birbaşa layihə deposuna gedə, Boru Kəməri yarada və Nomad-ın köçəri işini konfiqurasiya edə bilərik.
Layihənin qurulması
Nomad üçün iş faylı ilə başlayaq. Bu məqalədəki layihəm olduqca primitiv olacaq: bir vəzifədən ibarət olacaq. .gitlab-ci məzmunu aşağıdakı kimi olacaq:
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
Burada yerləşdirmə əl ilə baş verir, lakin siz onu layihə kataloqunun məzmununu dəyişdirmək üçün konfiqurasiya edə bilərsiniz. Boru kəməri iki mərhələdən ibarətdir: təsvirin yığılması və onun köçəriyə yerləşdirilməsi. Birinci mərhələdə biz doker şəklini yığırıq və onu Reyestrimizə daxil edirik, ikinci mərhələdə isə Nomad-da işimizi işə salırıq.
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" {}
}
}
}
}
}
Nəzərə alın ki, mənim şəxsi reyestrim var və docker şəklini uğurla çəkmək üçün ona daxil olmalıyam. Bu vəziyyətdə ən yaxşı həll Vault-a giriş və parol daxil etmək və sonra onu Nomad ilə inteqrasiya etməkdir. Nomad yerli olaraq Vault-u dəstəkləyir. Ancaq əvvəlcə Vault-da Nomad üçün lazımi siyasətləri quraşdıraq; onları endirmək olar:
# 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
İndi lazımi siyasətləri yaratdıqdan sonra job.nomad faylındakı tapşırıq blokunda Vault ilə inteqrasiya əlavə edəcəyik:
vault {
enabled = true
address = "https://vault.domain.name:8200"
token = "token"
}
Mən token ilə avtorizasiyadan istifadə edirəm və onu birbaşa burada qeydiyyatdan keçirirəm, köçəri agenti işə salarkən tokeni dəyişən kimi göstərmək seçimi də var:
$ VAULT_TOKEN=<token> nomad agent -config /path/to/config
İndi biz Vault ilə açarlardan istifadə edə bilərik. Əməliyyat prinsipi sadədir: biz Nomad işində dəyişənlərin dəyərlərini saxlayacaq bir fayl yaradırıq, məsələn:
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
}
Bu sadə yanaşma ilə siz Nomad klasterinə konteynerlərin çatdırılmasını konfiqurasiya edə və gələcəkdə onunla işləyə bilərsiniz. Deyim ki, mən Nomad-a müəyyən dərəcədə rəğbət bəsləyirəm - bu, Kubernetes-in əlavə mürəkkəblik yarada biləcəyi və bütün potensialını reallaşdıra bilməyəcəyi kiçik layihələr üçün daha uyğundur. Üstəlik, Nomad yeni başlayanlar üçün mükəmməldir - onu quraşdırmaq və konfiqurasiya etmək asandır. Bununla belə, bəzi layihələrdə sınaqdan keçirərkən onun ilkin versiyalarında problemlə qarşılaşıram - bir çox əsas funksiyalar sadəcə orada yoxdur və ya düzgün işləmir. Bununla belə, inanıram ki, “Nomad” bundan sonra da inkişaf edəcək və gələcəkdə hər kəsə lazım olan funksiyaları qazanacaq.
Müəllif: İlya Andreev, Alexey Jadan və Live Linux komandası tərəfindən redaktə edilmişdir
Mənbə: www.habr.com