Sunday, January 19, 2025

[Openstack] Phần 3: Image service

-

1. Tổng quan.

Glance là một dịch vụ quản lý image trong OpenStack. Nó cho phép bạn tạo, quản lý và chia sẻ các image, snapshot của các máy ảo (VMs) hoặc các ứng dụng.

Trong OpenStack, Glance cung cấp khả năng quản lý các image để triển khai các máy ảo. Với Glance, bạn có thể tải lên các image của hệ điều hành, ứng dụng và các dịch vụ cần thiết khác như một hình ảnh để triển khai các máy ảo. Glance cung cấp API RESTful để quản lý các image.

Khi một image được tải lên Glance, nó sẽ được lưu trữ trong một backend image store, có thể là một local file system, hoặc một hệ thống lưu trữ đám mây như Swift hoặc Ceph. Khi một instance máy ảo được khởi động, nó sẽ sử dụng image được lưu trữ trong Glance để tạo ra một bản sao của hệ điều hành và các ứng dụng cần thiết.

Việc cài đặt và cấu hình Glance cho phép các image của hệ điều hành và các ứng dụng được tải lên và lưu trữ một cách hiệu quả, giúp việc triển khai các máy ảo trên OpenStack trở nên dễ dàng hơn.

2. Cấu hình.

2.1. Tạo Database.

Đầu tiên hãy tạo Database glance và phân quyền cho nó.

sudo mysql -u root -pHoanghd164 -e "CREATE DATABASE glance;"
sudo mysql -u root -pHoanghd164 -e "GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' IDENTIFIED BY 'GLANCE_DBPASS';"
sudo mysql -u root -pHoanghd164 -e "GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' IDENTIFIED BY 'GLANCE_DBPASS';"
sudo mysql -u root -pHoanghd164 -e "FLUSH PRIVILEGES;"

2.2. Tạo một người dùng cho dịch vụ Glance.

Sử dụng lệnh . admin-openrc để kích hoạt môi trường của OpenStack Admin.

. admin-openrc

Tiếp theo, tạo một người dùng Glance với lệnh openstack user create --domain default glance --password "GLANCE_PASS", trong đó:

  • “–domain default”: đặt domain cho người dùng là default.
  • “glance”: tên của người dùng.
  • “–password”: mật khẩu cho người dùng Glance.
$ openstack user create --domain default glance --password "GLANCE_PASS"
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | default                          |
| enabled             | True                             |
| id                  | 3f4e777c4062483ab8d9edd7dff829df |
| name                | glance                           |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+

Sử dụng lệnh openstack role add --project service --user glance admin để gán vai trò admin cho người dùng Glance trên project service.

openstack role add --project service --user glance admin

2.3. Tạo dịch vụ Glance.

Tạo một dịch vụ Glance với lệnh openstack service create --name glance --description "OpenStack Image" image, trong đó:

  • “–name glance”: đặt tên cho dịch vụ là glance.
  • “–description “OpenStack Image””: đặt mô tả cho dịch vụ là OpenStack Image.
  • “image”: loại dịch vụ là image.
$ openstack service create --name glance --description "OpenStack Image" image
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | OpenStack Image                  |
| enabled     | True                             |
| id          | 8c2c7f1b9b5049ea9e63757b5533e6d2 |
| name        | glance                           |
| type        | image                            |
+-------------+----------------------------------+

2.4. Tạo Endpoint Glance.

Trong OpenStack, mỗi dịch vụ thường có ba loại endpoint: admin, public và internal. Mỗi loại endpoint này được sử dụng cho một mục đích cụ thể:

  • Admin endpoint: Được sử dụng cho các yêu cầu quản trị từ các dịch vụ khác trong hệ thống OpenStack. Ví dụ, một dịch vụ có thể sử dụng admin endpoint để thực hiện các thao tác quản lý như tạo hoặc xóa tài nguyên.
  • Public endpoint: Được sử dụng cho các yêu cầu từ người dùng cuối hoặc các ứng dụng bên ngoài hệ thống OpenStack. Ví dụ, một ứng dụng web có thể sử dụng public endpoint để tạo một máy ảo mới hoặc lấy danh sách các image.
  • Internal endpoint: Được sử dụng cho các yêu cầu giữa các dịch vụ trong hệ thống OpenStack. Ví dụ, dịch vụ Nova có thể sử dụng internal endpoint của Glance để lấy một image khi tạo một máy ảo mới.

