ویژگی های اساسی سیستم های کانتینر LXD - Linux

ویژگی های اساسی سیستم های کانتینر LXD - Linux

LXD نسل بعدی مدیریت ظرف سیستم است، بنابراین می گوید منبع. این یک رابط کاربری مشابه ماشین های مجازی ارائه می دهد، اما به جای آن از کانتینرهای لینوکس استفاده می کند.

هسته LXD یک دیمون ممتاز (سرویسی که با حقوق ریشه اجرا می شود) است که یک REST API را از طریق سوکت یونیکس محلی و همچنین در صورت نصب پیکربندی مناسب از طریق شبکه ارائه می دهد. کلاینت ها، مانند ابزار خط فرمان ارائه شده با LXD، از طریق این API REST درخواست می دهند. این بدان معنی است که چه به یک میزبان محلی یا یک میزبان راه دور دسترسی داشته باشید، همه چیز یکسان کار می کند.

در این مقاله به طور مفصل به مفاهیم LXD نمی پردازیم، ما تمام قابلیت های موجود ذکر شده در اسناد را در نظر نخواهیم گرفت، از جمله اجرای اخیر در آخرین نسخه های LXD از پشتیبانی از ماشین های مجازی QEMU به موازات کانتینرها. در عوض، ما فقط اصول اولیه مدیریت کانتینر را یاد خواهیم گرفت - راه اندازی استخرهای ذخیره سازی، شبکه، اجرای یک کانتینر، اعمال محدودیت های منابع، و نحوه استفاده از عکس های فوری تا بتوانید درک اساسی از LXD و استفاده از کانتینرها در لینوکس داشته باشید.

برای اطلاعات کامل به منبع رسمی مراجعه فرمایید:

ناوبری

نصب LXD ^

نصب LXD در توزیع های اوبونتو ^

در بسته توزیع اوبونتو 19.10 lxd پخش دارد بسته اسنپ:

apt search lxd

lxd/eoan 1:0.7 all
  Transitional package - lxd -> snap (lxd)

به این معنی که دو پکیج به صورت همزمان نصب خواهند شد، یکی به عنوان پکیج سیستمی و دیگری به صورت بسته اسنپ. نصب دو بسته روی یک سیستم ممکن است مشکلی ایجاد کند که در صورت حذف بسته اسنپ توسط مدیر بسته snap، بسته سیستم ممکن است یتیم شود.

بسته را پیدا کنید lxd در مخزن snap می توانید از دستور زیر استفاده کنید:

snap find lxd

Name             Version        Summary
lxd              3.21           System container manager and API
lxd-demo-server  0+git.6d54658  Online software demo sessions using LXD
nova             ocata          OpenStack Compute Service (nova)
nova-hypervisor  ocata          OpenStack Compute Service - KVM Hypervisor (nova)
distrobuilder    1.0            Image builder for LXC and LXD
fabrica          0.1            Build snaps by simply pointing a web form to...
satellite        0.1.2          Advanced scalable Open source intelligence platform

با اجرای دستور list شما می توانید مطمئن شوید که بسته lxd هنوز نصب نشده:

snap list

Name  Version    Rev   Tracking  Publisher   Notes
core  16-2.43.3  8689  stable    canonical✓  core

علیرغم اینکه LXD یک بسته اسنپ است، باید از طریق بسته سیستمی نصب شود lxd، که گروه مربوطه را در سیستم ایجاد می کند، ابزارهای لازم را در /usr/bin غیره

sudo apt update
sudo apt install lxd

بیایید مطمئن شویم که بسته به عنوان یک بسته snap نصب شده است:

snap list

Name  Version    Rev    Tracking  Publisher   Notes
core  16-2.43.3  8689   stable    canonical✓  core
lxd   3.21       13474  stable/…  canonical✓  -

نصب LXD بر روی توزیع های Arch Linux ^

برای نصب بسته LXD بر روی سیستم، باید دستورات زیر را اجرا کنید، اولی لیست بسته های موجود در سیستم موجود در مخزن را به روز می کند، دومی مستقیماً بسته را نصب می کند:

sudo pacman -Syyu && sudo pacman -S lxd

پس از نصب پکیج برای مدیریت LXD توسط کاربر معمولی باید به گروه سیستم اضافه شود lxd:

sudo usermod -a -G lxd user1

بیایید از کاربر مطمئن شویم user1 به گروه اضافه شد lxd:

id -Gn user1

user1 adm dialout cdrom floppy sudo audio dip video plugdev netdev lxd

اگر گروه lxd در لیست قابل مشاهده نیست، پس باید جلسه کاربر را دوباره فعال کنید. برای انجام این کار، باید از سیستم خارج شوید و تحت همان کاربر وارد شوید.

فعال کردن در systemd بارگیری سرویس LXD هنگام راه اندازی سیستم:

sudo systemctl enable lxd

بیایید سرویس را شروع کنیم:

sudo systemctl start lxd

بررسی وضعیت خدمات:

sudo systemctl status lxd

Storage LXD (Storage) ^

قبل از شروع اولیه سازی، باید بدانیم که چگونه ذخیره سازی در LXD به طور منطقی مرتب شده است.

ذخیره سازی (ذخیره سازی) متشکل از از یک یا چند استخر ذخیره سازی که از یکی از سیستم های فایل پشتیبانی شده مانند ZFS، BTRFS، LVM یا دایرکتوری های معمولی استفاده می کند. هر استخر ذخیره سازی به مجلد تقسیم می شود (حجم ذخیره سازی) که حاوی تصاویر، کانتینرها یا داده هایی برای مقاصد دیگر است.

  • تصاویر - اینها توزیع های ویژه بدون هسته لینوکس و در دسترس از منابع خارجی هستند
  • ظروف - اینها توزیع های مستقر شده از تصاویر، آماده برای استفاده هستند
  • عکس های فوری - اینها عکس های فوری از وضعیت ظروف است که می توانید به آنها بازگردید

ویژگی های اساسی سیستم های کانتینر LXD - Linux

برای مدیریت فضای ذخیره سازی در LXD از دستور استفاده کنید lxc storage گواهینامه ای که می توانید با تعیین کلید آن را دریافت کنید - lxc storage --help

دستور زیر لیستی از همه را نمایش می دهد استخر ذخیره سازی در حافظه LXD:

lxc storage list

+---------+-------------+--------+--------------------------------+---------+
|  NAME   | DESCRIPTION | DRIVER |             SOURCE             | USED BY |
+---------+-------------+--------+--------------------------------+---------+
| hddpool |             | btrfs  | /dev/loop1                     | 2       |
+---------+-------------+--------+--------------------------------+---------+
| ssdpool |             | btrfs  | /var/lib/lxd/disks/ssdpool.img | 4       |
+---------+-------------+--------+--------------------------------+---------+

برای مشاهده لیست همه حجم ذخیره سازی در انتخاب شده استخر ذخیره سازی به تیم خدمت می کند lxc storage volume list:

lxc storage volume list hddpool

+-------+----------------------------------+-------------+---------+
| TYPE  |          NAME                    | DESCRIPTION | USED BY |
+-------+----------------------------------+-------------+---------+
| image | ebd565585223487526ddb3607f515... |             | 1       |
+-------+----------------------------------+-------------+---------+

lxc storage volume list ssdpool

+-----------+----------------------------------+-------------+---------+
|   TYPE    |            NAME                  | DESCRIPTION | USED BY |
+-----------+----------------------------------+-------------+---------+
| container | alp3                             |             | 1       |
+-----------+----------------------------------+-------------+---------+
| container | jupyter                          |             | 1       |
+-----------+----------------------------------+-------------+---------+
| image     | ebd565585223487526ddb3607f515... |             | 1       |
+-----------+----------------------------------+-------------+---------+

همچنین، اگر برای استخر ذخیره سازی هنگام ایجاد، سیستم فایل BTRFS انتخاب شد، سپس یک لیست دریافت کنید حجم ذخیره سازی یا زیرمجموعه‌ها در تفسیر BTRFS می توانید از جعبه ابزار این فایل سیستم استفاده کنید:

sudo btrfs subvolume list -p /var/lib/lxd/storage-pools/hddpool

ID 257 gen 818 parent 5 top level 5 path images/ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3

sudo btrfs subvolume list -p /var/lib/lxd/storage-pools/ssdpool

ID 257 gen 1820 parent 5 top level 5 path images/ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3
ID 260 gen 1819 parent 5 top level 5 path containers/jupyter
ID 263 gen 1820 parent 5 top level 5 path containers/alp3

راه اندازی LXD ^

قبل از ایجاد و استفاده از کانتینرها، باید یک مقداردهی اولیه LXD را انجام دهید که شبکه و ذخیره سازی را ایجاد و پیکربندی می کند. این را می توان به صورت دستی با استفاده از دستورات مشتری استاندارد که در لیست موجود است با فراخوانی دستور انجام داد lxc --help یا با استفاده از ویزارد مقداردهی اولیه lxd init پاسخ دادن به چند سوال

انتخاب یک سیستم فایل برای Storage Pool ^

در طول مقداردهی اولیه، LXD چندین سوال از جمله تعیین نوع سیستم فایل برای پیش فرض می پرسد استخر ذخیره سازی. به طور پیش فرض، سیستم فایل BTRFS برای آن انتخاب شده است. تغییر به FS دیگر پس از ایجاد غیرممکن خواهد بود. برای انتخاب یک FS پیشنهاد می شود جدول مقایسه ویژگی ها:

ویژگی
فهرست راهنما
Btrfs
LVM
ZFS
CEPH

ذخیره سازی تصویر بهینه شده
نه
بله
بله
بله
بله

ایجاد نمونه بهینه شده
نه
بله
بله
بله
بله

ایجاد عکس فوری بهینه شده
نه
بله
بله
بله
بله

انتقال تصویر بهینه شده
نه
بله
نه
بله
بله

انتقال نمونه بهینه شده
نه
بله
نه
بله
بله

کپی در نوشتن
نه
بله
بله
بله
بله

مبتنی بر بلوک
نه
نه
بله
نه
بله

شبیه سازی فوری
نه
بله
بله
بله
بله

درایور ذخیره سازی قابل استفاده در داخل یک ظرف
بله
بله
نه
نه
نه

بازیابی از عکس های فوری قدیمی (نه جدیدترین)
بله
بله
بله
نه
بله

سهمیه های ذخیره سازی
آره(*)
بله
بله
بله
نه

راه اندازی شبکه و Storage Pool با استفاده از ویزارد ^

دستور بعدی که به آن نگاه خواهیم کرد، راه اندازی اجزای اصلی LXD را با پاسخ دادن به سؤالات ساده با استفاده از ویزارد اولیه پیشنهاد می کند.

اجرای دستور lxc init و جواب سوالات را بعد از کولون مانند مثال زیر وارد کنید یا با توجه به شرایط خود تغییر دهید:

lxd init

Would you like to use LXD clustering? (yes/no) [default=no]: 
Do you want to configure a new storage pool? (yes/no) [default=yes]: 
Name of the new storage pool [default=default]: ssdpool         
Name of the storage backend to use (lvm, btrfs, dir) [default=btrfs]: 
Create a new BTRFS pool? (yes/no) [default=yes]: 
Would you like to use an existing block device? (yes/no) [default=no]: 
Size in GB of the new loop device (1GB minimum) [default=15GB]: 10GB
Would you like to connect to a MAAS server? (yes/no) [default=no]: 
Would you like to create a new local network bridge? (yes/no) [default=yes]: 
What should the new bridge be called? [default=lxdbr0]: 
What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: 10.0.5.1/24
Would you like LXD to NAT IPv4 traffic on your bridge? [default=yes]: 
What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: none
Would you like LXD to be available over the network? (yes/no) [default=no]: 
Would you like stale cached images to be updated automatically? (yes/no) [default=yes] no
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]: 

ایجاد یک استخر ذخیره اضافی ^

در مرحله قبل ایجاد کردیم استخر ذخیره سازی که به آن نام داده شد ssdpool و فایل آن در سیستم من در آدرس قرار دارد /var/lib/lxd/disks/ssdpool.img. این آدرس فایل سیستم مربوط به درایو فیزیکی SSD در رایانه شخصی من است.

اقدامات زیر، برای گسترش درک نقش ایفا شده توسط استخر ذخیره سازی در مخزن، یک دومی ایجاد خواهیم کرد استخر ذخیره سازی که به صورت فیزیکی بر روی نوع دیگری از دیسک، HDD قرار خواهد گرفت. مشکل این است که LXD به شما اجازه ایجاد نمی دهد استخر ذخیره سازی خارج از آدرس /var/lib/lxd/disks/ و حتی پیوندهای نمادین کار نمی کنند، پاسخ توسعه دهنده را ببینید. ما می توانیم این محدودیت را در طول مقداردهی اولیه/قالب بندی دور بزنیم استخر ذخیره سازی با مشخص کردن مقدار به عنوان یک دستگاه بلوک به جای مسیر فایل حلقه بک با مشخص کردن آن در کلید source.

بنابراین، قبل از ایجاد استخر ذخیره سازی شما باید یک فایل Loopback یا یک پارتیشن موجود در سیستم فایل خود تعریف کنید که از آن استفاده خواهد کرد. برای انجام این کار، فایلی را ایجاد و استفاده می کنیم که حجم آن را به 10 گیگابایت محدود می کنیم:

dd if=/dev/zero of=/mnt/work/lxd/hddpool.img bs=1MB count=10000

10000+0 records in
10000+0 records out
10000000000 bytes (10 GB, 9,3 GiB) copied, 38,4414 s, 260 MB/s

بیایید فایل Loopback را به یک دستگاه Loopback رایگان وصل کنیم:

sudo losetup --find --show /mnt/work/lxd/hddpool.img

/dev/loop1

با تشکر از کلید --show با اجرای دستور، نام دستگاهی که فایل حلقه بک ما به آن متصل است، به صفحه نمایش باز می گردد. در صورت لزوم، می‌توانیم فهرستی از تمام دستگاه‌های پرمشغله از این نوع را نمایش دهیم تا از درستی عملکردمان مطمئن شویم:

losetup -l

NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE                      DIO LOG-SEC
/dev/loop1         0      0         0  0 /mnt/work/lxd/hddpool.img        0     512
/dev/loop0         0      0         1  0 /var/lib/lxd/disks/ssdpool.img   0     512

از لیست می توانید متوجه شوید که دستگاه دارای آن است /dev/loop1 فایل Loopback گنجانده شده است /mnt/work/lxd/hddpool.img، و در دستگاه /dev/loop0 فایل Loopback گنجانده شده است /var/lib/lxd/disks/ssdpool.img که با پیش فرض مطابقت دارد استخر ذخیره سازی.

دستور زیر یک دستور جدید ایجاد می کند استخر ذخیره سازی در LXD بر اساس فایل loopback که به تازگی آماده کردیم. LXD فایل Loopback را فرمت می کند /mnt/work/lxd/hddpool.img در دستگاه /dev/loop1 برای سیستم فایل BTRFS:

lxc storage create hddpool btrfs size=10GB source=/dev/loop1

بیایید لیستی از همه نمایش دهیم استخر ذخیره سازی برای نمایش:

lxc storage list

+---------+-------------+--------+--------------------------------+---------+
|  NAME   | DESCRIPTION | DRIVER |             SOURCE             | USED BY |
+---------+-------------+--------+--------------------------------+---------+
| hddpool |             | btrfs  | /dev/loop1                     | 0       |
+---------+-------------+--------+--------------------------------+---------+
| ssdpool |             | btrfs  | /var/lib/lxd/disks/ssdpool.img | 0       |
+---------+-------------+--------+--------------------------------+---------+

افزایش اندازه استخر ذخیره سازی ^

پس از خلقت استخر ذخیره سازی، در صورت لزوم می توان آن را گسترش داد. برای استخر ذخیره سازی بر اساس سیستم فایل BTRFS، دستورات زیر را اجرا کنید:

sudo truncate -s +5G /mnt/work/lxd/hddpool.img
sudo losetup -c /dev/loop1
sudo btrfs filesystem resize max /var/lib/lxd/storage-pools/hddpool

درج خودکار یک فایل Loopback در شکاف دستگاه loopback ^

ما یک مشکل کوچک داریم، هنگام راه اندازی مجدد سیستم میزبان، فایل /mnt/work/lxd/hddpool.img از دستگاه "پرواز" خواهد کرد /dev/loop1 و سرویس LXD هنگام بارگیری از کار می افتد زیرا آن را در این دستگاه نمی بیند. برای حل این مشکل باید یک سرویس سیستم ایجاد کنید که این فایل را در دستگاه وارد کند /dev/loop1 هنگامی که سیستم میزبان بوت می شود.

بیایید ایجاد کنیم واحد نوع فایل سرویس в /etc/systemd/system/ برای سیستم مقداردهی اولیه SystemD:

cat << EOF | sudo tee -a /etc/systemd/system/lxd-hddpool.service
[Unit]
Description=Losetup LXD Storage Pool (hddpool)
After=local-fs.target

[Service]
Type=oneshot
ExecStart=/sbin/losetup /dev/loop1 /mnt/work/lxd/hddpool.img
RemainAfterExit=true

[Install]
WantedBy=local-fs.target
EOF

فعال کردن سرویس:

sudo systemctl enable lxd-hddpool

Created symlink /etc/systemd/system/local-fs.target.wants/lxd-hddpool.service → /etc/systemd/system/lxd-hddpool.service.

پس از راه اندازی مجدد سیستم میزبان، وضعیت سرویس را بررسی می کنیم:

systemctl status lxd-hddpool.service 

● lxd-hddpool.service - Losetup LXD Storage Pool (hddpool)
     Loaded: loaded (/etc/systemd/system/lxd-hddpool.service; enabled; vendor preset: disabled)
     Active: active (exited) since Wed 2020-04-08 03:43:53 MSK; 1min 37s ago
    Process: 711 ExecStart=/sbin/losetup /dev/loop1 /mnt/work/lxd/hddpool.img (code=exited, status=0/SUCCESS)
   Main PID: 711 (code=exited, status=0/SUCCESS)

апр 08 03:43:52 manjaro systemd[1]: Starting Losetup LXD Storage Pool (hddpool)...
апр 08 03:43:53 manjaro systemd[1]: Finished Losetup LXD Storage Pool (hddpool).

از خروجی می توانیم تأیید کنیم که وضعیت سرویس است فعال، علیرغم اینکه اجرای اسکریپت ما از یک دستور کامل شد، این گزینه به ما اجازه انجام این کار را داد. RemainAfterExit=true.

ایمنی. امتیازات کانتینر ^

از آنجایی که تمام فرآیندهای کانتینر در واقع به صورت مجزا بر روی سیستم میزبان با استفاده از هسته آن اجرا می شوند، برای محافظت بیشتر از دسترسی فرآیندهای کانتینر به سیستم میزبان، LXD امتیاز فرآیند را ارائه می دهد، که در آن:

  • کانتینرهای ممتاز - اینها کانتینرهایی هستند که در آنها فرآیندهای دارای UID و GID با همان مالک سیستم میزبان مطابقت دارند. به عنوان مثال، فرآیندی که در یک کانتینر با UID 0 اجرا می شود، تمام حقوق دسترسی یک فرآیند در سیستم میزبان با UID 0 را دارد. به عبارت دیگر، کاربر ریشه در کانتینر همه حقوق را دارد نه تنها در کانتینر، اما اگر بتواند به خارج از فضای نام ایزوله کانتینر برود، در سیستم میزبان نیز وجود دارد.

  • کانتینرهای غیرمجاز - اینها کانتینرهایی هستند که در آنها پردازش ها با شماره 0 تا 65535 به صاحب UID و GID تعلق دارند، اما برای سیستم میزبان به ترتیب با استفاده از بیت های SubUID و SubGID اضافه شده، مالک پنهان می شود. به عنوان مثال، یک کاربر با UID=0 در یک کانتینر در سیستم میزبان به عنوان دیده می شود SubUID + UID. این از سیستم میزبان محافظت می کند زیرا اگر هر فرآیندی در کانتینر بتواند از فضای نام ایزوله خود فرار کند، فقط می تواند با سیستم میزبان به عنوان یک فرآیند با یک UID/GID ناشناخته و بسیار بالا ارتباط برقرار کند.

به طور پیش فرض، کانتینرهایی که به تازگی ایجاد شده اند، وضعیت نامطلوب دارند و بنابراین باید یک SubUID و SubGID تعریف کنیم.

