بلاگ/راه‌اندازی Heat برای Orchestration در OpenStack: ساخت خودکار زیرساخت با قالب‌های HOT روی سرور اختصاصی
به‌روز شده

راه‌اندازی Heat برای Orchestration در OpenStack: ساخت خودکار زیرساخت با قالب‌های HOT روی سرور اختصاصی

1405/07/220 بازدید
راه‌اندازی Heat برای Orchestration در OpenStack: ساخت خودکار زیرساخت با قالب‌های HOT روی سرور اختصاصی

راه‌اندازی Heat برای Orchestration در OpenStack: ساخت خودکار زیرساخت با قالب‌های HOT روی سرور اختصاصی

وقتی تعداد نمونه‌ها، شبکه‌ها و دیسک‌های مجازی در یک محیط OpenStack از چند مورد بیشتر می‌شود، ساخت دستی هرکدام از طریق داشبورد Horizon یا خط فرمان دیگر جواب نمی‌دهد. همین‌جاست که Heat وارد می‌شود؛ سرویس Orchestration رسمی OpenStack که زیرساخت را از روی یک فایل متنی می‌سازد، به‌روزرسانی می‌کند و در صورت نیاز حذف می‌کند.

این راهنما نصب و پیکربندی Heat را روی یک سرور اختصاصی که OpenStack روی آن اجرا می‌شود قدم‌به‌قدم توضیح می‌دهد، بعد با یک قالب HOT واقعی یک استک کامل (شبکه، سرور، فلوتینگ آی‌پی) می‌سازیم و در پایان نحوه مدیریت و به‌روزرسانی استک‌ها را می‌بینیم.

Heat چیست و چه مشکلی را حل می‌کند؟

Heat یک پروژه Orchestration در OpenStack است که زیرساخت را از روی فایل‌های توصیفی به نام HOT (Heat Orchestration Template) می‌سازد. به‌جای اجرای چند دستور جداگانه برای ساخت شبکه، سابنت، روتر، سرور و فلوتینگ آی‌پی، همه این منابع در یک فایل YAML تعریف می‌شوند و Heat آن‌ها را به ترتیب درست و با رعایت وابستگی‌ها می‌سازد.

مزیت اصلی این روش تکرارپذیری است، همان ایده‌ای که در ابزارهای Infrastructure as Code مثل Terraform هم دیده می‌شود. یک قالب که یک‌بار نوشته و تست شده باشد، می‌تواند برای ساخت محیط تست، محیط Staging و محیط Production استفاده شود، بدون این‌که احتمال خطای انسانی در تنظیمات دستی وجود داشته باشد.

تفاوت Heat با ساخت دستی منابع

ویژگیساخت دستی (CLI/Horizon)Heat (HOT Template)
تکرارپذیریهر بار باید دستی تکرار شودبا اجرای مجدد همان فایل
مدیریت وابستگی منابعباید دستی ترتیب رعایت شودHeat ترتیب را خودش مدیریت می‌کند
به‌روزرسانی زیرساختویرایش تک‌تک منابعویرایش فایل + stack-update
نگهداری تاریخچه تغییراتوجود نداردفایل قالب قابل نسخه‌گذاری در Git است
حذف کامل یک محیطحذف تک‌تک منابعیک دستور stack-delete

پیش‌نیازها

قبل از شروع، این موارد باید روی سرور اختصاصی آماده باشد:

  • یک نصب فعال OpenStack با سرویس‌های پایه (Keystone، Nova، Neutron، Glance، Cinder) که کار می‌کنند.
  • دسترسی root یا sudo روی نودی که کنترلر OpenStack روی آن اجرا می‌شود.
  • یک پایگاه‌داده MySQL/MariaDB و RabbitMQ که بقیه سرویس‌های OpenStack هم از آن‌ها استفاده می‌کنند.
  • کلاینت OpenStack (python3-openstackclient) روی ماشینی که از آن قالب‌ها را اجرا می‌کنید.

اگر این پایه هنوز روی سرور اختصاصی شما آماده نشده، ابتدا باید یک محیط OpenStack سالم داشته باشید؛ Heat روی سرویس‌های موجود کار می‌کند و جایگزین هیچ‌کدام از آن‌ها نیست.

نصب سرویس Heat

۱. ساخت پایگاه‌داده