Việc tạo cả ba loại endpoint cho phép bạn tinh chỉnh quyền truy cập và hiệu suất cho mỗi loại yêu cầu.

Ví dụ, bạn có thể cấu hình mạng để chỉ cho phép các yêu cầu quản trị đi qua admin endpoint, hoặc bạn có thể đặt internal endpoint trên một mạng riêng để tăng hiệu suất cho các yêu cầu giữa các dịch vụ.

Để tạo endpoint cho dịch vụ Glance bằng cách sử dụng các lệnh sau:

  • Tạo endpoint public cho dịch vụ Glance, trong đó:
    • “–region RegionOne”: đặt khu vực của endpoint là RegionOne.
    • “image”: đặt loại dịch vụ cho endpoint là image.
    • “public”: đặt endpoint cho môi trường public.
    • http://controller:9292“: đặt URL cho endpoint.
openstack endpoint create --region RegionOne image public http://controller:9292

Tương tự, tạo endpoint internal cho dịch vụ Glance với các thông số tương tự endpoint public.

openstack endpoint create --region RegionOne image internal http://controller:9292

Và tạo endpoint admin cho dịch vụ Glance với các thông số tương tự endpoint public.

openstack endpoint create --region RegionOne image admin http://controller:9292

Ví dụ.

$ openstack endpoint create --region RegionOne image public http://controller:9292
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 340be3625e9b4239a6415d034e98aace |
| interface    | public                           |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 8c2c7f1b9b5049ea9e63757b5533e6d2 |
| service_name | glance                           |
| service_type | image                            |
| url          | http://controller:9292           |
+--------------+----------------------------------+

$ openstack endpoint create --region RegionOne image internal http://controller:9292
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | a6e4b153c2ae4c919eccfdbb7dceb5d2 |
| interface    | internal                         |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 8c2c7f1b9b5049ea9e63757b5533e6d2 |
| service_name | glance                           |
| service_type | image                            |
| url          | http://controller:9292           |
+--------------+----------------------------------+

$ openstack endpoint create --region RegionOne image admin http://controller:9292
+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 0c37ed58103f4300a84ff125a539032d |
| interface    | admin                            |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 8c2c7f1b9b5049ea9e63757b5533e6d2 |
| service_name | glance                           |
| service_type | image                            |
| url          | http://controller:9292           |
+--------------+----------------------------------+

2.5. Cài đặt Glance.

Trên một Controller Node bất kỳ, bạn hãy cài đặt Glance Service bằng lệnh dưới.

apt install glance -y

2.6. Cấu hình Glance.

Cấu hình Database.

Chỉnh sử dòng lệnh [database] đặt trong file /etc/glance/glance-api.conf để xác định đường dẫn tới CSDL mà Glance sử dụng để lưu trữ các thông tin về các image.

[database]
connection = mysql+pymysql://glance:GLANCE_DBPASS@controller/glance

Trong đó:

  • mysql+pymysql Chỉ định loại cơ sở dữ liệu và driver sử dụng và trong trường hợp này, Glance sử dụng cơ sở dữ liệu MySQL và driver PyMySQL để kết nối đến cơ sở dữ liệu.
  • glance:GLANCE_DBPASS Chỉ định tên người dùng và mật khẩu để kết nối đến cơ sở dữ liệu. Trong trường hợp này, tên người dùng là glance và mật khẩu tương ứng được đặt là GLANCE_DBPASS. Chú ý rằng mật khẩu này phải được đặt trước khi thực thi lệnh này.
  • @controller/glance Chỉ định địa chỉ và CSDL. Trong trường hợp này, Glance sử dụng cơ sở dữ liệu có tên là glance trên máy chủ controller.

