Tính năng cơ bản của LXD - Hệ thống container Linux

Tính năng cơ bản của LXD - Hệ thống container Linux

Lxd là trình quản lý vùng chứa hệ thống thế hệ tiếp theo, vì vậy nó nói nguồn. Nó cung cấp giao diện người dùng tương tự như máy ảo, nhưng thay vào đó sử dụng các bộ chứa Linux.

lõi LXD là một daemon đặc quyền (một dịch vụ chạy với quyền root) cung cấp API REST thông qua ổ cắm unix cục bộ, cũng như qua mạng nếu cài đặt cấu hình phù hợp. Các máy khách, chẳng hạn như công cụ dòng lệnh được cung cấp cùng với LXD, thực hiện các yêu cầu thông qua API REST này. Điều này có nghĩa là cho dù bạn đang truy cập máy chủ cục bộ hay máy chủ từ xa thì mọi thứ đều hoạt động như nhau.

Trong bài viết này, chúng tôi sẽ không đi sâu vào chi tiết các khái niệm về LXD, chúng tôi sẽ không xem xét tất cả các khả năng có sẵn được nêu trong tài liệu, bao gồm cả việc triển khai gần đây trong các phiên bản LXD mới nhất để hỗ trợ cho máy ảo QEMU song song với các thùng chứa. Thay vào đó, chúng ta sẽ chỉ tìm hiểu những kiến ​​thức cơ bản về quản lý vùng chứa - thiết lập nhóm lưu trữ, kết nối mạng, chạy vùng chứa, áp dụng giới hạn tài nguyên và cách sử dụng ảnh chụp nhanh để bạn có thể hiểu cơ bản về LXD và sử dụng vùng chứa trên Linux.

Để biết thông tin đầy đủ, vui lòng tham khảo nguồn chính thức:

Điều hướng

Cài đặt LXD ^

Cài đặt LXD trên bản phân phối Ubuntu ^

Trong gói phân phối Ubuntu 19.10 lxd có một chương trình phát sóng trên gói chụp nhanh:

apt search lxd

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

Điều này có nghĩa là hai gói sẽ được cài đặt cùng một lúc, một gói là gói hệ thống và gói kia là gói snap. Việc cài đặt hai gói trên một hệ thống có thể tạo ra một số vấn đề trong đó gói hệ thống có thể trở thành mồ côi nếu gói snap bị người quản lý gói snap xóa.

Tìm gói lxd trong kho lưu trữ snap, bạn có thể sử dụng lệnh sau:

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

Bằng cách chạy lệnh list bạn có thể chắc chắn rằng gói hàng lxd chưa được cài đặt:

snap list

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

Mặc dù LXD là gói snap nhưng nó phải được cài đặt thông qua gói hệ thống lxd, sẽ tạo nhóm tương ứng trong hệ thống, các tiện ích cần thiết trong /usr/bin vv

sudo apt update
sudo apt install lxd

Hãy đảm bảo rằng gói được cài đặt dưới dạng gói snap:

snap list

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

Cài đặt LXD trên bản phân phối Arch Linux ^

Để cài đặt gói LXD trên hệ thống, bạn cần chạy các lệnh sau, lệnh đầu tiên sẽ cập nhật danh sách các gói trên hệ thống có sẵn trong kho, lệnh thứ hai sẽ cài đặt trực tiếp gói:

sudo pacman -Syyu && sudo pacman -S lxd

Sau khi cài đặt gói, để quản lý LXD bởi người dùng thông thường, gói đó phải được thêm vào nhóm hệ thống lxd:

sudo usermod -a -G lxd user1

Hãy đảm bảo rằng người dùng user1 đã thêm vào nhóm lxd:

id -Gn user1

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

Nếu nhóm lxd không hiển thị trong danh sách thì bạn cần kích hoạt lại phiên người dùng. Để thực hiện việc này, bạn cần đăng xuất và đăng nhập dưới cùng một người dùng.

Kích hoạt trong systemd tải dịch vụ LXD khi khởi động hệ thống:

sudo systemctl enable lxd

Hãy bắt đầu dịch vụ:

sudo systemctl start lxd

Kiểm tra trạng thái dịch vụ:

sudo systemctl status lxd

Lưu trữ LXD (Lưu trữ) ^

Trước khi bắt đầu khởi tạo, chúng ta cần hiểu cách sắp xếp bộ nhớ trong LXD một cách hợp lý.