بیایید دو فایل پیکربندی ایجاد کنیم که در آن ماسک را به ترتیب برای SubUID و SubGID تنظیم می کنیم:

sudo touch /etc{/subuid,/subgid}
sudo usermod --add-subuids 1000000-1065535 root 
sudo usermod --add-subgids 1000000-1065535 root

برای اعمال تغییرات، سرویس LXD باید راه اندازی مجدد شود:

sudo systemctl restart lxd

ایجاد سوئیچ شبکه مجازی ^

از آنجایی که قبلاً شبکه را با استفاده از جادوگر مقداردهی اولیه کردیم lxd init و یک دستگاه شبکه ایجاد کرد lxdbr0، سپس در این قسمت به سادگی با شبکه سازی در LXD و نحوه ایجاد سوئیچ مجازی (پل) با استفاده از دستور کلاینت آشنا می شویم.

نمودار زیر نشان می دهد که چگونه یک سوئیچ (پل) میزبان و کانتینرها را به یک شبکه متصل می کند:

ویژگی های اساسی سیستم های کانتینر LXD - Linux

کانتینرها می توانند از طریق یک شبکه با کانتینرهای دیگر یا میزبانی که این کانتینرها روی آن سرو می شوند، ارتباط برقرار کنند. برای این کار باید کارت های شبکه مجازی کانتینرها را با سوئیچ مجازی پیوند دهید. ابتدا یک سوئیچ ایجاد می‌کنیم، و پس از ایجاد خود کانتینر، رابط‌های شبکه کانتینر در فصل‌های بعدی به هم مرتبط می‌شوند.

دستور زیر یک سوئیچ با یک زیر شبکه ایجاد می کند 10.0.5.0/24 و آدرس IPv4 10.0.5.1/24، و همچنین شامل می شود ipv4.nat به طوری که کانتینرها می توانند از طریق میزبان با استفاده از سرویس NAT به اینترنت دسترسی داشته باشند:

lxc network create lxdbr0 ipv4.address=10.0.5.1/24 ipv4.nat=true ipv6.address=none

بررسی لیست دستگاه های شبکه موجود در LXD:

lxc network list

+--------+----------+---------+-------------+---------+
|  NAME  |   TYPE   | MANAGED | DESCRIPTION | USED BY |
+--------+----------+---------+-------------+---------+
| eno1   | physical | NO      |             | 0       |
+--------+----------+---------+-------------+---------+
| lxdbr0 | bridge   | YES     |             | 0       |
+--------+----------+---------+-------------+---------+

همچنین می توانید تأیید کنید که یک دستگاه شبکه با استفاده از ابزار استاندارد توزیع لینوکس ایجاد شده است - ip link یا ip addr:

ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether bc:ee:7b:5a:6b:44 brd ff:ff:ff:ff:ff:ff
    altname enp0s25
    inet6 fe80::9571:11f3:6e0c:c07b/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: lxdbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether c2:38:90:df:cb:59 brd ff:ff:ff:ff:ff:ff
    inet 10.0.5.1/24 scope global lxdbr0
       valid_lft forever preferred_lft forever
    inet6 fe80::c038:90ff:fedf:cb59/64 scope link 
       valid_lft forever preferred_lft forever
5: veth3ddab174@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master lxdbr0 state UP group default qlen 1000
    link/ether ca:c3:5c:1d:22:26 brd ff:ff:ff:ff:ff:ff link-netnsid 0

نمایه پیکربندی ^

هر کانتینر در LXD پیکربندی خاص خود را دارد و می‌تواند آن را با پیکربندی‌های اعلام شده جهانی گسترش دهد پروفایل های پیکربندی. اعمال نمایه های پیکربندی در یک کانتینر دارای یک مدل آبشاری است، مثال زیر این را نشان می دهد:

ویژگی های اساسی سیستم های کانتینر LXD - Linux

در این مثال، سه پروفایل در سیستم LXD ایجاد شده است: default, hddpool и hostfs. هر سه نمایه روی ظرفی اعمال می‌شوند که دارای پیکربندی محلی (منطقه خاکستری) است. مشخصات default دستگاه دارد root که یک پارامتر دارد pool برابر است ssdpool، اما به لطف مدل برنامه پیکربندی آبشار، می‌توانیم یک پروفایل روی ظرف اعمال کنیم hddpool که یک پارامتر دارد pool همان پارامتر را از نمایه لغو می کند default و ظرف پیکربندی دستگاه را دریافت خواهد کرد root با پارامتر pool برابر است hddpool، و نمایه hostfs به سادگی یک دستگاه جدید به ظرف اضافه می کند.

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

lxc profile list

+---------+---------+
|  NAME   | USED BY |
+---------+---------+
| default | 1       |
+---------+---------+
| hddroot | 0       |
+---------+---------+
| ssdroot | 1       |
+---------+---------+

با افزودن کلید می توان لیست کاملی از دستورات موجود برای کار با نمایه را به دست آورد --help:

lxc profile --help

Description:
  Manage profiles

Usage:
  lxc profile [command]

Available Commands:
  add         Add profiles to instances
  assign      Assign sets of profiles to instances
  copy        Copy profiles
  create      Create profiles
  delete      Delete profiles
  device      Manage instance devices
  edit        Edit profile configurations as YAML
  get         Get values for profile configuration keys
  list        List profiles
  remove      Remove profiles from instances
  rename      Rename profiles
  set         Set profile configuration keys
  show        Show profile configurations
  unset       Unset profile configuration keys

در حال ویرایش پروفایل شما ^

نمایه تنظیمات پیش فرض default پیکربندی کارت شبکه برای کانتینر ندارد و همه کانتینرهای تازه ایجاد شده شبکه ندارند، برای آنها باید دستگاه های شبکه محلی (اختصاصی) با دستور جداگانه ایجاد شود، اما می توانیم یک دستگاه شبکه سراسری در پیکربندی ایجاد کنیم. نمایه ای که بین همه کانتینرهایی که از این نمایه استفاده می کنند به اشتراک گذاشته می شود. به این ترتیب بلافاصله پس از دستور ایجاد کانتینر جدید، شبکه ای با دسترسی شبکه خواهند داشت. در عین حال، هیچ محدودیتی وجود ندارد؛ ما همیشه می توانیم در صورت لزوم، یک دستگاه شبکه محلی ایجاد کنیم.

دستور زیر دستگاه را به نمایه پیکربندی اضافه می کند eth0 تایپ کنید nic به شبکه متصل است lxdbr0:

lxc profile device add default eth0 nic network=lxdbr0 name=eth0

توجه به این نکته مهم است که از آنجایی که ما واقعاً دستگاه را به نمایه پیکربندی اضافه کردیم، اگر یک آدرس IP ثابت در دستگاه مشخص کنیم، همه کانتینرهایی که از این نمایه استفاده می کنند آدرس IP یکسانی را به اشتراک خواهند گذاشت. اگر نیاز به ایجاد کانتینری با آدرس IP ثابت اختصاص داده شده برای کانتینر وجود دارد، باید پیکربندی دستگاه شبکه را در سطح کانتینر (پیکربندی محلی) با پارامتر آدرس IP ایجاد کنید، نه در سطح پروفایل.