Cấu hình Keystone Authtoken.

Phần cấu hình [keystone_authtoken] trong file cấu hình của Glance (hoặc bất kỳ dịch vụ OpenStack nào khác) được sử dụng để xác thực dịch vụ với Keystone, dịch vụ xác thực chính của OpenStack.

Việc xác thực với Keystone quan trọng vì nó cho phép OpenStack kiểm soát quyền truy cập vào các dịch vụ. Khi một yêu cầu đến Glance, Glance sẽ sử dụng thông tin trong phần [keystone_authtoken] để yêu cầu Keystone xác thực yêu cầu. Nếu yêu cầu được xác thực, Glance sẽ tiếp tục xử lý yêu cầu. Nếu không, Glance sẽ từ chối yêu cầu.

Chỉnh sử dòng lệnh [keystone_authtoken] đặt trong file /etc/glance/glance-api.conf.

  • www_authenticate_uriauth_url: địa chỉ của Identity service (Keystone) để xác thực các yêu cầu từ Glance.
  • memcached_servers: địa chỉ của memcached, một dịch vụ cache, sử dụng để lưu trữ thông tin phi trạng thái giữa các yêu cầu xác thực.
  • auth_type: loại xác thực, được thiết lập là password để sử dụng xác thực bằng tài khoản và mật khẩu.
  • project_domain_name, user_domain_name, project_name, username, và password: thông tin xác thực để Glance có thể đăng nhập và gửi yêu cầu tới Keystone. Cụ thể, tài khoản được sử dụng là glance, thuộc project service với mật khẩu là GLANCE_PASS.
[keystone_authtoken]
www_authenticate_uri = http://controller:5000
auth_url = http://controller:5000
memcached_servers = controller:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = glance
password = GLANCE_PASS

Cấu hình Keystone Authtoken.

Chỉnh sử dòng lệnh [paste_deploy] đặt trong file /etc/glance/glance-api.conf.

[paste_deploy] là một section trong file /etc/glance/glance-api.conf được sử dụng để cấu hình các tùy chọn triển khai. Trong trường hợp này, flavor = keystone chỉ định triển khai keystone cho Glance API. Keystone là dịch vụ xác thực và ủy quyền của OpenStack, được sử dụng để quản lý quyền truy cập vào các dịch vụ OpenStack. Bằng cách sử dụng Keystone, Glance API có thể xác thực và phân quyền người dùng để truy cập vào hệ thống.

[paste_deploy]
flavor = keystone

[glance_store] là một section trong file /etc/glance/glance-api.conf và được sử dụng để cấu hình các tùy chọn lưu trữ (storage options) cho Glance Image Service.

[glance_store]
stores = file,http
default_store = file
filesystem_store_datadir = /var/lib/glance/images/

Trong đó:

  • stores: Cho phép bạn chọn các driver lưu trữ khác nhau mà Glance Image Service sẽ sử dụng. Ví dụ: file, http, rbd, swift, ceph, vsphere, …
  • default_store: Tùy chọn này xác định driver lưu trữ mặc định sẽ được sử dụng nếu tùy chọn “store” không được chỉ định. Trong ví dụ này, file được chọn làm driver lưu trữ mặc định.
  • filesystem_store_datadir: Tùy chọn này chỉ định thư mục sẽ được sử dụng để lưu trữ các image file. Trong ví dụ này, /var/lib/glance/images/ được sử dụng.

Cấu hình kiểm soát số lượng tài nguyên mà một dịch vụ có thể sử dụng.

Trong OpenStack, oslo.limit được sử dụng để kiểm soát số lượng tài nguyên mà một dịch vụ có thể sử dụng. Ví dụ, oslo.limit có thể được sử dụng để giới hạn số lượng máy ảo mà một khách hàng có thể tạo hoặc giới hạn băng thông mà một máy chủ có thể sử dụng.