Kho (Kho) bao gồm từ một hoặc nhiều Bể chứa sử dụng một trong các hệ thống tệp được hỗ trợ như ZFS, BTRFS, LVM hoặc các thư mục thông thường. Mọi Bể chứa được chia thành các tập (Khối lượng lưu trữ) có chứa hình ảnh, vùng chứa hoặc dữ liệu cho các mục đích khác.

  • Hình ảnh - đây là những bản phân phối được lắp ráp đặc biệt không có nhân Linux và có sẵn từ các nguồn bên ngoài
  • Container - đây là những bản phân phối được triển khai từ hình ảnh, sẵn sàng để sử dụng
  • Ảnh chụp nhanh - đây là ảnh chụp nhanh về trạng thái của vùng chứa mà bạn có thể quay lại

Tính năng cơ bản của LXD - Hệ thống container Linux

Để quản lý lưu trữ trong LXD, hãy sử dụng lệnh lxc storage chứng chỉ mà bạn có thể lấy bằng cách chỉ định khóa - lxc storage --help

Lệnh sau hiển thị danh sách tất cả Bể chứa trong bộ lưu trữ LXD:

lxc storage list

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

Để xem danh sách tất cả Khối lượng lưu trữ trong phần đã chọn Bể chứa phục vụ đội 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       |
+-----------+----------------------------------+-------------+---------+

Ngoài ra, nếu vì Bể chứa Khi tạo thì hệ thống file BTRFS đã được chọn, sau đó lấy danh sách Khối lượng lưu trữ hoặc subvolume trong phần diễn giải BTRFS, bạn có thể sử dụng bộ công cụ của hệ thống tệp này:

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

Đang khởi tạo LXD ^

Trước khi tạo và sử dụng vùng chứa, bạn phải thực hiện khởi tạo LXD chung để tạo và định cấu hình mạng cũng như bộ lưu trữ. Điều này có thể được thực hiện thủ công bằng cách sử dụng các lệnh máy khách tiêu chuẩn có sẵn trong danh sách bằng cách gọi lệnh lxc --help hoặc sử dụng trình hướng dẫn khởi tạo lxd init trả lời một số câu hỏi.

Chọn hệ thống tệp cho Storage Pool ^

Trong quá trình khởi tạo, LXD hỏi một số câu hỏi, bao gồm việc xác định loại hệ thống tệp cho cài đặt mặc định. Bể chứa. Theo mặc định, hệ thống tệp BTRFS được chọn cho nó. Sẽ không thể thay đổi sang FS khác sau khi tạo. Để chọn một FS, chúng tôi khuyên bạn nên chọn bảng so sánh đặc điểm:

Đặc tính
thư mục
Btrfs
LVM
ZFS
CEPH

Lưu trữ hình ảnh được tối ưu hóa
Không
Vâng
Vâng
Vâng
Vâng

Tạo phiên bản được tối ưu hóa
Không
Vâng
Vâng
Vâng
Vâng

Tạo ảnh chụp nhanh được tối ưu hóa
Không
Vâng
Vâng
Vâng
Vâng

Truyền hình ảnh được tối ưu hóa
Không
Vâng
Không
Vâng
Vâng

Chuyển phiên bản được tối ưu hóa
Không
Vâng
Không
Vâng
Vâng

sao chép trên viết
Không
Vâng
Vâng
Vâng
Vâng

Dựa trên khối
Không
Không
Vâng
Không
Vâng

Nhân bản ngay lập tức
Không
Vâng
Vâng
Vâng
Vâng

Trình điều khiển lưu trữ có thể sử dụng được bên trong một container
Vâng
Vâng
Không
Không
Không

Khôi phục từ ảnh chụp nhanh cũ hơn (không phải mới nhất)
Vâng
Vâng
Vâng
Không
Vâng

Hạn ngạch lưu trữ
Đúng(*)
Vâng
Vâng
Vâng
Không

Khởi tạo mạng và nhóm lưu trữ bằng trình hướng dẫn ^

Lệnh tiếp theo chúng ta sẽ xem xét đề xuất thiết lập các thành phần chính của LXD bằng cách trả lời các câu hỏi đơn giản bằng trình hướng dẫn khởi tạo.

Chạy lệnh lxc init và nhập câu trả lời cho các câu hỏi sau dấu hai chấm như trong ví dụ bên dưới hoặc thay đổi theo điều kiện của bạn:

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]: 

Tạo một kho lưu trữ bổ sung ^