بیایید نمایه را بررسی کنیم:

lxc profile show default

config: {}
description: Default LXD profile
devices:
  eth0:
    name: eth0
    network: lxdbr0
    type: nic
  root:
    path: /
    pool: ssdpool
    type: disk
name: default
used_by: []

در این نمایه می بینیم که برای همه کانتینرهای تازه ایجاد شده دو دستگاه ایجاد می شود:

  • eth0 - نوع وسیله nic متصل به سوئیچ (پل شبکه) lxdbr0
  • root - نوع وسیله disk که از یک استخر ذخیره سازی استفاده می کند ssdpool

ایجاد پروفایل های جدید ^

برای استفاده از ایجاد قبلی استخر ذخیره سازی ظروف، یک نمایه پیکربندی ایجاد کنید ssdroot که در آن دستگاهی مانند اضافه خواهیم کرد disk با نقطه نصب / (ریشه) با استفاده از ایجاد قبلی استخر ذخیره سازی - ssdpool:

lxc profile create ssdroot
lxc profile device add ssdroot root disk path=/ pool=ssdpool

به طور مشابه، ما یک دستگاه مانند ایجاد می کنیم disk، اما در این مورد با استفاده از استخر ذخیره سازی - hddpool:

lxc profile create hddroot
lxc profile device add hddroot root disk path=/ pool=hddpool

بررسی پروفایل های پیکربندی:

lxc profile show ssdroot

config: {}
description: ""
devices:
  root:
    path: /
    pool: ssdpool
    type: disk
name: ssdroot
used_by: []

lxc profile show hddroot

config: {}
description: ""
devices:
  root:
    path: /
    pool: hddpool
    type: disk
name: hddroot
used_by: []

مخزن تصویر ^

کانتینرها از تصاویری ایجاد می‌شوند که توزیع‌های ویژه‌ای هستند که هسته لینوکس ندارند. بنابراین، قبل از اجرای کانتینر، باید از این تصویر مستقر شود. منبع تصاویر یک مخزن محلی است که تصاویر از مخازن خارجی در آن دانلود می شوند.

مخازن تصویر از راه دور ^

به طور پیش فرض، LXD برای دریافت تصاویر از سه منبع راه دور پیکربندی شده است:

  • اوبونتو: (برای تصاویر پایدار اوبونتو)
  • ubuntu-daily: (برای تصاویر روزانه اوبونتو)
  • تصاویر: (برای یک سری توزیع های دیگر)

lxc remote list

+-----------------+------------------------------------------+--------+--------+
|      NAME       |                   URL                    | PUBLIC | STATIC |
+-----------------+------------------------------------------+--------+--------+
| images          | https://images.linuxcontainers.org       | YES    | NO     |
+-----------------+------------------------------------------+--------+--------+
| local (default) | unix://                                  | NO     | YES    |
+-----------------+------------------------------------------+--------+--------+
| ubuntu          | https://cloud-images.ubuntu.com/releases | YES    | YES    |
+-----------------+------------------------------------------+--------+--------+
| ubuntu-daily    | https://cloud-images.ubuntu.com/daily    | YES    | YES    |
+-----------------+------------------------------------------+--------+--------+

به عنوان مثال، مخزن ubuntu: دارای تصاویر زیر است:

lxc image -c dasut list ubuntu: | head -n 11

+----------------------------------------------+--------------+----------+------------+
|                   DESCRIPTION                | ARCHITECTURE |   SIZE   |   TYPE     |
+----------------------------------------------+--------------+----------+------------+
| ubuntu 12.04 LTS amd64 (release) (20150728)  | x86_64       | 153.72MB | CONTAINER  |
+----------------------------------------------+--------------+----------+------------+
| ubuntu 12.04 LTS amd64 (release) (20150819)  | x86_64       | 152.91MB | CONTAINER  |
+----------------------------------------------+--------------+----------+------------+
| ubuntu 12.04 LTS amd64 (release) (20150906)  | x86_64       | 154.69MB | CONTAINER  |
+----------------------------------------------+--------------+----------+------------+
| ubuntu 12.04 LTS amd64 (release) (20150930)  | x86_64       | 153.86MB | CONTAINER  |
+----------------------------------------------+--------------+----------+------------+

برای نمایش تعداد محدودی از ستون ها از گزینه استفاده کردیم -c با پارامترها dasutو همچنین طول لیست را با دستور محدود کرد head.

فیلتر برای نمایش لیستی از تصاویر موجود است. دستور زیر تمام معماری های توزیع موجود را فهرست می کند AlpineLinux:

lxc image -c ldast list images:alpine/3.11

+------------------------------+--------------------------------------+--------------+
|            ALIAS             |             DESCRIPTION              | ARCHITECTURE |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11 (3 more)         | Alpine 3.11 amd64 (20200220_13:00)   | x86_64       |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11/arm64 (1 more)   | Alpine 3.11 arm64 (20200220_13:00)   | aarch64      |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11/armhf (1 more)   | Alpine 3.11 armhf (20200220_13:00)   | armv7l       |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11/i386 (1 more)    | Alpine 3.11 i386 (20200220_13:01)    | i686         |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11/ppc64el (1 more) | Alpine 3.11 ppc64el (20200220_13:00) | ppc64le      |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11/s390x (1 more)   | Alpine 3.11 s390x (20200220_13:00)   | s390x        |
+------------------------------+--------------------------------------+--------------+

مخزن تصویر محلی ^

برای شروع استفاده از کانتینر، باید یک تصویر از مخزن جهانی به مخزن محلی اضافه کنید local:. اکنون مخزن محلی خالی است، دستور از این موضوع مطمئن می شود lxc image list. اگر روش list یک مخزن مشخص نکنید، سپس مخزن محلی به طور پیش فرض استفاده می شود - local:

lxc image list local:

+-------+-------------+--------+-------------+--------------+------+------+
| ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCHITECTURE | TYPE | SIZE |
+-------+-------------+--------+-------------+--------------+------+------+

تصاویر موجود در مخزن با استفاده از روش های زیر مدیریت می شوند:

تیم
شرح

تصویر lxc نام مستعار
مدیریت نام مستعار تصویر

تصویر lxc کپی کنید
کپی تصاویر بین سرورها

تصویر lxc حذف کردن
حذف تصاویر

تصویر lxc ویرایش کنید
ویژگی های تصویر را ویرایش کنید

تصویر lxc صادرات
صادرات و دانلود تصاویر

تصویر lxc واردات
تصاویر را به فروشگاه تصویر وارد کنید

تصویر lxc اطلاعات
نمایش اطلاعات مفید در مورد تصاویر

تصویر lxc فهرست
لیست تصاویر