Trong file cấu hình /etc/glance/glance-api.conf, bạn sử dụng endpoint của dịch vụ Glance. Trong trường hợp của bạn, có 3 endpoint cho dịch vụ Glance, tương ứng với 3 giao diện khác nhau: admin, public và internal.

  • admin: Dùng cho các yêu cầu quản trị từ các dịch vụ khác trong hệ thống OpenStack.
  • public: Dùng cho các yêu cầu từ bên ngoài hệ thống OpenStack.
  • internal: Dùng cho các yêu cầu giữa các dịch vụ trong hệ thống OpenStack.

Trong hầu hết các trường hợp, bạn sẽ sử dụng endpoint admin hoặc internal cho file cấu hình glance-api.conf. Tuy nhiên, điều này cũng phụ thuộc vào cách bạn muốn cấu hình hệ thống của mình.

Bạn có thể lấy danh sách các endpoint trong hệ thống OpenStack của bạn bằng cách sử dụng lệnh openstack endpoint list.

shell> openstack endpoint list
+----------------------------------+-----------+--------------+--------------+---------+-----------+----------------------------+
| ID                               | Region    | Service Name | Service Type | Enabled | Interface | URL                        |
+----------------------------------+-----------+--------------+--------------+---------+-----------+----------------------------+
| 0eec09c2a3e94d68b873544ef782d9ff | RegionOne | glance       | image        | True    | admin     | http://controller:9292     |
| 293364677ed043be9f3575950f71200c | RegionOne | keystone     | identity     | True    | public    | http://controller:5000/v3/ |
| 954119d22e4d49ee9be2e02d4dad614e | RegionOne | keystone     | identity     | True    | admin     | http://controller:5000/v3/ |
| c3f48acadfc249818bf8a3ea0501f418 | RegionOne | glance       | image        | True    | public    | http://controller:9292     |
| d0532e2e9f0648f38536a327573690ff | RegionOne | glance       | image        | True    | internal  | http://controller:9292     |
| dee3ed09d4bd4c9b83ccc3b36d764765 | RegionOne | keystone     | identity     | True    | internal  | http://controller:5000/v3/ |
+----------------------------------+-----------+--------------+--------------+---------+-----------+----------------------------+

Dưới đây là ID của các endpoint Glance tương ứng:

  • Admin: 0eec09c2a3e94d68b873544ef782d9ff
  • Public: c3f48acadfc249818bf8a3ea0501f418
  • Internal: d0532e2e9f0648f38536a327573690ff

Bạn có thể chọn một trong những ID này để sử dụng trong file cấu hình glance-api.conf. Vui lòng thay thế MY_SERVICEMY_PASSWORD và ENDPOINT_ID với các giá trị thực tế trong cấu hình của bạn.

[oslo_limit]
auth_url = http://controller:5000
auth_type = password
user_domain_id = default
username = glance
system_scope = all
password = GLANCE_PASS
endpoint_id = 0eec09c2a3e94d68b873544ef782d9ff
region_name = RegionOne

Các thông số cấu hình bao gồm:

  • auth_url: URL của service Keystone để xác thực
  • auth_type: Phương thức xác thực được sử dụng, ở đây là password
  • user_domain_id: ID của user domain được sử dụng để xác thực
  • username: Tên người dùng được sử dụng để xác thực với Keystone
  • system_scope: Phạm vi hệ thống được sử dụng cho tài nguyên Glance, ở đây là all
  • password: Mật khẩu được sử dụng để xác thực với Keystone
  • endpoint_id: ID của endpoint được sử dụng để truy cập vào dịch vụ Glance
  • region_name: Tên của khu vực mà dịch vụ Glance đang chạy, ở đây là RegionOne

Thêm vai trò reader cho người dùng glance trên tất cả các hệ thống.