Ở bước trước chúng ta đã tạo Bể chứa cái tên đã được đặt ssdpool và tập tin đó nằm trên hệ thống của tôi tại /var/lib/lxd/disks/ssdpool.img. Địa chỉ hệ thống tệp này tương ứng với ổ SSD vật lý trong PC của tôi.

Các hành động sau đây nhằm mở rộng sự hiểu biết về vai trò của Bể chứa trong kho lưu trữ, chúng tôi sẽ tạo cái thứ hai Bể chứa sẽ được đặt trên một loại đĩa khác, HDD. Vấn đề là LXD không cho phép bạn tạo Bể chứa ngoài địa chỉ /var/lib/lxd/disks/ và thậm chí cả các liên kết tượng trưng cũng không hoạt động, xem phản hồi của nhà phát triển. Chúng ta có thể bỏ qua giới hạn này trong quá trình khởi tạo/định dạng Bể chứa bằng cách chỉ định giá trị là thiết bị khối thay vì đường dẫn đến tệp loopback bằng cách chỉ định giá trị này trong khóa source.

Vì vậy, trước khi tạo Bể chứa bạn cần xác định tệp loopback hoặc phân vùng hiện có trên hệ thống tệp mà nó sẽ sử dụng. Để thực hiện việc này, chúng tôi sẽ tạo và sử dụng một tệp mà chúng tôi sẽ giới hạn kích thước ở mức 10GB:

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

Hãy kết nối tệp loopback với thiết bị loopback miễn phí:

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

/dev/loop1

Nhờ có chìa khóa --show việc thực thi lệnh sẽ trả về màn hình tên của thiết bị mà tệp loopback của chúng tôi được kết nối. Nếu cần, chúng tôi có thể hiển thị danh sách tất cả các thiết bị bận thuộc loại này để đảm bảo rằng hành động của chúng tôi là chính xác:

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

Từ danh sách bạn có thể thấy rằng thiết bị có /dev/loop1 bao gồm tập tin loopback /mnt/work/lxd/hddpool.img, và trong thiết bị /dev/loop0 bao gồm tập tin loopback /var/lib/lxd/disks/ssdpool.img tương ứng với mặc định Bể chứa.

Lệnh sau tạo một lệnh mới Bể chứa trong LXD dựa trên tệp loopback mà chúng tôi vừa chuẩn bị. LXD sẽ định dạng tệp loopback /mnt/work/lxd/hddpool.img trong thiết bị /dev/loop1 đối với hệ thống tệp BTRFS:

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

Hãy hiển thị một danh sách tất cả Bể chứa để sàng lọc:

lxc storage list

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

Tăng kích thước bể lưu trữ ^

Sau khi tạo Bể chứa, nếu cần thiết, nó có thể được mở rộng. Vì Bể chứa dựa trên hệ thống tệp BTRFS, hãy chạy các lệnh sau:

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

Tự động chèn tệp loopback vào khe cắm thiết bị loopback ^

Chúng tôi có một vấn đề nhỏ, khi khởi động lại hệ thống máy chủ, tập tin /mnt/work/lxd/hddpool.img sẽ "bay" ra khỏi thiết bị /dev/loop1 và dịch vụ LXD sẽ gặp sự cố khi tải vì nó sẽ không nhìn thấy nó trong thiết bị này. Để giải quyết vấn đề này bạn cần tạo một dịch vụ hệ thống sẽ chèn file này vào thiết bị /dev/loop1 khi hệ thống máy chủ khởi động.

Hãy tạo ra đơn vị loại tệp dịch vụ в /etc/systemd/system/ đối với hệ thống khởi tạo 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

Kích hoạt dịch vụ:

sudo systemctl enable lxd-hddpool

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

Sau khi khởi động lại hệ thống máy chủ, chúng tôi kiểm tra trạng thái dịch vụ:

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).

Từ đầu ra, chúng tôi có thể xác minh rằng trạng thái dịch vụ là hoạt động, mặc dù thực tế là việc thực thi tập lệnh của chúng tôi từ một lệnh đã hoàn tất, tùy chọn cho phép chúng tôi thực hiện điều này RemainAfterExit=true.

Sự an toàn. Đặc quyền vùng chứa ^

