Pendahuluan
Baru-baru ini, popularitas Kubernetes berkembang pesat - semakin banyak proyek yang mengimplementasikannya di rumah. Saya ingin menyentuh orkestra seperti Nomad: sangat cocok untuk proyek yang sudah menggunakan solusi lain dari HashiCorp, misalnya, Vault dan Konsul, dan proyek itu sendiri tidak rumit dalam hal infrastruktur. Artikel ini akan memberikan instruksi untuk menginstal Nomad, menggabungkan dua node ke dalam cluster, dan mengintegrasikan Nomad dengan Gitlab.

Test stand
Sedikit tentang bangku tes: tiga server virtual digunakan dengan karakteristik 2 CPU, 4 RAM, 50 Gb SSD, disatukan dalam jaringan lokal umum. Nama dan alamat IP mereka:
- nomad-livelinux-01 : 172.30.0.5
- nomad-livelinux-02 : 172.30.0.10
- consul-livelinux-01 : 172.30.0.15
Pemasangan Nomad, Konsul. Membuat Kelompok Nomad
Mari kita lanjutkan ke instalasi dasar. Terlepas dari kemudahan instalasi, saya akan menjelaskannya untuk integritas artikel: sebenarnya, ia dibuat dari konsep dan catatan untuk akses cepat jika perlu.
Sebelum memulai praktik, kita akan membahas bagian teoretis, karena pada tahap ini penting untuk memahami struktur masa depan.
Kami memiliki dua nomad node dan kami ingin menggabungkan mereka ke dalam sebuah cluster, dan untuk masa depan kita akan membutuhkan penskalaan otomatis dari cluster - untuk ini kita perlu Consul. Menggunakan alat ini, pengelompokan dan penambahan node baru menjadi tugas yang sangat sederhana: simpul Nomad yang dibuat terhubung ke agen Konsul, dan kemudian terhubung ke cluster Nomad yang ada. Oleh karena itu, pada awalnya kita akan menginstal server Konsul, mengkonfigurasi otorisasi http dasar untuk panel web (ini secara default tanpa otorisasi dan dapat diakses oleh alamat eksternal), serta agen Konsul sendiri di server Nomad, setelah itu kita baru saja memulai Nomad.
Menginstal alat HashiCorp sangat sederhana: pada kenyataannya, kami hanya memindahkan file biner ke direktori bin, mengkonfigurasi file konfigurasi alat, dan membuat file layanannya.
Unduh file biner Konsul dan buka di direktori home pengguna:
root@consul-livelinux-01:~
Sekarang kami memiliki file konsul biner siap pakai untuk konfigurasi lebih lanjut.
Untuk bekerja dengan Konsul, kita perlu membuat kunci unik menggunakan perintah keygen:
root@consul-livelinux-01:~
Mari kita lanjutkan untuk mengkonfigurasi konfigurasi Konsul, buat direktori /etc/consul.d/ dengan struktur berikut:
/etc/consul.d/ ├── bootstrap │ └── config.json
Direktori bootstrap akan berisi file konfigurasi config.json - di dalamnya kita akan mengatur pengaturan Konsul. Isinya:
{ "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"] }
Mari kita periksa secara terpisah arahan utama dan artinya:
- bootstrap : true. Kami mengaktifkan penambahan otomatis dari simpul baru jika terhubung. Saya perhatikan bahwa kami tidak mengindikasikan jumlah pasti dari simpul yang diharapkan di sini.
- server : benar. Aktifkan mode server. Konsul di mesin virtual ini akan menjadi satu-satunya server dan master saat ini, VM Nomad akan menjadi klien.
- pusat data : dc1. Tentukan nama pusat data untuk membuat cluster. Itu harus identik pada klien dan server.
- mengenkripsi : kunci Anda. Kunci yang juga harus unik dan cocok dengan semua klien dan server. Dihasilkan menggunakan perintah consul keygen.
- start_join . Dalam daftar ini, kami menunjukkan daftar alamat IP yang akan digunakan sambungannya. Saat ini, kami hanya meninggalkan alamat kami sendiri.
Pada titik ini, kita dapat mulai konsul menggunakan baris perintah:
root@consul-livelinux-01:~
Ini adalah cara yang baik untuk melakukan debug sekarang, namun, secara berkelanjutan, menggunakan metode ini tidak akan berfungsi karena alasan yang jelas. Buat file layanan untuk mengelola Konsul melalui systemd:
root@consul-livelinux-01:~
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
Jalankan Konsul melalui systemctl:
root@consul-livelinux-01:~
Kami memeriksa: layanan kami harus dimulai, dan dengan menjalankan perintah anggota konsul kita harus melihat server kami:
root@consul-livelinux:/etc/consul.d
Langkah selanjutnya: menginstal Nginx dan mengatur proxy, otorisasi http. Instal nginx melalui manajer paket dan buat file konfigurasi consul.conf di direktori / etc / nginx / sites-enabled dengan konten berikut:
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"; } }
Jangan lupa untuk membuat file .htpasswd dan menghasilkan nama pengguna dan kata sandi untuknya. Item ini diperlukan agar panel web tidak dapat diakses oleh semua orang yang mengetahui domain kami. Namun, ketika mengonfigurasi Gitlab, kita harus meninggalkan ini - jika tidak kita tidak akan bisa menggunakan aplikasi kita ke Nomad. Dalam proyek saya, baik Gitlab dan Nomad hanya ada di jaringan abu-abu, jadi tidak ada masalah seperti itu.
Di dua server lain, instal agen Konsul sesuai dengan instruksi berikut. Ulangi langkah-langkah dengan file biner:
root@nomad-livelinux-01:~
Dengan analogi dengan server sebelumnya, kami membuat direktori untuk file konfigurasi /etc/consul.d dengan struktur berikut:
/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 } }
Kami menyimpan perubahan dan melanjutkan ke konfigurasi file layanan, isinya:
/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
Kami mulai konsul di server. Sekarang, setelah memulai, kita akan melihat layanan yang dikonfigurasi di anggota nsul. Ini berarti bahwa ia berhasil terhubung ke cluster sebagai klien. Ulangi hal yang sama pada server kedua dan setelah itu kami akan dapat mulai menginstal dan mengkonfigurasi Nomad.
Instalasi Nomad yang lebih rinci dijelaskan dalam dokumentasi resminya. Ada dua metode instalasi tradisional: mengunduh file biner dan kompilasi dari sumber. Saya akan memilih metode pertama.
Catatan : proyek ini berkembang sangat cepat, pembaruan baru sering keluar. Mungkin versi baru akan dirilis pada saat artikel ini selesai. Karena itu, saya sarankan sebelum membaca periksa versi Nomad saat ini dan unduh.
root@nomad-livelinux-01:~
Setelah membongkar, kita akan mendapatkan file biner Nomad'a dengan berat 65 MB - harus dipindahkan ke / usr / local / bin.
Buat direktori data untuk Nomad dan edit file layanannya (kemungkinan besar tidak akan ada di awal):
root@nomad-livelinux-01:~
Masukkan baris berikut di sana:
[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
Namun, kami tidak terburu-buru menjalankan nomad - kami belum membuat file konfigurasinya:
root@nomad-livelinux-01:~
Struktur direktori terakhir adalah sebagai berikut:
/etc/nomad.d/ ├── nomad.hcl └── server.hcl
File nomad.hcl harus berisi konfigurasi berikut:
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 }
Jangan lupa untuk mengubah file konfigurasi pada server kedua - di sana Anda harus mengubah nilai direktif http.
Yang terakhir pada tahap ini adalah konfigurasi Nginx untuk proxy dan pengaturan otorisasi http. Isi 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"; } }
Sekarang kita dapat mengakses panel web melalui jaringan eksternal. Kami terhubung dan pergi ke halaman server:
Gambar 1. Daftar server dalam cluster Nomad
Kedua server berhasil ditampilkan di panel, hal yang sama akan kita lihat di output perintah status node nomad:
Gambar 2. Output dari perintah status node nomad
Bagaimana dengan Konsul? Ayo lihat. Pergi ke panel kontrol Konsul, ke halaman node:
Gambar 3. Daftar node dalam cluster Konsul
Sekarang kami telah menyiapkan Nomad, bekerja bersama dengan Konsul. Pada tahap akhir, kita akan memulai bagian yang paling menarik: kita akan mengkonfigurasi pengiriman kontainer Docker dari Gitlab ke Nomad, dan juga berbicara tentang beberapa fitur khas lainnya.
Buat Gitlab Runner
Untuk menyebarkan gambar buruh pelabuhan ke Nomad, kami akan menggunakan pelari terpisah dengan file biner Nomad di dalamnya (di sini, omong-omong, satu lagi fitur aplikasi Hashicorp dapat dicatat - secara individual mereka adalah satu-satunya file biner). Unduh ke direktori pelari. Baginya, buat Dockerfile paling sederhana dengan konten berikut:
FROM alpine:3.9 RUN apk add --update --no-cache libc6-compat gettext COPY nomad /usr/local/bin/nomad
Dalam proyek yang sama, buat .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}
Sebagai hasilnya, kita akan memiliki gambar pelari Nomad yang dapat diakses di Gitlab Registry, sekarang kita dapat langsung menuju repositori proyek, membuat Pipeline, dan mengonfigurasi nomad pekerjaan Nomad.
Penyiapan proyek
Mari kita mulai dengan file pekerjaan untuk Nomad. Proyek saya di artikel ini akan sangat primitif: itu akan terdiri dari satu tugas. Isi .gitlab-ci adalah sebagai berikut:
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 sini penyebaran terjadi dalam mode manual, tetapi Anda dapat mengonfigurasinya untuk mengubah konten direktori proyek. Pipeline terdiri dari dua tahap: dari perakitan gambar dan penyebarannya ke nomad. Pada tahap pertama, kami mengumpulkan gambar buruh pelabuhan dan mendorongnya ke dalam Registry kami, pada tahap kedua, kami meluncurkan pekerjaan kami 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" {} } } } } }
Harap dicatat bahwa saya memiliki Registry pribadi dan untuk kumpulan gambar buruh pelabuhan yang berhasil, saya harus masuk ke sana. Solusi terbaik dalam hal ini adalah memasukkan login dan kata sandi di Vault dengan integrasi selanjutnya dengan Nomad. Secara nominal mendukung Vault. Tetapi pertama-tama, di Vault itu sendiri, kami akan menginstal kebijakan yang diperlukan untuk Nomad, Anda dapat mengunduhnya:
Sekarang, setelah membuat kebijakan yang diperlukan, kami akan menambahkan integrasi dengan Vault di blok tugas di file job.nomad:
vault { enabled = true address = "https://vault.domain.name:8200" token = "token" }
Saya menggunakan otorisasi oleh token dan menulisnya langsung di sini, ada juga opsi untuk menentukan token sebagai variabel saat menjalankan agen nomad:
$ VAULT_TOKEN=<token> nomad agent -config /path/to/config
Sekarang kita bisa menggunakan kunci dengan Vault. Prinsip operasi sederhana: kami membuat file dalam pekerjaan Nomad, yang akan menyimpan nilai-nilai variabel, misalnya:
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 }
Dengan pendekatan sederhana ini, Anda dapat mengonfigurasi pengiriman kontainer ke cluster Nomad dan bekerja dengannya di masa mendatang. Saya akan mengatakan bahwa sampai batas tertentu saya bersimpati dengan Nomad - itu lebih cocok untuk proyek-proyek kecil di mana Kubernetes dapat menyebabkan kesulitan tambahan dan tidak akan menyadari potensinya sampai akhir. Selain itu, Nomad sangat cocok untuk pemula - mudah untuk menginstal dan mengkonfigurasi. Namun, ketika menguji pada beberapa proyek, saya menemukan masalah pada versi sebelumnya - banyak fungsi dasar tidak ada atau tidak berfungsi dengan benar. Namun demikian, saya percaya bahwa Nomad akan terus berkembang dan di masa depan akan memperoleh semua fungsi yang diperlukan.
Diposting oleh Ilya Andreev, diedit oleh Alexei Zhadan dan Tim Live Linux