Trong OpenStack, một “vai trò” (role) là một tập hợp các quyền truy cập mà bạn có thể gán cho người dùng. Ví dụ, một người dùng với vai trò admin có thể tạo và xóa tài nguyên, trong khi một người dùng với vai trò reader chỉ có thể xem tài nguyên nhưng không thể thay đổi chúng.

Lệnh openstack role add --user glance --user-domain Default --system all reader gán vai trò reader cho người dùng glance trên toàn hệ thống (--system all).

Trong trường hợp này, bạn đang gán vai trò reader cho người dùng glance. Điều này có nghĩa là người dùng glance có thể xem tất cả các tài nguyên trên hệ thống, nhưng không thể tạo, chỉnh sửa hoặc xóa chúng. Điều này có thể hữu ích nếu bạn muốn người dùng glance có quyền truy cập đọc vào các tài nguyên nhưng không muốn họ thay đổi chúng.

openstack role add --user glance --user-domain Default --system all reader

Đồng bộ hóa cơ sở dữ liệu của Glance với schema mới nhất.

Lệnh su được sử dụng để thay đổi người dùng trong terminal. Trong trường hợp này, chúng ta muốn chuyển đổi sang người dùng glance. Tham số -s /bin/sh xác định shell được sử dụng khi đăng nhập vào tài khoản glance. Sau khi chuyển đổi người dùng sang glance, lệnh glance-manage db_sync được sử dụng để đồng bộ hóa cơ sở dữ liệu của Glance với schema mới nhất. Các bảng CSDL mới được tạo ra và các CSDL hiện có được cập nhật để đảm bảo hệ thống Glance hoạt động đúng cách.

su -s /bin/sh -c "glance-manage db_sync" glance

Ví dụ về đầu ra của lệnh su -s /bin/sh -c "glance-manage db_sync" glance.

shell> su -s /bin/sh -c "glance-manage db_sync" glance
2024-02-24 07:09:27.446 49686 INFO alembic.runtime.migration [-] Context impl MySQLImpl.
2024-02-24 07:09:27.446 49686 INFO alembic.runtime.migration [-] Will assume non-transactional DDL.
2024-02-24 07:09:27.459 49686 INFO alembic.runtime.migration [-] Context impl MySQLImpl.
2024-02-24 07:09:27.459 49686 INFO alembic.runtime.migration [-] Will assume non-transactional DDL.
INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.runtime.migration] Running upgrade  -> liberty, liberty initial
INFO  [alembic.runtime.migration] Running upgrade liberty -> mitaka01, add index on created_at and updated_at columns of 'images' table
INFO  [alembic.runtime.migration] Running upgrade mitaka01 -> mitaka02, update metadef os_nova_server
INFO  [alembic.runtime.migration] Running upgrade mitaka02 -> ocata_expand01, add visibility to images
INFO  [alembic.runtime.migration] Running upgrade ocata_expand01 -> pike_expand01, empty expand for symmetry with pike_contract01
INFO  [alembic.runtime.migration] Running upgrade pike_expand01 -> queens_expand01
INFO  [alembic.runtime.migration] Running upgrade queens_expand01 -> rocky_expand01, add os_hidden column to images table
INFO  [alembic.runtime.migration] Running upgrade rocky_expand01 -> rocky_expand02, add os_hash_algo and os_hash_value columns to images table
INFO  [alembic.runtime.migration] Running upgrade rocky_expand02 -> train_expand01, empty expand for symmetry with train_contract01
INFO  [alembic.runtime.migration] Running upgrade train_expand01 -> ussuri_expand01, empty expand for symmetry with ussuri_expand01
INFO  [alembic.runtime.migration] Running upgrade ussuri_expand01 -> wallaby_expand01, add image_id, request_id, user columns to tasks table"
INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
Upgraded database to: wallaby_expand01, current revision(s): wallaby_expand01
INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
Database migration is up to date. No migration needed.
INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.runtime.migration] Running upgrade mitaka02 -> ocata_contract01, remove is_public from images
INFO  [alembic.runtime.migration] Running upgrade ocata_contract01 -> pike_contract01, drop glare artifacts tables
INFO  [alembic.runtime.migration] Running upgrade pike_contract01 -> queens_contract01
INFO  [alembic.runtime.migration] Running upgrade queens_contract01 -> rocky_contract01
INFO  [alembic.runtime.migration] Running upgrade rocky_contract01 -> rocky_contract02
INFO  [alembic.runtime.migration] Running upgrade rocky_contract02 -> train_contract01
INFO  [alembic.runtime.migration] Running upgrade train_contract01 -> ussuri_contract01
INFO  [alembic.runtime.migration] Running upgrade ussuri_contract01 -> wallaby_contract01
INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
Upgraded database to: wallaby_contract01, current revision(s): wallaby_contract01
INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
Database is synced successfully.

