Кіріспе
Жақында Kubernetes-тің танымалдығы тез өсуде - оны көбірек жобалар жүзеге асыруда. Мен Nomad сияқты оркестрге тоқталғым келді: бұл HashiCorp басқа шешімдерін қолданатын жобалар үшін өте қолайлы, мысалы, Vault және Consul, және жобалардың өзі инфрақұрылым тұрғысынан күрделі емес. Бұл материалда Nomad орнату, екі түйінді кластерге біріктіру, сондай-ақ Nomad-ты Gitlab-пен біріктіру нұсқаулары болады.
сынақ стенді
Сынақ үстелі туралы аздап: жалпы жергілікті желіге біріктірілген 2 процессор, 4 жедел жады, 50 Гб SSD сипаттамалары бар үш виртуалды сервер қолданылады. Олардың аттары мен IP мекенжайлары:
- nomad-livelinux-01: 172.30.0.5
- nomad-livelinux-02: 172.30.0.10
- консул-livelinux-01: 172.30.0.15
Nomad орнату, консул. Nomad кластерін құру
Негізгі орнатудан бастайық. Орнату қарапайым болғанымен, мен оны мақаланың тұтастығы үшін сипаттаймын: ол қажет болған кезде жылдам қол жеткізу үшін жобалар мен ескертпелер негізінде жасалған.
Практиканы бастамас бұрын біз теориялық бөлімді талқылаймыз, өйткені бұл кезеңде болашақ құрылымды түсіну маңызды.
Бізде екі көшпенді түйін бар және біз оларды кластерге біріктіргіміз келеді, болашақта бізге кластерді автоматты түрде масштабтау қажет болады - бұл үшін бізге консул қажет. Бұл құралдың көмегімен жаңа түйіндерді кластерлеу және қосу өте қарапайым тапсырмаға айналады: құрылған Nomad түйіні Консул агентіне қосылады, содан кейін бар Nomad кластеріне қосылады. Сондықтан, басында біз Консул серверін орнатамыз, веб-панель үшін негізгі http авторизациясын конфигурациялаймыз (ол әдепкі бойынша рұқсатсыз және оған сыртқы мекенжай бойынша кіруге болады), сондай-ақ Nomad серверлеріндегі консул агенттерінің өздерін де конфигурациялаймыз. біз тек 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
Bootstrap каталогында 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"]
}
Негізгі директиваларды және олардың мағыналарын бөлек қарастырайық:
- жүктеу: шын. Егер олар қосылған болса, біз жаңа түйіндерді автоматты түрде қосуды қосамыз. Мен мұнда күтілетін түйіндердің нақты санын көрсетпейтінімізді ескертемін.
- сервер: шын. Сервер режимін қосыңыз. Осы виртуалды машинадағы консул қазіргі уақытта жалғыз сервер және мастер ретінде әрекет етеді, Nomad's 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-қосылған каталогта келесі мазмұны бар 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-тың толығырақ орнатылуы оның ресми құжаттамасында сипатталған. Орнатудың екі дәстүрлі әдісі бар: екілік файлды жүктеп алу және көзден құрастыру. Мен бірінші әдісті таңдаймын.
ескерту: Жоба өте жылдам дамып келеді, жаңа жаңартулар жиі шығарылады. Мүмкін, бұл мақала аяқталғанша жаңа нұсқасы шығарылады. Сондықтан, оқымас бұрын, қазіргі уақытта 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";
}
}
Енді біз сыртқы желі арқылы веб-панельге қол жеткізе аламыз. Қосылыңыз және серверлер бетіне өтіңіз:
Сурет 1. Nomad кластеріндегі серверлер тізімі
Екі сервер де панельде сәтті көрсетілді, біз көшпенді түйін күйі пәрменінің шығысында бірдей нәрсені көреміз:
Сурет 2. Көшпелі түйін күйі командасының шығысы
Консул ше? Қарап көрейік. Консулдың басқару тақтасына, түйіндер бетіне өтіңіз:
Сурет 3. Консул кластеріндегі түйіндер тізімі
Қазір бізде Консулмен бірігіп жұмыс істейтін дайын Nomad бар. Соңғы кезеңде біз қызықты бөлікке өтеміз: Gitlab-тен Nomad-қа Docker контейнерлерін жеткізуді орнату, сонымен қатар оның басқа да ерекше ерекшеліктері туралы сөйлесеміз.
Gitlab Runner жасау
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 жүгірушісінің қол жетімді кескіні болады, енді біз тікелей жоба репозиторийіне өтіп, Pipeline жасай аламыз және Nomad's nomad жұмысын конфигурациялай аламыз.
Жобаны орнату
Nomad үшін жұмыс файлынан бастайық. Бұл мақаладағы менің жобам өте қарапайым болады: ол бір тапсырмадан тұрады. .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
Мұнда орналастыру қолмен орындалады, бірақ оны жоба каталогының мазмұнын өзгерту үшін конфигурациялауға болады. Құбыр екі кезеңнен тұрады: кескінді құрастыру және оны көшпендіге орналастыру. Бірінші кезеңде біз докер кескінін жинап, оны тізілімге енгіземіз, ал екіншісінде 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" {}
}
}
}
}
}
Менің жеке тізілім бар екенін және докер кескінін сәтті шығару үшін оған кіруім керек екенін ескеріңіз. Бұл жағдайда ең жақсы шешім - 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 жұмысында айнымалы мәндерді сақтайтын файл жасаймыз, мысалы:
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 кластеріне контейнерлерді жеткізуді конфигурациялауға және болашақта онымен жұмыс істеуге болады. Мен Nomad-қа белгілі бір дәрежеде жанашыр екенімді айтайын - бұл Кубернетес қосымша күрделілік тудыруы мүмкін және оның әлеуетін толық іске асырмайтын шағын жобалар үшін қолайлы. Сонымен қатар, Nomad жаңадан бастаушылар үшін өте қолайлы — оны орнату және конфигурациялау оңай. Дегенмен, кейбір жобаларда тестілеу кезінде мен оның бастапқы нұсқаларында мәселеге тап болдым - көптеген негізгі функциялар жай жоқ немесе олар дұрыс жұмыс істемейді. Дегенмен, «Номад» одан әрі дамып, болашақта барлығына қажетті функцияларды иеленетініне сенемін.
Авторы: Илья Андреев, өңдеген Алексей Жадан және Live Linux командасы
Ақпарат көзі: www.habr.com