تصویر lxc تازه کردن
بازخوانی تصاویر

تصویر lxc نشان
نمایش مشخصات تصویر

تصویر را در مخزن محلی از مخزن جهانی کپی کنید images::

lxc image copy images:alpine/3.11/amd64 local: --alias=alpine3

Image copied successfully!

بیایید لیستی از تمام تصاویر موجود در مخزن محلی را نمایش دهیم local::

lxc image -c lfdatsu list local:

+---------+--------------+------------------------------------+--------------+
|  ALIAS  | FINGERPRINT  |            DESCRIPTION             | ARCHITECTURE |
+---------+--------------+------------------------------------+--------------+
| alpine3 | 73a3093d4a5c | Alpine 3.11 amd64 (20200220_13:00) | x86_64       |
+---------+--------------+------------------------------------+--------------+

پیکربندی LXD ^

علاوه بر حالت تعاملی، LXD از حالت نصب پیکربندی غیر تعاملی نیز پشتیبانی می کند، این زمانی است که پیکربندی در قالب یک فایل YAML مشخص می شود، یک فرمت خاص که به شما امکان می دهد کل پیکربندی را به یکباره نصب کنید و اجرا را دور بزنید. از بسیاری از دستورات تعاملی که در بالا در این مقاله مورد بحث قرار گرفت، از جمله پیکربندی شبکه، ایجاد پروفایل های پیکربندی و غیره. ما این منطقه را در اینجا پوشش نمی دهیم، شما می توانید آن را خودتان بررسی کنید. در مستندات.

دستور تعاملی بعدی lxc config که ما به آن نگاه خواهیم کرد به شما امکان می دهد پیکربندی را تنظیم کنید. به عنوان مثال، برای اطمینان از اینکه تصاویر دانلود شده در مخزن محلی به طور خودکار از مخازن جهانی به روز نمی شوند، می توانیم این رفتار را با دستور زیر فعال کنیم:

lxc config set images.auto_update_cached=false

ایجاد و مدیریت یک کانتینر ^

برای ایجاد یک کانتینر از دستور استفاده کنید lxc init که مقادیر به آن منتقل می شود репозиторий:образ و سپس شناسه مورد نظر برای کانتینر. مخزن را می توان به عنوان محلی مشخص کرد local: هر جهانی هم همینطور است. اگر مخزن مشخص نشده باشد، به طور پیش فرض از مخزن محلی برای جستجوی تصویر استفاده می شود. اگر تصویر از مخزن جهانی مشخص شده باشد، ابتدا تصویر در مخزن محلی دانلود می شود و سپس برای ایجاد ظرف استفاده می شود.

بیایید دستور زیر را برای ایجاد اولین کانتینر خود اجرا کنیم:

lxc init alpine3 alp --storage=hddpool --profile=default --profile=hddroot

بیایید به ترتیب به کلیدهای دستوری که در اینجا استفاده می کنیم نگاه کنیم:

  • alpine3 — نام مستعار (نام مستعار) برای تصویری که قبلاً در مخزن محلی آپلود شده است مشخص می شود. اگر نام مستعار برای این تصویر ایجاد نشده باشد، همیشه می توانید با استفاده از آن به تصویر مراجعه کنید اثر انگشت که در جدول نمایش داده شده است.
  • alp - شناسه کانتینر را تنظیم می کند
  • --storage - این کلید نشان می دهد که در کدام استخر ذخیره سازی یک ظرف ایجاد خواهد شد
  • --profile - این کلیدها به صورت آبشاری پیکربندی را از نمایه‌های پیکربندی قبلاً ایجاد شده در ظرف اعمال می‌کنند

ما ظرف را راه اندازی می کنیم که شروع به راه اندازی سیستم init توزیع می کند:

lxc start alp

شما همچنین می توانید از دستور استفاده کنید lxc launch که به شما امکان می دهد تیم ها را ترکیب کنید lxc init и lxc start در یک عملیات

بررسی وضعیت ظرف:

lxc list -c ns46tb
+------+---------+------------------+------+-----------+--------------+
| NAME |  STATE  |       IPV4       | IPV6 |   TYPE    | STORAGE POOL |
+------+---------+------------------+------+-----------+--------------+
| alp  | RUNNING | 10.0.5.46 (eth0) |      | CONTAINER | hddpool      |
+------+---------+------------------+------+-----------+--------------+

بررسی پیکربندی کانتینر:

lxc config show alp

architecture: x86_64
config:
  image.architecture: amd64
  image.description: Alpine 3.11 amd64 (20200326_13:39)
  image.os: Alpine
  image.release: "3.11"
  image.serial: "20200326_13:39"
  image.type: squashfs
  volatile.base_image: ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3
  volatile.eth0.host_name: vethb1fe71d8
  volatile.eth0.hwaddr: 00:16:3e:5f:73:3e
  volatile.idmap.base: "0"
  volatile.idmap.current: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.idmap.next: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.last_state.idmap: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.last_state.power: RUNNING
devices:
  root:
    path: /
    pool: hddpool
    type: disk
ephemeral: false
profiles:
- default
- hddroot
stateful: false
description: ""

در بخش profiles ما می توانیم مطمئن شویم که این کانتینر از دو نمایه پیکربندی استفاده می کند - default и hddroot. در بخش devices ما فقط می توانیم یک دستگاه را شناسایی کنیم زیرا دستگاه شبکه در سطح نمایه ایجاد شده است default. برای مشاهده همه دستگاه‌های مورد استفاده ظرف، باید یک کلید اضافه کنید --expanded:

lxc config show alp --expanded

architecture: x86_64
config:
  image.architecture: amd64
  image.description: Alpine 3.11 amd64 (20200326_13:39)
  image.os: Alpine
  image.release: "3.11"
  image.serial: "20200326_13:39"
  image.type: squashfs
  volatile.base_image: ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3
  volatile.eth0.host_name: vethb1fe71d8
  volatile.eth0.hwaddr: 00:16:3e:5f:73:3e
  volatile.idmap.base: "0"
  volatile.idmap.current: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.idmap.next: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.last_state.idmap: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.last_state.power: RUNNING
devices:
  eth0:
    name: eth0
    network: lxdbr0
    type: nic
  root:
    path: /
    pool: hddpool
    type: disk
ephemeral: false
profiles:
- default
- hddroot
stateful: false
description: ""

تنظیم یک آدرس IP ثابت ^

اگر بخواهیم یک آدرس IP برای یک دستگاه شبکه تنظیم کنیم eth0 تیم lxc config device set alp در نظر گرفته شده برای پیکربندی کانتینر، سپس خطایی دریافت می کنیم که گزارش می دهد دستگاه وجود ندارد زیرا دستگاه eth0 که توسط کانتینر استفاده می شود متعلق به پروفایل است default:

lxc config device set alp eth0 ipv4.address 10.0.5.5

Error: The device doesn't exist

ما البته می توانیم یک آدرس IP ثابت برای آن تنظیم کنیم eth0 دستگاه‌های موجود در نمایه، اما برای همه کانتینرهایی که از این نمایه استفاده می‌کنند یکسان خواهد بود. بنابراین، بیایید یک دستگاه اختصاص داده شده به ظرف اضافه کنیم:

lxc config device add alp eth0 nic name=eth0 nictype=bridged parent=lxdbr0 ipv4.address=10.0.5.5

سپس باید ظرف را دوباره راه اندازی کنید:

lxc restart alp

اگر اکنون به پیکربندی کانتینر نگاه کنیم، نیازی به استفاده از گزینه نیست --expanded برای دیدن دستگاه شبکه eth0، از آنجایی که ما آن را در سطح ظرف ایجاد کردیم و روی همان دستگاه از نمایه آبشاری کرد default:

lxc config show alp

architecture: x86_64
config:
  image.architecture: amd64
  image.description: Alpine 3.11 amd64 (20200326_13:39)
  image.os: Alpine
  image.release: "3.11"
  image.serial: "20200326_13:39"
  image.type: squashfs
  volatile.base_image: ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3
  volatile.eth0.host_name: veth2a1dc59d
  volatile.eth0.hwaddr: 00:16:3e:0e:e2:71
  volatile.idmap.base: "0"
  volatile.idmap.current: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.idmap.next: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.last_state.idmap: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.last_state.power: RUNNING
devices:
  eth0:
    ipv4.address: 10.0.5.5
    name: eth0
    nictype: bridged
    parent: lxdbr0
    type: nic
  root:
    path: /
    pool: hddpool
    type: disk
ephemeral: false
profiles:
- default
- hddroot
stateful: false
description: ""

برداشتن ظرف ^

برای حذف یک ظرف، از دستور استفاده کنید lxc delete، اما قبل از برداشتن ظرف، باید با استفاده از دستور متوقف شود lxc stop:

lxc stop alp

lxc list

+------+---------+-------------------+------+-----------+-----------+
| NAME |  STATE  |       IPV4        | IPV6 |   TYPE    | SNAPSHOTS |
+------+---------+-------------------+------+-----------+-----------+
| alp  | STOPPED | 10.0.5.10 (eth0)  |      | CONTAINER | 0         |
+------+---------+-------------------+------+-----------+-----------+

پس از اینکه بررسی کردیم که وضعیت ظرف تبدیل شده است متوقف شده، می توان آن را حذف کرد استخر ذخیره سازی:

lxc delete alp

دسترسی به کانتینر ^

برای اجرای مستقیم دستورات در یک کانتینر، با عبور از اتصالات شبکه، از دستور استفاده کنید lxc exec که دستورات را در کانتینر بدون راه اندازی پوسته سیستم اجرا می کند. اگر نیاز به اجرای دستوری در یک پوسته با استفاده از الگوهای پوسته مانند متغیرها، تغییر مسیر فایل ها (لوله) دارید، باید به صراحت پوسته را اجرا کنید و دستور را به عنوان یک کلید ارسال کنید، به عنوان مثال:

lxc exec alp -- /bin/sh -c "echo $HOME"

این دستور از یک کاراکتر فرار ویژه استفاده می کرد برای شخصیت خاص $ به طوری که متغیر $HOME در دستگاه میزبان تفسیر نشد، بلکه فقط در داخل ظرف تفسیر شد.

همچنین می توان حالت پوسته تعاملی را شروع کرد و سپس با اجرای کلید میانبر جلسه را پایان داد CTRL+D:

lxc exec alp -- /bin/sh

مدیریت منابع کانتینر ^

در LXD، می توانید منابع کانتینر را با استفاده از یک مجموعه پیکربندی خاص مدیریت کنید. فهرست کاملی از پارامترهای پیکربندی کانتینر را می توان یافت در مستندات.

محدودیت منابع RAM ^

پارامتر limits.memory مقدار RAM موجود در کانتینر را محدود می کند. مقدار یک عدد و یک است پسوندهای موجود.

بیایید محدودیت رم کانتینر را روی 256 مگابایت تنظیم کنیم:

lxc config set alp limits.memory 256MB

همچنین، پارامترهای دیگری برای محدود کردن حافظه وجود دارد:

  • limits.memory.enforce
  • limits.memory.hugepages
  • limits.memory.swap
  • limits.memory.swap.priority

تیم lxc config show به شما امکان می دهد کل پیکربندی کانتینر را نمایش دهید، از جمله محدودیت منابع اعمال شده که تنظیم شده است:

lxc config show alp

architecture: x86_64
config:
  image.architecture: amd64
  image.description: Alpine 3.11 amd64 (20200220_13:00)
  image.os: Alpine
  image.release: "3.11"
  image.serial: "20200220_13:00"
  image.type: squashfs
  limits.memory: 256MB
  volatile.base_image: 73a3093d4a5ce0148fd84b95369b3fbecd19a537ddfd2e2d20caa2eef0e8fd60
  volatile.eth0.host_name: veth75b6df07
  volatile.eth0.hwaddr: 00:16:3e:a1:e7:46
  volatile.idmap.base: "0"
  volatile.idmap.current: '[]'
  volatile.idmap.next: '[]'
  volatile.last_state.idmap: '[]'
  volatile.last_state.power: RUNNING
devices: {}
ephemeral: false
profiles:
- default
stateful: false
description: ""

محدودیت منابع CPU ^

راه های مختلفی برای محدود کردن منابع CPU وجود دارد. انواع محدودیت ها:

  • limit.cpu - یک ظرف را به یک یا چند هسته CPU متصل می کند
  • limits.cpu.allowance - سهمیه‌های زمان‌بندی CFS را پس از سپری شدن محدودیت زمانی مدیریت می‌کند، یا مکانیزم اشتراک‌گذاری منابع CPU جهانی را پس از گذشت درصد مدیریت می‌کند.
  • limits.cpu.priority - اولویت زمانبندی زمانی که به چندین نمونه که مجموعه ای از پردازنده ها را به اشتراک می گذارند، درصد واحدی از پردازنده ها اختصاص داده می شود.

lxc config set alp limits.cpu.allowance 40%

lxc config show alp

architecture: x86_64
config:
  image.architecture: amd64
  image.description: Alpine 3.11 amd64 (20200220_13:00)
  image.os: Alpine
  image.release: "3.11"
  image.serial: "20200220_13:00"
  image.type: squashfs
  limits.cpu.allowance: 40%
  limits.memory: 256MB
  volatile.base_image: 73a3093d4a5ce0148fd84b95369b3fbecd19a537ddfd2e2d20caa2eef0e8fd60
  volatile.eth0.host_name: veth75b6df07
  volatile.eth0.hwaddr: 00:16:3e:a1:e7:46
  volatile.idmap.base: "0"
  volatile.idmap.current: '[]'
  volatile.idmap.next: '[]'
  volatile.last_state.idmap: '[]'
  volatile.last_state.power: RUNNING