Khởi động lại Glance.

Cuối cùng ta khởi động lại các dịch vụ của image service.

service glance-api restart

Thêm một image trên Glance.

Sau khi hoàn thành config, chúng ta hãy verify lại dịch vụ. Đầu tiên, sử dụng lệnh . admin-openrc để kích hoạt môi trường của OpenStack Admin.

. admin-openrc

Download file image test về máy chủ, cụ thể mình sử dụng cirros-0.4.0-x86_64-disk.img.

wget http://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img

Sử dụng lệnh openstack image create để tạo một image trên Glance, dịch vụ quản lý image trong OpenStack.

Cụ thể, lệnh này tạo ra một image có tên là cirros bằng cách:

$ openstack image create "cirros" \
  --file cirros-0.4.0-x86_64-disk.img \
  --disk-format qcow2 --container-format bare \
  --public

+------------------+------------------------------------------------------+
| Field            | Value                                                |
+------------------+------------------------------------------------------+
| checksum         | 133eae9fb1c98f45894a4e60d8736619                     |
| container_format | bare                                                 |
| created_at       | 2015-03-26T16:52:10Z                                 |
| disk_format      | qcow2                                                |
| file             | /v2/images/cc5c6982-4910-471e-b864-1098015901b5/file |
| id               | cc5c6982-4910-471e-b864-1098015901b5                 |
| min_disk         | 0                                                    |
| min_ram          | 0                                                    |
| name             | cirros                                               |
| owner            | ae7a98326b9c455588edd2656d723b9d                     |
| protected        | False                                                |
| schema           | /v2/schemas/image                                    |
| size             | 13200896                                             |
| status           | active                                               |
| tags             |                                                      |
| updated_at       | 2015-03-26T16:52:10Z                                 |
| virtual_size     | None                                                 |
| visibility       | public                                               |
+------------------+------------------------------------------------------+
  • --file cirros-0.4.0-x86_64-disk.img: Chỉ định đường dẫn đến file image, ở đây là cirros-0.4.0-x86_64-disk.img.
  • --disk-format qcow2: Chỉ định định dạng của file image, ở đây là qcow2.
  • --container-format bare: Chỉ định định dạng của container image, ở đây là bare.
  • --public: Chỉ định rằng image này sẽ được public và có thể được truy cập bởi tất cả người dùng trong hệ thống OpenStack.

Với lệnh này, Glance sẽ tạo ra một image mới với tên là cirros và sử dụng file cirros-0.4.0-x86_64-disk.img để tạo ra image này. Image sẽ được lưu trữ trong Glance và có thể được sử dụng để tạo máy ảo.

Sử dụng lệnh dưới để xác nhận rằng image đã được thêm thành công.

$ openstack image list
+--------------------------------------+--------+--------+
| ID                                   | Name   | Status |
+--------------------------------------+--------+--------+
| 38047887-61a7-41ea-9b49-27987d5e8bb9 | cirros | active |
+--------------------------------------+--------+--------+

Phần tiếp theo, chúng ta sẽ cài đặt và cấu hình Placement service.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories