تجربه من با Glance در OpenStack؛ از Upload یک QCOW2 تا عیبیابی Imageهایی که Boot نمیشوند
وقتی اولین بار با Glance در OpenStack کار کردم، تصورم از آن خیلی ساده بود: جایی برای نگهداری Image ماشینهای مجازی.یک فایل QCOW2 داریم، آن را Upload میکنیم، Image داخل OpenStack ظاهر میشود و بعد از روی آن Instance میس
نویسنده:
بهزاد بازرگان
ARTICLE OVERVIEW
در این مقاله چه میخوانید؟
وقتی اولین بار با Glance در OpenStack کار کردم، تصورم از آن خیلی ساده بود: جایی برای نگهداری Image ماشینهای مجازی.یک فایل QCOW2 داریم، آن را Upload میکنیم، Image داخل OpenStack ظاهر میشود و بعد از روی آن Instance میس
وقتی اولین بار با Glance در OpenStack کار کردم، تصورم از آن خیلی ساده بود: جایی برای نگهداری Image ماشینهای مجازی.
یک فایل QCOW2 داریم، آن را Upload میکنیم، Image داخل OpenStack ظاهر میشود و بعد از روی آن Instance میسازیم.
در سناریوهای ساده واقعاً ممکن است همین اتفاق بیفتد.
اما وقتی وارد مهاجرت ماشین مجازی از VMware به OpenStack شدم، متوجه شدم جمله «Image با موفقیت Upload شد» تقریباً هیچ تضمینی درباره قابلاستفاده بودن آن Image نمیدهد.
من میتوانستم فایل را داخل Glance ببینم.
Status آن active بود.
حجم درست بود.
فرمت درست به نظر میرسید.
حتی Nova هم میتوانست از آن برای ساخت Instance استفاده کند.
اما این هنوز به معنی Boot شدن سیستمعامل نبود.
همین تجربه باعث شد نگاه من به Glance تغییر کند.
امروز Glance را فقط یک Image Repository نمیبینم. برای من Glance یکی از نقاط اتصال بین Storage، Compute و Guest Operating System است؛ مخصوصاً وقتی قرار است Workload از یک Hypervisor دیگر وارد OpenStack شود.
در این مقاله میخواهم دقیقاً همین مسیر را بررسی کنم: از یک فایل QCOW2 روی دیسک تا یک Instance قابل Boot، و مشکلاتی که ممکن است بین این دو نقطه اتفاق بیفتند.
اولین نکته: Image با Instance فرق دارد
این تفاوت ساده به نظر میرسد، اما در Troubleshooting خیلی مهم است.
Image یک Template یا Disk Image است.
Instance ماشینی است که Nova با استفاده از آن Image ایجاد میکند.
مثلاً وقتی میزنم:
openstack image list
دارم Resourceهای Glance را میبینم.
اما:
openstack server list
Resourceهای Compute را نشان میدهد.
اگر Image سالم باشد ولی Instance Boot نشود، نباید فوراً نتیجه بگیرم Glance خراب است.
برعکس، اگر Nova نتواند Image را دریافت کند، ممکن است اصلاً مشکل به Guest OS نرسیده باشد.
بنابراین اولین کاری که در Troubleshooting انجام میدهم تعیین Boundary مشکل است:
آیا مشکل قبل از تحویل Image به Compute اتفاق افتاده یا بعد از آن؟
همین سؤال ساده جلوی مقدار زیادی Troubleshooting اشتباه را میگیرد.
Glance واقعاً چه چیزی را نگه میدارد؟
OpenStack Glance to Windows VM Workflow.png
در ظاهر ممکن است بگوییم Glance فایل Image را نگه میدارد.
اما معماری کمی دقیقتر است.
دو نوع اطلاعات برای ما اهمیت دارند:
Image Data
و
Image Metadata
مثلاً برای یک Image میتوانیم اطلاعاتی مانند اینها داشته باشیم:
Name
Disk Format
Container Format
Visibility
Minimum RAM
Minimum Disk
Properties
Checksum
و البته خود داده Image.
برای دیدن جزئیات یک Image:
openstack image show <IMAGE-ID>
این دستور یکی از دستورهایی است که قبل از هر Troubleshooting جدی Image اجرا میکنم.
چون فقط دیدن اسم Image در:
openstack image list
اطلاعات کافی نمیدهد.
تجربه واقعی من از مهاجرت: QCOW2 داشتن کافی نیست
در سناریوی مهاجرت VMware به OpenStack، در نهایت به جایی رسیدم که Disk ماشین را به فرمتی رسانده بودم که OpenStack بتواند با آن کار کند.
مثلاً QCOW2.
در نگاه اول شاید تصور شود سختترین قسمت تمام شده:
VMDK → QCOW2
اما در عمل این فقط یکی از مراحل Migration است.
قبل از Upload باید خود فایل را بررسی کرد.
یکی از ابزارهایی که در این مرحله برایم مهم است:
qemu-img info disk.qcow2
این دستور اطلاعاتی مثل File Format و Virtual Size را نشان میدهد.
مثلاً ممکن است ببینیم:
file format: qcow2
ولی همین که Extension فایل .qcow2 است دلیل نمیشود واقعاً ساختار داخلی آن صحیح باشد.
من ترجیح میدهم قبل از Upload، خود فایل را Verify کنم.
در سناریوهای Migration این مرحله اهمیت بیشتری دارد، چون Image ممکن است حاصل Conversion باشد.
مرحلهای که خیلی راحت نادیده گرفته میشود: بررسی Integrity
یکی از کارهایی که قبل از Upload Image تبدیلشده ارزش دارد انجام شود:
qemu-img check disk.qcow2
است.
اگر Conversion ناقص بوده یا QCOW2 مشکل ساختاری داشته باشد، بهتر است قبل از اینکه فایل چند ده گیگابایتی را وارد Glance کنیم متوجه شویم.
این مسئله مخصوصاً زمانی مهم میشود که Transfer یا Conversion زمانبر باشد.
فرض کنید یک Disk سی گیگابایتی داریم.
فایل را Convert میکنیم.
بعد Upload میکنیم.
بعد Instance ایجاد میکنیم.
بعد تازه متوجه میشویم فایل اولیه مشکل داشته است.
در این حالت زمان زیادی را در لایه اشتباه Troubleshoot کردهایم.
به همین دلیل در Migration ترجیح میدهم Validation تا حد ممکن نزدیک به Source انجام شود.
Upload کردن Image؛ سادهترین قسمت ماجرا
در یک سناریوی معمولی میتوان Image را با دستوری شبیه این ایجاد کرد:
openstack image create "win10-migrated" --disk-format qcow2 --container-format bare --file win10.qcow2
بعد:
openstack image list
و برای جزئیات:
openstack image show win10-migrated
اگر Status به:
active
رسیده باشد، Upload از دید Glance انجام شده است.
اما اینجا دقیقاً همان جایی است که یک اشتباه رایج رخ میدهد.
میگوییم:
Image سالم است.
من ترجیح میدهم بگویم:
Glance Image را پذیرفته و Image Data در دسترس قرار گرفته است.
این دو جمله یک معنی ندارند.
Glance نمیتواند تضمین کند Windows داخل آن Image Driver لازم برای Hardware مقصد را دارد.
نمیتواند تضمین کند Bootloader سیستمعامل با Firmware انتخابشده سازگار است.
نمیتواند تضمین کند Partition یا Filesystem سیستمعامل سالم است.
بنابراین:
Active شدن Image پایان Validation نیست.
Status یک Image چه چیزی به من میگوید؟
در Troubleshooting باید Status را جدی گرفت.
برای همین:
openstack image show <IMAGE-ID>
یکی از اولین Checkهاست.
اگر Image هنوز در مرحلهای قبل از active باشد، مسیر بررسی با زمانی که Image کاملاً Active شده فرق میکند.
من سعی میکنم قبل از رفتن سراغ Nova مشخص کنم:
آیا Image Record ساخته شده؟
آیا Data Upload کامل شده؟
آیا Glance Image را Active میبیند؟
اگر پاسخ این سؤالها مثبت باشد و Instance ساخته شود ولی Guest Boot نکند، مرز مشکل کمکم از Glance فاصله میگیرد.
این تفکیک خیلی مهم است.
تجربه Windows؛ جایی که Metadata واقعاً مهم شد
در مهاجرت Linux معمولاً VirtIO Support راحتتر است، چون بسیاری از Distributionهای جدید Driverهای موردنیاز را از قبل دارند.
اما Windows داستان متفاوتی دارد.
در آزمایش مهاجرت Windows 10، مسئله Storage Controller برایم جدی شد.
در VMware ماشین ممکن است Disk را از طریق Controller خاصی ببیند.
بعد همان سیستمعامل را به OpenStack منتقل میکنیم و انتظار داریم Disk با:
VirtIO-SCSI
ارائه شود.
اگر Windows Driver لازم را برای Boot نداشته باشد، نتیجه چیست؟
Glance:
active
Nova:
Instance Created
Disk:
Attached
اما Windows:
Boot نمیشود.
این دقیقاً نمونهای است که نشان میدهد چرا نباید مشکل Boot را صرفاً «مشکل Image» صدا کنیم.
Image وجود دارد.
اما Guest برای Virtual Hardware جدید آماده نشده است.
Image Property؛ چیزی که در Migration نباید سرسری گرفت
برای Imageهای Windows در OpenStack ممکن است Propertyهایی نیاز داشته باشیم که رفتار Nova هنگام ساخت VM را تحت تأثیر قرار دهند.
در سناریویی که من دنبال کردم، مواردی از جنس:
os_type=windows
hw_machine_type=q35
hw_disk_bus=scsi
hw_scsi_model=virtio-scsi
مهم شدند.
این Propertyها را میتوان هنگام ایجاد Image یا بعداً تنظیم کرد.
مثلاً:
openstack image set --property os_type=windows win10-migrated
یا:
openstack image set --property hw_machine_type=q35 win10-migrated
و:
openstack image set --property hw_disk_bus=scsi win10-migrated
و:
openstack image set --property hw_scsi_model=virtio-scsi win10-migrated
بعد:
openstack image show win10-migrated
تا مطمئن شوم چیزی که فکر میکنم Config شده واقعاً روی Image وجود دارد.
این همان اصلی است که در Keystone هم به آن رسیدم:
به چیزی که فکر میکنیم Config کردهایم اعتماد نکنیم؛ Configuration واقعی را ببینیم.
چرا VirtIO-SCSI میتواند یک Windows سالم را از Boot بیندازد؟
فرض کنید Windows روی VMware کاملاً سالم است.
آن را خاموش میکنیم.
Disk را Extract و Convert میکنیم.
QCOW2 سالم است.
Glance Image را Active میکند.
Nova Instance را میسازد.
ولی Windows Boot نمیشود.
ممکن است اولین برداشت این باشد:
Conversion خراب بوده.
اما الزاماً اینطور نیست.
سیستمعامل هنگام Boot باید بتواند Disk سیستم را ببیند.
اگر Disk از طریق VirtIO-SCSI ارائه شود ولی Driver مربوطه در Windows به شکل Boot-Critical آماده نشده باشد، سیستمعامل قبل از رسیدن به Desktop با مشکل مواجه میشود.
برای همین در Migration Windows من Driver Preparation را بخشی از Pre-Migration میدانم، نه کاری که بعد از Failure انجام دهیم.
یعنی قبل از خاموش کردن Source VM باید درباره Hardware مقصد تصمیم گرفته باشیم.
اشتباهی که نباید بکنیم: اول Migration، بعد طراحی Target
به نظرم ترتیب درست برعکس است.
اول باید Target Hardware Model مشخص شود.
مثلاً:
Machine Type → Q35
Disk Bus → SCSI
SCSI Model → VirtIO-SCSI
Network → VirtIO
Firmware → BIOS یا UEFI
بعد Source Guest را برای همین Target آماده کنیم.
سپس Export و Conversion انجام شود.
این روش بسیار منطقیتر از این است که ابتدا VMDK را تبدیل کنیم و بعد ببینیم OpenStack با چه Hardwareای VM را بالا میآورد.
Glance Image Data واقعاً کجا ذخیره میشود؟
این سؤال در محیط Lab شاید خیلی مهم به نظر نرسد، اما در Production کاملاً مهم است.
Glance لزوماً خودش Storage نهایی Image Data نیست.
Backend میتواند متفاوت باشد.
مثلاً File Backend یا Ceph.
در Kolla-Ansible این انتخاب اهمیت زیادی دارد.
در Lab کوچک ممکن است File Backend کافی باشد.
اما اگر Control Plane چند Node داشته باشد، Local Storage ساده میتواند طراحی نامناسبی ایجاد کند.
اینجا تفاوت Lab و Production خودش را نشان میدهد.
چیزی که برای یک All-in-One کاملاً منطقی است الزاماً برای سه Controller مناسب نیست.
چرا Ceph Backend برای من جذاب است؟
وقتی Compute، Block Storage و Image Service را در یک Cloud واقعی طراحی میکنیم، Ceph میتواند معماری جالبی ایجاد کند.
Glance میتواند Image را روی Ceph نگه دارد.
Cinder نیز میتواند از RBD استفاده کند.
Nova هم در معماری مناسب میتواند از همین اکوسیستم Storage استفاده کند.
در چنین طراحیای دیگر Glance را فقط بهعنوان یک Directory پر از QCOW2 نگاه نمیکنم.
Image Catalog و Metadata توسط Glance مدیریت میشود ولی Storage Backend معماری مستقل خودش را دارد.
همین موضوع دلیل خوبی است که مقاله Glance باید قبل از ورود عمیق به Nova نوشته شود.
Nova هنگام Provision کردن VM به Image نیاز دارد، و اگر ندانیم Image کجاست و چگونه مدیریت میشود، بخشی از Flow ساخت Instance مبهم باقی میماند.
وقتی Upload Fail میشود از کجا شروع میکنم؟
فرض کنیم دستور Upload شکست میخورد.
اولین کاری که نمیکنم Restart کردن همه Containerهاست.
مسیر را تقسیم میکنم.
مرحله اول: Authentication
openstack token issue
اگر Authentication مشکل دارد، Glance هنوز متهم اصلی نیست.
مرحله دوم: Endpoint
openstack endpoint list --service glance
آیا Client به Endpoint صحیح میرود؟
مرحله سوم: API
آیا Glance API قابل دسترسی است؟
در Deployment مبتنی بر Kolla میتوان وضعیت Container مربوطه را هم بررسی کرد.
مرحله چهارم: Image
openstack image show <IMAGE-ID>
Image در چه Stateای قرار دارد؟
مرحله پنجم: Storage Backend
آیا Backend فضای کافی دارد؟
آیا Permission صحیح است؟
آیا Ceph یا File Backend قابل دسترسی است؟
مرحله ششم: Log
حالا Log مربوط به glance-api معنی پیدا میکند.
این ترتیب باعث میشود بدون دلیل وارد Storage یا Database نشوم.
Disk Space؛ یک مشکل ساده با اثر عجیب
یکی از چیزهایی که در پروژههای Migration خیلی زود اهمیت پیدا میکند فضای Storage است.
فرض کنید VM سی گیگابایت Virtual Disk دارد.
ممکن است همزمان به فضای:
Source/Working Copy
Converted Image
Temporary Data
Upload/Staging
نیاز داشته باشیم.
اگر فقط بگوییم:
«VM من 30GB است، پس 35GB فضای آزاد کافی است»
ممکن است وسط Pipeline با مشکل مواجه شویم.
من در طراحی Migration Worker این موضوع را جدیتر دیدم، چون Export، Working Copy و Converted Output میتوانند همزمان وجود داشته باشند.
بنابراین قبل از اینکه خطای Upload را به Glance نسبت بدهم، فضای Storage را هم بررسی میکنم.
یک مشکل ساده مثل کمبود Disk Space میتواند خودش را در جایی نشان دهد که در نگاه اول اصلاً شبیه Capacity Problem نیست.
وقتی برای اولین بار با معماری OpenStack آشنا شدم، سرویسهایی مثل Nova، Neutron، Glance و Keystone خیلی زود قابل درک بودند. اسم هرکدام تقریباً نشان میداد با چه بخشی از Cloud سروکار داریم.اما Placement برای من اینطور نبو
در این مقاله تجربه کار با Keystone را از زاویه عملی بررسی میکنم؛ از Token و Service Catalog تا Endpoint، Scope، Role و خطاهایی که هنگام Authentication در OpenStack با آنها مواجه شدم.
در این مقاله OpenStack را نه صرفاً از روی تعریف سرویسها، بلکه از تجربه راهاندازی و عیبیابی بررسی میکنم؛ از ارتباط Keystone، Nova، Placement، Glance و Neutron تا Kolla-Ansible، شبکه OVN/OVS و روشی که برای Troubleshooting مرحلهبهمرحله OpenStack به آن رسیدم.