Vì tất cả các quy trình vùng chứa thực sự chạy độc lập trên hệ thống máy chủ bằng cách sử dụng kernel của nó, để bảo vệ hơn nữa quyền truy cập của các quy trình vùng chứa vào hệ thống máy chủ, LXD cung cấp đặc quyền quy trình, trong đó:

  • Container đặc quyền - đây là các vùng chứa trong đó các tiến trình có UID và GID tương ứng với cùng một chủ sở hữu như trên hệ thống máy chủ. Ví dụ: một quy trình đang chạy trong vùng chứa có UID bằng 0 có tất cả các quyền truy cập giống như một quy trình trên hệ thống máy chủ có UID bằng 0. Nói cách khác, người dùng root trong vùng chứa có tất cả các quyền không chỉ trong vùng chứa mà còn trên hệ thống máy chủ nếu anh ta có thể đi ra ngoài không gian tên biệt lập của vùng chứa.

  • Vùng chứa không có đặc quyền - đây là những vùng chứa trong đó các tiến trình thuộc về chủ sở hữu của UID và GID có số từ 0 đến 65535, nhưng đối với hệ thống máy chủ, chủ sở hữu được che dấu bằng cách sử dụng các bit SubUID và SubGID được thêm vào tương ứng. Ví dụ: người dùng có UID=0 trong vùng chứa sẽ được nhìn thấy trên hệ thống máy chủ dưới dạng SubUID + UID. Điều này bảo vệ hệ thống máy chủ vì nếu bất kỳ quy trình nào trong vùng chứa có thể thoát khỏi vùng tên bị cô lập, thì nó chỉ có thể giao tiếp với hệ thống máy chủ dưới dạng một quy trình có UID/GID rất cao, không xác định.

Theo mặc định, các vùng chứa mới được tạo có trạng thái không có đặc quyền và do đó chúng ta phải xác định SubUID và SubGID.

Hãy tạo hai tệp cấu hình trong đó chúng ta sẽ đặt mặt nạ cho SubUID và SubGID tương ứng:

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

Để áp dụng các thay đổi, dịch vụ LXD phải được khởi động lại:

sudo systemctl restart lxd

Tạo switch mạng ảo ^

Vì trước đây chúng tôi đã khởi tạo mạng bằng trình hướng dẫn khởi tạo lxd init và tạo ra một thiết bị mạng lxdbr0, thì trong phần này chúng ta sẽ chỉ làm quen với việc kết nối mạng trong LXD và cách tạo một switch (cầu nối) ảo bằng lệnh client.

Sơ đồ sau đây minh họa cách một bộ chuyển mạch (cầu nối) kết nối máy chủ và vùng chứa vào mạng:

Tính năng cơ bản của LXD - Hệ thống container Linux

Các vùng chứa có thể giao tiếp qua mạng với các vùng chứa khác hoặc máy chủ lưu trữ các vùng chứa này. Để thực hiện việc này, bạn cần liên kết các card mạng ảo của vùng chứa với một bộ chuyển mạch ảo. Trước tiên, chúng ta sẽ tạo một công tắc và các giao diện mạng của vùng chứa sẽ được liên kết trong các chương tiếp theo, sau khi vùng chứa đã được tạo.

Lệnh sau tạo một switch có mạng con 10.0.5.0/24 và địa chỉ IPv4 10.0.5.1/24, và cũng bao gồm ipv4.nat để các container có thể truy cập Internet thông qua máy chủ bằng dịch vụ NAT:

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

Kiểm tra danh sách các thiết bị mạng có sẵn trong LXD:

lxc network list

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

Bạn cũng có thể xác minh rằng thiết bị mạng đã được tạo bằng công cụ tiêu chuẩn của bản phân phối Linux - ip link hoặc 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

Hồ sơ cấu hình ^

Mỗi vùng chứa trong LXD có cấu hình riêng và có thể mở rộng nó với các cấu hình được khai báo toàn cầu được gọi là hồ sơ cấu hình. Việc áp dụng cấu hình cấu hình cho vùng chứa có mô hình xếp tầng, ví dụ sau đây minh họa điều này:

Tính năng cơ bản của LXD - Hệ thống container Linux

Trong ví dụ này, ba cấu hình đã được tạo trong hệ thống LXD: default, hddpool и hostfs. Tất cả ba cấu hình đều được áp dụng cho vùng chứa có cấu hình cục bộ (vùng màu xám). Hồ sơ default có một thiết bị root trong đó có một tham số poolssdpool, nhưng nhờ mô hình ứng dụng cấu hình xếp tầng, chúng ta có thể áp dụng cấu hình cho vùng chứa hddpool trong đó có một tham số pool sẽ ghi đè tham số tương tự từ hồ sơ default và container sẽ nhận được cấu hình thiết bị root với tham số pool như nhau hddpool, và hồ sơ hostfs chỉ cần thêm một thiết bị mới vào vùng chứa.