روی نود کنترلر وارد MySQL شوید و پایگاه‌داده و کاربر Heat را بسازید؛ اگر این نود روی سرور اختصاصی جدیدی قرار است راه‌اندازی شود، منابع دیتابیس را متناسب با تعداد استک‌هایی که Heat مدیریت می‌کند در نظر بگیرید:

mysql -u root -p
CREATE DATABASE heat;
GRANT ALL PRIVILEGES ON heat.* TO 'heat'@'localhost' IDENTIFIED BY 'HEAT_DBPASS';
GRANT ALL PRIVILEGES ON heat.* TO 'heat'@'%' IDENTIFIED BY 'HEAT_DBPASS';
FLUSH PRIVILEGES;

۲. ساخت کاربر و سرویس در Keystone

openstack user create --domain default --password-prompt heat
openstack role add --project service --user heat admin
openstack service create --name heat --description "Orchestration" orchestration
openstack service create --name heat-cfn --description "Orchestration CFN" cloudformation

سپس اندپوینت‌های public، internal و admin برای هر دو سرویس ثبت می‌شوند؛ آدرس‌ها باید به پورت‌های پیش‌فرض Heat یعنی ۸۰۰۴ (Orchestration) و ۸۰۰۰ (CFN) اشاره کنند.

۳. نصب پکیج‌ها

روی توزیع‌های مبتنی بر Ubuntu/Debian:

apt install heat-api heat-api-cfn heat-engine

۴. ویرایش فایل پیکربندی

در /etc/heat/heat.conf اطلاعات اتصال به پایگاه‌داده، RabbitMQ و Keystone را تنظیم کنید:


connection = mysql+pymysql://heat:HEAT_DBPASS@controller/heat

[DEFAULT]
transport_url = rabbit://openstack:RABBIT_PASS@controller
heat_metadata_server_url = http://controller:8000
heat_waitcondition_server_url = http://controller:8000/v1/waitcondition


www_authenticate_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = heat
password = HEAT_PASS


auth_type = password
auth_url = http://controller:35357
username = heat
password = HEAT_PASS
user_domain_name = default


auth_uri = http://controller:5000

۵. همگام‌سازی پایگاه‌داده و راه‌اندازی سرویس‌ها

su -s /bin/sh -c "heat-manage db_sync" heat
systemctl enable heat-api heat-api-cfn heat-engine
systemctl restart heat-api heat-api-cfn heat-engine

برای اطمینان از نصب درست، لیست سرویس‌ها را بررسی کنید:

openstack orchestration service list

اگر همه نودها وضعیت up داشته باشند، Heat آماده دریافت درخواست است.

نوشتن اولین قالب HOT

یک قالب HOT از سه بخش اصلی تشکیل می‌شود: parameters (ورودی‌های قابل تنظیم)، resources (منابعی که باید ساخته شوند) و outputs (مقادیری که بعد از ساخت استک برگردانده می‌شوند).

نمونه زیر یک شبکه، یک سابنت، یک سرور و یک فلوتینگ آی‌پی می‌سازد:

heat_template_version: 2021-04-16

description: ساخت یک شبکه و سرور نمونه با Heat

parameters:
  image:
    type: string
    label: Image
    default: ubuntu-22.04
  flavor:
    type: string
    label: Flavor
    default: m1.small
  key_name:
    type: string
    label: Key Pair
    default: my-keypair
  external_network:
    type: string
    label: External Network ID
    default: public

resources:
  app_network:
    type: OS::Neutron::Net
    properties:
      name: app-net

  app_subnet:
    type: OS::Neutron::Subnet
    properties:
      network: { get_resource: app_network }
      cidr: 10.20.0.0/24
      dns_nameservers: [8.8.8.8]

  app_router:
    type: OS::Neutron::Router
    properties:
      external_gateway_info:
        network: { get_param: external_network }

  router_interface:
    type: OS::Neutron::RouterInterface
    properties:
      router: { get_resource: app_router }
      subnet: { get_resource: app_subnet }

  app_server:
    type: OS::Nova::Server
    properties:
      name: app-server
      image: { get_param: image }
      flavor: { get_param: flavor }
      key_name: { get_param: key_name }
      networks:
        - network: { get_resource: app_network }

  app_floating_ip:
    type: OS::Neutron::FloatingIP
    properties:
      floating_network: { get_param: external_network }
      port_id: { get_attr: [app_server, addresses, app-net, 0, port] }

