مقدمه
در این آموزش، ما یک خوشه HashiCorp Nomad را با Consul برای کشف سرویس و گرهها راهاندازی خواهیم کرد.
با ۳ گره سرور و تعداد دلخواهی از گرههای کلاینت، این تنظیم میتواند به عنوان پایهای برای پروژههای در حال رشد عمل کند.
همچنین یک Snapshot از Hetzner Cloud برای کلاینتها ایجاد خواهیم کرد که امکان افزودن کلاینتهای بیشتر بدون تنظیم دستی را فراهم میکند.
خوشه بر روی یک شبکه خصوصی بین سرورها اجرا میشود و از تمام ویژگیهای Nomad و Consul به صورت پیشفرض پشتیبانی میکند، مانند کشف سرویس و مدیریت حجمها.
این آموزش تا حدی از مراحل توصیهشده در راهنمای رسمی استقرار Consul و Nomad پیروی میکند.
پیشنیازها
- یک حساب Hetzner Cloud
- دانش پایهای از دستورات لینوکس و شل
- توانایی اتصال به سرور با ssh
- یک سرور Hetzner داشته باشید
این آموزش بر روی سرورهای Ubuntu 24.04 Hetzner Cloud با نسخه Nomad 1.9.3 و Consul 1.20.1 آزمایش شده است.
اصطلاحات و نمادها
دستورات
local$ <command> این دستور باید روی ماشین محلی اجرا شود.
server$ <command> این دستور باید بهعنوان root روی سرور اجرا شود.
مرحله ۱ – ایجاد تصویر پایه
در این مرحله از منبع زیر استفاده خواهد شد:
- ۱ سرور Hetzner Cloud نوع CX22
ما با تنظیم یک سرور Consul / Nomad روی یک سرور جدید CX22 شروع میکنیم. Snapshot ایجادشده بهعنوان تصویر پایه برای تمام سرورهای خوشه و کلاینتها در مراحل بعدی عمل خواهد کرد.
این راهنما تنظیمات برای ۳ سرور را نشان میدهد. این کار خوشه را بسیار در دسترس اما نه چندان گران میسازد. تنظیم یک سرور منفرد توصیه نمیشود، اما ممکن است. آموزش شامل نظراتی در مورد تغییرات مورد نیاز برای ۱ یا بیشتر از ۳ سرور در مراحل مربوطه خواهد بود.
به رابط کاربری وب Hetzner Cloud بروید و یک سرور جدید CX22 با Ubuntu 24.04 ایجاد کنید.
مرحله ۱.۱ – نصب Consul
نصب Consul
برای اطلاعات بیشتر در مورد نسخههای موجود، به وبسایت رسمی مراجعه کنید.
server$ wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
server$ echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/hashicorp.list
server$ apt update && apt install consul
حال میتوانیم قابلیت تکمیل خودکار برای Consul را اضافه کنیم (اختیاری)
server$ consul -autocomplete-install
آمادهسازی گواهیهای TLS برای Consul
server$ consul tls ca create
server$ consul tls cert create -server -dc dc1
server$ consul tls cert create -server -dc dc1
server$ consul tls cert create -server -dc dc1
server$ consul tls cert create -client -dc dc1
اگر میخواهید کمتر یا بیشتر از ۳ سرور در خوشه Consul اجرا کنید، تکرار دستور consul tls cert create -server -dc dc1
را تطبیق دهید.
برای یک سرور خوشه فقط یک گواهی نیاز است، برای ۵ سرور به ۵ گواهی نیاز دارید.
این دستورات ۳ گواهی سرور و یک گواهی کلاینت ایجاد میکنند.
پوشه /root/
اکنون باید حداقل شامل فایلهای زیر باشد:
server$ ls
consul-agent-ca.pem
consul-agent-ca-key.pem
dc1-server-consul-0.pem
dc1-server-consul-0-key.pem
dc1-server-consul-1.pem
dc1-server-consul-1-key.pem
dc1-server-consul-2.pem
dc1-server-consul-2-key.pem
dc1-client-consul-0.pem
dc1-client-consul-0-key.pem
مرحله ۱.۲ – نصب باینری Nomad
نصب Nomad
برای اطلاعات بیشتر در مورد نسخههای موجود، به وبسایت رسمی مراجعه کنید.
server$ wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
server$ echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/hashicorp.list
server$ apt update && apt install nomad
اضافه کردن قابلیت تکمیل خودکار برای Nomad (اختیاری):
server$ nomad -autocomplete-install
فایل تنظیمات زیر را به /etc/nomad.d/nomad.hcl
اضافه کنید:
datacenter = "dc1"
data_dir = "/opt/nomad"
مرحله ۱.۳ – آمادهسازی خدمات systemd
Consul و Nomad باید پس از راهاندازی مجدد بهطور خودکار شروع شوند. برای این کار، یک سرویس systemd برای هرکدام ایجاد کنید.
ابتدا، همه مجوزها را تنظیم کنید:
server$ chown consul:consul dc1-server-consul*
server$ chown consul:consul dc1-client-consul*
server$ chown -R consul:consul /opt/consul
server$ chown -R nomad:nomad /opt/nomad
server$ mkdir -p /opt/alloc_mounts && chown -R nomad:nomad /opt/alloc_mounts
فایل تنظیمات زیر را به /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
ConditionFileNotEmpty=/etc/consul.d/consul.hcl
[Service]
EnvironmentFile=-/etc/consul.d/consul.env
User=consul
Group=consul
ExecStart=/usr/bin/consul agent -config-dir=/etc/consul.d/
ExecReload=/bin/kill --signal HUP $MAINPID
KillMode=process
KillSignal=SIGTERM
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
و فایل تنظیمات زیر را به /etc/systemd/system/nomad.service
اضافه کنید:
[Unit]
Description=Nomad
Documentation=https://www.nomadproject.io/docs/
Wants=network-online.target
After=network-online.target
[Service]
User=nomad
Group=nomad
ExecReload=/bin/kill -HUP $MAINPID
ExecStart=/usr/bin/nomad agent -config /etc/nomad.d
KillMode=process
KillSignal=SIGINT
LimitNOFILE=65536
LimitNPROC=infinity
Restart=on-failure
RestartSec=2
OOMScoreAdjust=-1000
TasksMax=infinity
[Install]
WantedBy=multi-user.target
این سرویسها را هنوز فعال نکنید، زیرا تنظیمات کامل نشده است.
مرحله ۱.۵ – ایجاد Snapshot پایه
در نهایت، سرور را در کنسول Hetzner Cloud متوقف کنید و یک Snapshot ایجاد کنید. این Snapshot بهعنوان پایه برای تنظیم سرور و کلاینتهای خوشه استفاده خواهد شد.
پس از موفقیتآمیز بودن ایجاد Snapshot، نمونه CX22 این مرحله را حذف کنید.
مرحله ۲ – تنظیم سرورهای خوشه
در این مرحله شما ۳ سرور خوشه را از تصویر پایه ایجادشده در مرحله ۱ ایجاد میکنید.
این سرورها اساس خوشه شما را تشکیل میدهند و بهصورت پویا یک رهبر خوشه انتخاب میکنند.
- ۱ شبکه Hetzner Cloud
- ۳ سرور Hetzner Cloud نوع CX22
در کنسول Hetzner Cloud، ۳ سرور CX22 از Snapshot ایجادشده در مرحله ۱ و یک شبکه مشترک Cloud Network ایجاد کنید.
این راهنما از شبکه 10.0.0.0/8 استفاده میکند، اما شبکههای کوچکتر نیز کار خواهند کرد.
در مراحل زیر، آموزش از سرورها با آدرسهای داخلی 10.0.0.2، 10.0.0.3 و 10.0.0.4 یاد خواهد کرد.
اگر سرورهای شما آدرسهای داخلی متفاوتی دارند، در مراحل بعدی آنها را جایگزین کنید.
مرحله ۲.۱ – ایجاد کلید رمزگذاری متقارن
ابتدا، یک کلید رمزگذاری متقارن ایجاد کنید که بین تمام سرورها به اشتراک گذاشته شود. این کلید را در مکان امنی ذخیره کنید؛ در مراحل بعدی به آن نیاز داریم.
server$ consul keygen
مرحله ۲.۲ – پیکربندی Consul
فایل پیکربندی Consul را برای هر سرور ایجاد کنید. این فایل شامل آدرسهای IP داخلی سرورهای دیگر خواهد بود.
برای هر سرور در مسیر /etc/consul.d/consul.hcl
فایل زیر را ایجاد کنید:
datacenter = "dc1" data_dir = "/opt/consul" encrypt = "" ca_file = "/root/consul-agent-ca.pem" cert_file = "/root/dc1-server-consul-0.pem" key_file = "/root/dc1-server-consul-0-key.pem" verify_incoming = true verify_outgoing = true verify_server_hostname = true performance { raft_multiplier = 1 } retry_join = ["10.0.0.2", "10.0.0.3", "10.0.0.4"] bind_addr = "0.0.0.0" client_addr = "0.0.0.0" server = true bootstrap_expect = 3 ui = true
جایگزین کنید <CONSUL_KEY>
را با کلید تولید شده از دستور consul keygen
.
برای سرورهای دیگر، cert_file
و key_file
را تغییر دهید تا مطابق با گواهی مربوط به آن سرور باشد.
مرحله ۲.۳ – پیکربندی Nomad
فایل پیکربندی Nomad را برای هر سرور ایجاد کنید. این فایل در مسیر /etc/nomad.d/nomad.hcl
خواهد بود:
datacenter = "dc1"
data_dir = "/opt/consul"
encrypt = "your-symmetric-encryption-key"
tls {
defaults {
ca_file = "/etc/consul.d/consul-agent-ca.pem"
cert_file = "/etc/consul.d/dc1-server-consul-0.pem"
key_file = "/etc/consul.d/dc1-server-consul-0-key.pem"
verify_incoming = true
verify_outgoing = true
},
internal_rpc {
verify_server_hostname = true
}
}
retry_join = ["10.0.0.2"]
bind_addr = "{{ GetPrivateInterfaces | include \"network\" \"10.0.0.0/8\" | attr \"address\" }}"
acl = {
enabled = true
default_policy = "allow"
enable_token_persistence = true
}
performance {
raft_multiplier = 1
}
جایگزین کنید آدرسهای 10.0.0.x
با آدرس داخلی هر سرور.
مرحله ۲.۴ – فعالسازی و راهاندازی سرویسها
پس از ایجاد فایلهای پیکربندی، Consul و Nomad را به عنوان سرویسهای systemd فعال و راهاندازی کنید:
server$ systemctl enable consul server$ systemctl start consul server$ systemctl enable nomad server$ systemctl start nomad
وضعیت هر سرویس را با استفاده از دستورات زیر بررسی کنید:
server$ systemctl status consul
server$ systemctl status nomad
مرحله ۲.۵ – تأیید خوشه Consul
برای بررسی وضعیت خوشه Consul، دستور زیر را اجرا کنید:
server$ consul members
شما باید لیستی از تمام سرورها و کلاینتهای خوشه را مشاهده کنید. اگر مشکلی وجود دارد، فایلهای پیکربندی را دوباره بررسی کنید و لاگها را بخوانید:
server$ journalctl -u consul
مرحله ۲.۶ – تأیید خوشه Nomad
وضعیت خوشه Nomad را با استفاده از دستور زیر بررسی کنید:
server$ nomad server members
شما باید لیستی از سرورهای Nomad خوشه را مشاهده کنید. اگر مشکلی وجود دارد، فایلهای پیکربندی را بررسی کنید و لاگها را بخوانید:
server$ journalctl -u nomad
مرحله ۲.۷ – بررسی رابط وب
رابط وب Consul و Nomad اکنون باید در دسترس باشند:
- Consul:
http://<SERVER_IP>:8500
- Nomad:
http://<SERVER_IP>:4646
جایگزین کنید <SERVER_IP>
را با آدرس IP عمومی یا خصوصی سرور.
مرحله ۳ – اضافه کردن کلاینتها
اکنون، میتوانید کلاینتهای Nomad را اضافه کنید. این مرحله مشابه تنظیم سرور است، اما با نقش کلاینت.
مرحله ۳.۱ – نصب و پیکربندی کلاینتها
مراحل نصب برای کلاینتهای Nomad مشابه سرورها است. ابتدا Consul و Nomad را بر روی ماشینهای کلاینت نصب کنید.
این مراحل شامل دریافت بستهها و نصب آنهاست.
مرحله ۳.۲ – تنظیم Consul برای کلاینتها
یک فایل پیکربندی Consul در مسیر /etc/consul.d/consul.hcl
ایجاد کنید. برای کلاینتها، پیکربندی سادهتر است:
client {
enabled = true
network_interface = "{{ GetPrivateInterfaces | include \"network\" \"10.0.0.0/8\" | attr \"name\" }}"
}
acl {
enabled = true
}
توجه کنید که آدرسهای IP در retry_join
همان آدرسهای داخلی سرورهای Consul هستند.
فایلهای گواهی و کلید (cert و key) باید مربوط به کلاینت باشند.
مرحله ۳.۳ – تنظیم Nomad برای کلاینتها
فایل پیکربندی Nomad را در مسیر /etc/nomad.d/nomad.hcl
ایجاد کنید. برای کلاینتها، این پیکربندی شامل تنظیمات زیر است:
datacenter = "dc1" data_dir = "/opt/nomad" bind_addr = "0.0.0.0" advertise { http = "10.0.1.2:4646" rpc = "10.0.1.2:4647" serf = "10.0.1.2:4648" } client { enabled = true network_interface = "eth0" servers = ["10.0.0.2:4647", "10.0.0.3:4647", "10.0.0.4:4647"] } tls { http = true rpc = true ca_file = "/root/consul-agent-ca.pem" cert_file = "/root/dc1-client-consul-0.pem" key_file = "/root/dc1-client-consul-0-key.pem" verify_server_hostname = true }
آدرس advertise
باید به آدرس داخلی این کلاینت اشاره کند. همچنین، آدرسهای servers
همان سرورهای Nomad هستند.
مرحله ۳.۴ – فعالسازی و راهاندازی سرویسها
همانند سرورها، سرویسهای Consul و Nomad را برای کلاینتها فعال و راهاندازی کنید:
client$ systemctl enable consul
client$ systemctl start consul
client$ systemctl enable nomad
client$ systemctl start nomad
وضعیت سرویسها را بررسی کنید:
client$ systemctl status consul
client$ systemctl status nomad
مرحله ۳.۵ – بررسی اتصال کلاینتها
مطمئن شوید که کلاینتها به خوشه Consul متصل شدهاند. از یک سرور دستور زیر را اجرا کنید:
server$ consul members
کلاینتها باید در لیست مشاهده شوند. همچنین، برای Nomad:
server$ nomad node status
کلاینتها باید در وضعیت “ready” باشند. اگر مشکلی وجود دارد، فایلهای پیکربندی را بررسی کنید و لاگها را بخوانید:
client$ journalctl -u consul
client$ journalctl -u nomad
مرحله ۴ – اجرای وظایف در Nomad
پس از اطمینان از راهاندازی صحیح، میتوانید وظایف (Jobs) خود را روی Nomad تعریف کنید و اجرا کنید.
یک فایل پیکربندی وظیفه به عنوان مثال ایجاد کنید:
job "example" { datacenters = ["dc1"] group "example-group" { task "example-task" { driver = "docker" config { image = "nginx:latest" } resources { cpu = 500 memory = 256 } } } }
فایل بالا را به نام example.nomad
ذخیره کنید و با دستور زیر اجرا کنید:
server$ nomad job run example.nomad
وضعیت اجرای وظیفه را بررسی کنید:
server$ nomad job status example
نتیجه
با موفقیت یک خوشه Consul و Nomad را راهاندازی کردید. اکنون میتوانید از این زیرساخت برای مدیریت وظایف و سرویسهای خود استفاده کنید.