Để xem danh sách các cấu hình cấu hình có sẵn, hãy sử dụng lệnh sau:

lxc profile list

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

Có thể lấy danh sách đầy đủ các lệnh có sẵn để làm việc với một cấu hình bằng cách thêm khóa --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

Chỉnh sửa hồ sơ của bạn ^

Hồ sơ cấu hình mặc định default không có cấu hình card mạng cho container và tất cả các container mới tạo đều không có mạng, đối với chúng cần tạo các thiết bị mạng cục bộ (chuyên dụng) bằng một lệnh riêng, nhưng chúng ta có thể tạo một thiết bị mạng toàn cầu trong cấu hình profile sẽ được chia sẻ giữa tất cả các vùng chứa sử dụng hồ sơ này. Bằng cách này, ngay sau lệnh tạo vùng chứa mới, họ sẽ có một mạng có quyền truy cập mạng. Đồng thời, không có hạn chế, chúng ta luôn có thể tạo thiết bị mạng cục bộ sau này nếu cần.

Lệnh sau sẽ thêm thiết bị vào hồ sơ cấu hình eth0 loại nic được kết nối với mạng lxdbr0:

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

Điều quan trọng cần lưu ý là vì chúng tôi thực sự đã thêm thiết bị vào hồ sơ cấu hình nên nếu chúng tôi chỉ định một địa chỉ IP tĩnh trong thiết bị thì tất cả các vùng chứa sẽ sử dụng hồ sơ này sẽ chia sẻ cùng một địa chỉ IP. Nếu có nhu cầu tạo vùng chứa có địa chỉ IP tĩnh được phân bổ cho vùng chứa thì bạn nên tạo cấu hình thiết bị mạng ở cấp vùng chứa (cấu hình cục bộ) với tham số địa chỉ IP chứ không phải ở cấp hồ sơ.

Hãy kiểm tra hồ sơ:

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: []

Trong hồ sơ này, chúng ta có thể thấy rằng đối với tất cả các vùng chứa mới được tạo, hai thiết bị sẽ được tạo:

  • eth0 - Loại thiết bị nic được kết nối với một switch (cầu nối mạng) lxdbr0
  • root - Loại thiết bị disk sử dụng một kho lưu trữ ssdpool

Tạo hồ sơ mới ^

Để sử dụng đã tạo trước đó Bể chứa vùng chứa, tạo hồ sơ cấu hình ssdroot trong đó chúng tôi sẽ thêm một thiết bị như disk với điểm gắn kết / (root) bằng cách sử dụng đã tạo trước đó Bể chứa - ssdpool:

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

Tương tự, chúng tôi tạo ra một thiết bị như disk, nhưng trong trường hợp này sử dụng Bể chứa - hddpool:

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

Kiểm tra hồ sơ cấu hình:

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: []

Kho lưu trữ hình ảnh ^

Các vùng chứa được tạo từ các hình ảnh là các bản phân phối được lắp ráp đặc biệt không có nhân Linux. Do đó, trước khi chạy container, nó phải được triển khai từ image này. Nguồn hình ảnh là kho lưu trữ cục bộ nơi hình ảnh được tải xuống từ kho lưu trữ bên ngoài.

Kho hình ảnh từ xa ^

Theo mặc định, LXD được cấu hình để nhận hình ảnh từ ba nguồn từ xa:

  • Ubuntu: (đối với hình ảnh Ubuntu ổn định)
  • Ubuntu-hàng ngày: (đối với hình ảnh Ubuntu hàng ngày)
  • hình ảnh: (đối với một loạt các bản phân phối khác)

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    |
+-----------------+------------------------------------------+--------+--------+

Ví dụ, kho lưu trữ ubuntu: có những hình ảnh sau:

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  |
+----------------------------------------------+--------------+----------+------------+

Để hiển thị số lượng cột giới hạn, chúng tôi đã sử dụng tùy chọn -c với các thông số dasut, đồng thời cũng giới hạn độ dài của danh sách bằng lệnh head.

Tính năng lọc có sẵn để hiển thị danh sách hình ảnh. Lệnh sau sẽ liệt kê tất cả các kiến ​​trúc phân phối có sẵn 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        |
+------------------------------+--------------------------------------+--------------+

Kho lưu trữ hình ảnh cục bộ ^

Để bắt đầu sử dụng vùng chứa, bạn cần thêm hình ảnh từ kho lưu trữ chung vào kho lưu trữ cục bộ local:. Bây giờ kho lưu trữ cục bộ trống, lệnh sẽ đảm bảo điều này lxc image list. Nếu phương pháp list không chỉ định kho lưu trữ thì kho lưu trữ cục bộ sẽ được sử dụng theo mặc định - local:

lxc image list local:

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

Hình ảnh trong kho được quản lý bằng các phương pháp sau:

Đội
Описание

hình ảnh lxc bí danh
Quản lý bí danh hình ảnh

hình ảnh lxc bản sao
Sao chép hình ảnh giữa các máy chủ

hình ảnh lxc xóa
Xóa hình ảnh

hình ảnh lxc chỉnh sửa
Chỉnh sửa thuộc tính hình ảnh

hình ảnh lxc xuất khẩu
Xuất và tải xuống hình ảnh

hình ảnh lxc nhập khẩu
Nhập hình ảnh vào kho hình ảnh

hình ảnh lxc Thông tin
Hiển thị thông tin hữu ích về hình ảnh

hình ảnh lxc
Liệt kê hình ảnh

hình ảnh lxc làm mới
Làm mới hình ảnh

hình ảnh lxc hiển thị
Hiển thị thuộc tính hình ảnh

Sao chép hình ảnh vào kho lưu trữ cục bộ từ kho lưu trữ chung images::

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

Image copied successfully!

Hãy hiển thị danh sách tất cả các hình ảnh hiện có trong kho lưu trữ cục bộ local::

lxc image -c lfdatsu list local:

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

Cấu hình LXD ^

Ngoài chế độ tương tác, LXD còn hỗ trợ chế độ cài đặt cấu hình không tương tác, đây là khi cấu hình được chỉ định dưới dạng tệp YAML, một định dạng đặc biệt cho phép bạn cài đặt toàn bộ cấu hình cùng một lúc, bỏ qua việc thực thi của nhiều lệnh tương tác đã được thảo luận ở trên trong bài viết này, bao gồm cấu hình mạng, tạo hồ sơ cấu hình, v.v. Chúng tôi sẽ không đề cập đến lĩnh vực này ở đây, bạn có thể tự mình kiểm tra. trong tài liệu.

Lệnh tương tác tiếp theo lxc config mà chúng tôi sẽ xem xét cho phép bạn thiết lập cấu hình. Ví dụ: để đảm bảo rằng hình ảnh đã tải xuống kho lưu trữ cục bộ không được cập nhật tự động từ kho lưu trữ chung, chúng tôi có thể kích hoạt hành vi này bằng lệnh sau:

lxc config set images.auto_update_cached=false

Tạo và quản lý vùng chứa ^

Để tạo vùng chứa sử dụng lệnh lxc init những giá trị nào được chuyển đến репозиторий:образ và sau đó là ID mong muốn cho vùng chứa. Kho lưu trữ có thể được chỉ định là cục bộ local: bất kỳ cái toàn cầu nào cũng vậy. Nếu kho lưu trữ không được chỉ định thì theo mặc định, kho lưu trữ cục bộ sẽ được sử dụng để tìm kiếm hình ảnh. Nếu hình ảnh được chỉ định từ kho lưu trữ chung thì trước tiên hình ảnh sẽ được tải xuống kho lưu trữ cục bộ và sau đó được sử dụng để tạo vùng chứa.

Hãy chạy lệnh sau để tạo vùng chứa đầu tiên:

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

Hãy xem các phím lệnh mà chúng tôi sử dụng ở đây theo thứ tự:

  • alpine3 — Bí danh (bí danh) được chỉ định cho hình ảnh đã được tải lên kho lưu trữ cục bộ trước đó. Nếu bí danh không được tạo cho hình ảnh này thì bạn luôn có thể tham khảo hình ảnh đó bằng vân tay được hiển thị trong bảng.
  • alp - Đặt mã định danh cho vùng chứa
  • --storage - Phím này cho biết trong đó Bể chứa một thùng chứa sẽ được tạo
  • --profile — Các tầng khóa này áp dụng cấu hình từ các cấu hình cấu hình đã tạo trước đó cho vùng chứa