outputs:
  server_ip:
    description: آدرس فلوتینگ آی‌پی نمونه ساخته‌شده
    value: { get_attr: [app_floating_ip, floating_ip_address] }

نکته مهم: get_resource به منبعی داخل همین قالب اشاره می‌کند، در حالی‌که get_param مقدار را از بخش parameters می‌خواند. اشتباه گرفتن این دو یکی از رایج‌ترین خطاهایی است که هنگام اعتبارسنجی قالب دیده می‌شود.

نمودار معماری استک HOT شامل شبکه، ساب‌نت، روتر، سرور و فلوتینگ آی‌پی که Heat از روی این قالب می‌سازد

اجرای استک

قبل از ساخت، قالب را اعتبارسنجی کنید:

openstack orchestration template validate -f app-stack.yaml

اگر خطایی برنگشت، استک را بسازید:

openstack stack create -t app-stack.yaml \
  --parameter "key_name=my-keypair" \
  --parameter "external_network=public" \
  app-stack

وضعیت ساخت را دنبال کنید:

openstack stack list
openstack stack resource list app-stack
openstack stack show app-stack

وقتی وضعیت استک به CREATE_COMPLETE رسید، مقدار outputs از جمله فلوتینگ آی‌پی ساخته‌شده قابل مشاهده است:

openstack stack output show app-stack server_ip

به‌روزرسانی و حذف استک

یکی از تفاوت‌های اصلی Heat با ساخت دستی، امکان به‌روزرسانی زیرساخت از طریق ویرایش همان فایل قالب است. مثلاً اگر flavor سرور باید تغییر کند، کافی‌ست پارامتر جدید را پاس بدهید:

openstack stack update -t app-stack.yaml \
  --parameter "flavor=m1.medium" \
  app-stack

Heat خودش تشخیص می‌دهد کدام منابع نیاز به تغییر دارند و فقط همان‌ها را به‌روزرسانی می‌کند، بدون این‌که منابع دیگر (مثل شبکه یا فلوتینگ آی‌پی) را دوباره بسازد.

برای حذف کامل همه منابع ساخته‌شده توسط این استک:

openstack stack delete app-stack

این دستور به ترتیب معکوس وابستگی‌ها، همه منابع را پاک می‌کند؛ یعنی ابتدا سرور و فلوتینگ آی‌پی، سپس روتر و در نهایت شبکه.

مانیتورینگ و دیباگ خطاهای رایج

اگر استک به وضعیت CREATE_FAILED رفت، اولین قدم بررسی لاگ خود منبعی است که شکست خورده:

openstack stack resource list app-stack --filter status=FAILED
openstack stack event list app-stack

رایج‌ترین دلایل شکست در تجربه عملی:

  • نبود کوتا کافی برای تعداد نمونه یا فلوتینگ آی‌پی در پروژه.
  • نام image یا flavor اشتباه در پارامترها.
  • فایروال یا Security Group پیش‌فرض که اجازه عبور ترافیک لازم را نمی‌دهد.
  • شبکه خارجی (external_network) که ID یا نام درستی ندارد.

لاگ سرویس heat-engine در /var/log/heat/heat-engine.log معمولاً دقیق‌ترین پیام خطا را نشان می‌دهد، به‌خصوص وقتی خطا از سمت Nova یا Neutron برگردانده شده و در خروجی CLI کامل نمایش داده نمی‌شود.

جمع‌بندی

Heat ساخت و مدیریت زیرساخت در OpenStack را از حالت دستی و تکراری به یک فرآیند قابل نسخه‌گذاری و تکرارپذیر تبدیل می‌کند. با یک قالب HOT، همان شبکه، سرور و تنظیمات شبکه‌ای را می‌توان بارها، بدون خطای دستی، روی محیط‌های مختلف ساخت.

اگر هنوز زیرساخت OpenStack روی یک سرور اختصاصی با منابع پایدار و دیسک‌های پرسرعت راه‌اندازی نشده، این پایه اول چیزی است که باید آماده باشد؛ پلن‌های سرور اختصاصی آریانت برای همین نوع بار کاری طراحی شده‌اند و می‌توانند محیط تست یا Production شما برای OpenStack و Heat باشند.