devices: {}
ephemeral: false
profiles:
- default
stateful: false
description: ""

محدودیت فضای دیسک ^

علاوه بر محدودیت هایی از این قبیل limits.read, limits.write ما همچنین می توانیم مقدار فضای دیسک مصرف شده توسط کانتینر را محدود کنیم (فقط با ZFS یا BTRFS کار می کند):

lxc config device set alp root size=2GB

پس از نصب، در پارامتر devices.root.size ما می توانیم حد تعیین شده را تأیید کنیم:

lxc config show alp
...
devices:
  root:
    path: /
    pool: hddpool
    size: 2GB
    type: disk
ephemeral: false
profiles:
- default
- hddroot
stateful: false
description: ""

برای مشاهده سهمیه دیسک استفاده شده می توانیم از دستور بدست آوریم lxc info:

lxc info alp
...
Resources:
  Processes: 5
  Disk usage:
    root: 1.05GB
  CPU usage:
    CPU usage (in seconds): 1
  Memory usage:
    Memory (current): 5.46MB
  Network usage:
    eth0:
      Bytes received: 802B
      Bytes sent: 1.59kB
      Packets received: 4
      Packets sent: 14
    lo:
      Bytes received: 0B
      Bytes sent: 0B
      Packets received: 0
      Packets sent: 0

علیرغم اینکه محدودیتی را برای روت دیوایس ظرف 2 گیگابایت تعیین کرده ایم، ابزارهای سیستمی مانند df این محدودیت را نخواهند دید. برای انجام این کار، یک آزمایش کوچک انجام می دهیم و نحوه عملکرد آن را دریابیم.

بیایید 2 کانتینر یکسان جدید در همان ایجاد کنیم استخر ذخیره سازی (hddpool):

lxc init alpine3 alp1 --storage=hddpool --profile=default --profile=hddroot
lxc init alpine3 alp2 --storage=hddpool --profile=default --profile=hddroot

lxc list
+------+---------+------------------+------+-----------+-----------+
| NAME |  STATE  |       IPV4       | IPV6 |   TYPE    | SNAPSHOTS |
+------+---------+------------------+------+-----------+-----------+
| alp1 | RUNNING | 10.0.5.46 (eth0) |      | CONTAINER | 0         |
+------+---------+------------------+------+-----------+-----------+
| alp2 | RUNNING | 10.0.5.30 (eth0) |      | CONTAINER | 0         |
+------+---------+------------------+------+-----------+-----------+

بیایید یک فایل 1 گیگابایتی در یکی از کانتینرها ایجاد کنیم:

lxc exec alp1 -- dd if=/dev/urandom of=file.img bs=1M count=1000

بیایید مطمئن شویم که فایل ایجاد شده است:

lxc exec alp1 -- ls -lh
total 1000M  
-rw-r--r--    1 root     root     1000.0M Mar 27 10:16 file.img

اگر به کانتینر دوم نگاه کنیم، وجود فایلی را در همان مکان بررسی کنیم، آنگاه این فایل در آنجا نخواهد بود، که انتظار می رود، زیرا کانتینرها به تنهایی ایجاد می شوند. حجم ذخیره سازی در همان استخر ذخیره سازی:

lxc exec alp2 -- ls -lh
total 0

اما بیایید مقادیر تولید شده را با هم مقایسه کنیم df روی یک و ظرف دیگر:

lxc exec alp1 -- df -hT
Filesystem           Type            Size      Used Available Use% Mounted on
/dev/loop1           btrfs           9.3G   1016.4M      7.8G  11% /
...

lxc exec alp2 -- df -hT
Filesystem           Type            Size      Used Available Use% Mounted on
/dev/loop1           btrfs           9.3G   1016.4M      7.8G  11% /
...

دستگاه /dev/loop1 همانطور که پارتیشن ریشه نصب شده است استخر ذخیره سازی که این ظروف از آن استفاده می کنند، بنابراین حجم آن را بین دو تقسیم می کنند.

آمار مصرف منابع ^

با استفاده از دستور زیر می توانید آمار مصرف منابع را برای یک کانتینر مشاهده کنید:

lxc info alp

Name: alp
Location: none
Remote: unix://
Architecture: x86_64
Created: 2020/04/08 18:05 UTC
Status: Running
Type: container
Profiles: default, hddroot
Pid: 19219
Ips:
  eth0: inet    10.0.5.5        veth2a1dc59d
  eth0: inet6   fe80::216:3eff:fe0e:e271        veth2a1dc59d
  lo:   inet    127.0.0.1
  lo:   inet6   ::1
Resources:
  Processes: 5
  Disk usage:
    root: 495.62kB
  CPU usage:
    CPU usage (in seconds): 1
  Memory usage:
    Memory (current): 4.79MB
  Network usage:
    eth0:
      Bytes received: 730B
      Bytes sent: 1.59kB
      Packets received: 3
      Packets sent: 14
    lo:
      Bytes received: 0B
      Bytes sent: 0B
      Packets received: 0
      Packets sent: 0

کار با عکس های فوری ^

LXD توانایی ایجاد عکس های فوری و بازیابی حالت ظرف را از آنها دارد.

برای ایجاد یک عکس فوری، دستور زیر را اجرا کنید:

lxc snapshot alp snapshot1

تیم lxc snapshot کلیدی در دسترس نیست listبنابراین، برای مشاهده لیست عکس های فوری باید از دستوری استفاده کنید که اطلاعات کلی در مورد ظرف را نمایش می دهد:

lxc info alp
...
...
Snapshots:
  snapshot1 (taken at 2020/04/08 18:18 UTC) (stateless)

با استفاده از دستور می توانید یک ظرف را از یک عکس فوری بازیابی کنید lxc restore مشخص کردن ظرفی که برای آن بازسازی انجام می شود و نام مستعار Snapshot:

lxc restore alp snapshot1

دستور زیر برای حذف یک عکس فوری استفاده می شود. لطفاً توجه داشته باشید که دستور دستور شبیه به بقیه نیست؛ در اینجا باید یک اسلش رو به جلو بعد از نام کانتینر مشخص کنید. اگر اسلش حذف شود، دستور حذف یک عکس فوری به عنوان دستور حذف یک ظرف تفسیر می شود!

lxc delete alp/snapshot1

در مثال بالا، ما به اصطلاح عکس های فوری بدون حالت (stateless) نگاه کردیم. LXD نوع دیگری از عکس های فوری دارد - stateful که وضعیت فعلی همه فرآیندهای موجود در ظرف را ذخیره می کند. تعدادی ویژگی جالب و مفید در ارتباط با اسنپ شات های حالت دار وجود دارد.

چه چیز دیگری؟ ^

  • یک ماژول برای توسعه دهندگان پایتون در دسترس است PyLXD که یک API برای LXD فراهم می کند

به روز رسانی 10.04.2020/15/00 ساعت XNUMX:XNUMX: ناوبری اضافه شد

منبع: www.habr.com

اضافه کردن نظر