Chúng tôi khởi chạy container, bắt đầu khởi chạy hệ thống init của bản phân phối:

lxc start alp

Bạn cũng có thể sử dụng lệnh lxc launch cho phép bạn kết hợp các đội lxc init и lxc start trong một thao tác.

Kiểm tra trạng thái của container:

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

Kiểm tra cấu hình vùng chứa:

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: ""

Trong phần profiles chúng ta có thể đảm bảo rằng vùng chứa này sử dụng hai cấu hình cấu hình - default и hddroot. Trong phần devices chúng tôi chỉ có thể phát hiện một thiết bị vì thiết bị mạng đã được tạo ở cấp hồ sơ default. Để xem tất cả các thiết bị được vùng chứa sử dụng, bạn cần thêm khóa --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: ""

Đặt địa chỉ IP tĩnh ^

Nếu chúng tôi cố gắng đặt địa chỉ IP cho thiết bị mạng eth0 đội lxc config device set alp dành cho cấu hình vùng chứa thì chúng tôi sẽ nhận được lỗi báo cáo rằng thiết bị không tồn tại do thiết bị eth0 được container sử dụng thuộc về hồ sơ default:

lxc config device set alp eth0 ipv4.address 10.0.5.5

Error: The device doesn't exist

Tất nhiên chúng ta có thể đặt địa chỉ IP tĩnh cho eth0 thiết bị trong hồ sơ, nhưng nó sẽ giống nhau đối với tất cả các vùng chứa sẽ sử dụng hồ sơ này. Vì vậy, hãy thêm một thiết bị dành riêng cho container:

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

Sau đó, bạn cần khởi động lại container:

lxc restart alp

Nếu bây giờ chúng ta xem cấu hình vùng chứa, chúng ta không cần sử dụng tùy chọn --expanded để xem thiết bị mạng eth0, vì chúng tôi đã tạo nó ở cấp vùng chứa và nó được xếp tầng trên cùng một thiết bị từ cấu hình 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: ""

Loại bỏ một thùng chứa ^

Để loại bỏ một container, sử dụng lệnh lxc delete, nhưng trước khi gỡ bỏ container phải dừng nó bằng lệnh lxc stop:

lxc stop alp

lxc list

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

Sau khi chúng tôi xác minh rằng trạng thái của vùng chứa đã trở thành DỪNG, nó có thể được gỡ bỏ khỏi Bể chứa:

lxc delete alp

Truy cập vùng chứa ^

Để thực thi trực tiếp các lệnh trong vùng chứa, bỏ qua các kết nối mạng, hãy sử dụng lệnh lxc exec thực thi các lệnh trong vùng chứa mà không khởi chạy shell hệ thống. Nếu bạn cần thực thi một lệnh trong shell bằng cách sử dụng các mẫu shell như biến, chuyển hướng tệp (ống), v.v., thì bạn cần khởi chạy shell một cách rõ ràng và truyền lệnh dưới dạng khóa, ví dụ:

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

Lệnh sử dụng ký tự thoát đặc biệt cho nhân vật đặc biệt $ do đó biến $HOME không được diễn giải trên máy chủ mà chỉ được diễn giải bên trong vùng chứa.

Cũng có thể bắt đầu chế độ shell tương tác và sau đó kết thúc phiên bằng cách thực thi phím nóng CTRL+D:

lxc exec alp -- /bin/sh

Quản lý tài nguyên vùng chứa ^

Trong LXD, bạn có thể quản lý tài nguyên vùng chứa bằng cách sử dụng một bộ cấu hình đặc biệt. Có thể tìm thấy danh sách đầy đủ các tham số cấu hình vùng chứa trong tài liệu.

Giới hạn tài nguyên RAM ^

Thông số limits.memory giới hạn số lượng RAM có sẵn cho vùng chứa. Giá trị là một số và một trong hậu tố có sẵn.

Hãy đặt giới hạn RAM của vùng chứa thành 256 MB:

lxc config set alp limits.memory 256MB

Ngoài ra, còn có các tham số khác để giới hạn bộ nhớ:

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

Đội lxc config show cho phép bạn hiển thị toàn bộ cấu hình vùng chứa, bao gồm giới hạn tài nguyên được áp dụng đã được đặt:

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: ""

Giới hạn tài nguyên CPU ^

Có một số cách để hạn chế tài nguyên CPU. các loại hạn chế:

  • limit.cpu - liên kết một thùng chứa với một hoặc nhiều lõi CPU
  • limits.cpu.allowance - quản lý hạn ngạch bộ lập lịch CFS khi hết thời gian hoặc cơ chế chia sẻ tài nguyên CPU chung khi phần trăm đã trôi qua
  • limits.cpu.priority - mức độ ưu tiên của bộ lập lịch khi nhiều phiên bản chia sẻ một bộ bộ xử lý được chỉ định cùng một tỷ lệ phần trăm bộ xử lý

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: ""

Giới hạn dung lượng ổ đĩa ^

Ngoài những hạn chế như limits.read, limits.write chúng tôi cũng có thể giới hạn dung lượng ổ đĩa mà vùng chứa tiêu thụ (chỉ hoạt động với ZFS hoặc BTRFS):

lxc config device set alp root size=2GB

Sau khi cài đặt, trong tham số devices.root.size Chúng tôi có thể xác minh giới hạn đã đặt:

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

Để xem hạn ngạch đĩa đã sử dụng, chúng ta có thể nhận được từ lệnh 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

Mặc dù thực tế là chúng tôi đã đặt giới hạn cho thiết bị gốc của vùng chứa là 2GB, nhưng các tiện ích hệ thống như df sẽ không thấy hạn chế này. Để làm điều này, chúng tôi sẽ tiến hành một thử nghiệm nhỏ và tìm hiểu cách thức hoạt động của nó.

Hãy tạo 2 container mới giống hệt nhau trong cùng một Bể chứa (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         |
+------+---------+------------------+------+-----------+-----------+

Hãy tạo một tệp 1GB ở một trong các vùng chứa:

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

Hãy đảm bảo tệp được tạo:

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

Nếu chúng ta nhìn vào vùng chứa thứ hai, kiểm tra sự tồn tại của một tệp ở cùng một vị trí, thì tệp này sẽ không ở đó, điều này như mong đợi, vì các vùng chứa được tạo riêng Khối lượng lưu trữ trong cùng một Bể chứa:

lxc exec alp2 -- ls -lh
total 0

Nhưng hãy so sánh những giá trị nó tạo ra df trên một và container khác:

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% /
...

Thiết bị /dev/loop1 được gắn làm phân vùng gốc là Bể chứa mà những thùng chứa này sử dụng, vì vậy chúng chia sẻ dung lượng của nó giữa hai thùng chứa.

Thống kê tiêu thụ tài nguyên ^

Bạn có thể xem số liệu thống kê mức tiêu thụ tài nguyên cho một vùng chứa bằng lệnh:

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

Làm việc với ảnh chụp nhanh ^

LXD có khả năng tạo ảnh chụp nhanh và khôi phục trạng thái vùng chứa từ chúng.

Để tạo ảnh chụp nhanh, hãy chạy lệnh sau:

lxc snapshot alp snapshot1

Đội lxc snapshot không có chìa khóa list, do đó, để xem danh sách các ảnh chụp nhanh, bạn cần sử dụng lệnh hiển thị thông tin chung về vùng chứa:

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

Bạn có thể khôi phục vùng chứa từ ảnh chụp nhanh bằng lệnh lxc restore chỉ định vùng chứa sẽ thực hiện khôi phục và bí danh ảnh chụp nhanh:

lxc restore alp snapshot1

Lệnh sau được sử dụng để xóa ảnh chụp nhanh. Xin lưu ý rằng cú pháp lệnh không giống với tất cả các cú pháp khác; ở đây bạn cần chỉ định dấu gạch chéo lên sau tên vùng chứa. Nếu dấu gạch chéo bị bỏ qua thì lệnh xóa ảnh chụp nhanh được hiểu là lệnh xóa vùng chứa!

lxc delete alp/snapshot1

Trong ví dụ trên, chúng ta đã xem xét cái gọi là ảnh chụp nhanh không trạng thái. LXD có một loại ảnh chụp nhanh khác - trạng thái, giúp lưu trạng thái hiện tại của tất cả các quy trình trong vùng chứa. Có một số tính năng thú vị và hữu ích liên quan đến ảnh chụp nhanh có trạng thái.

Còn gì nữa? ^

  • Một mô-đun có sẵn cho các nhà phát triển Python PyLXD cung cấp API cho LXD

UPDATE 10.04.2020/15/00 XNUMX:XNUMX: Đã thêm điều hướng

Nguồn: www.habr.com

Thêm một lời nhận xét