OpenStack-Skyline组件

本次实验采用Ubuntu2404系统,Openstack版本C版,已经提前搭建好keystone、glance、placement、nova、neutron等服务

Skyline 是 OpenStack 的一个新型 Web 前端组件,由浪潮自研开发,用于替代传统的 Horizon 仪表盘。它采用了现代化的架构设计和前端技术,旨在提供更高效、用户友好的操作界面。

Skyline 组件架构

  • Skyline Dashboard (前端)
    基于 React:采用现代前端框架 React,结合 Ant Design 组件库,提供响应式、直观的用户界面。
    功能模块化:支持身份管理、计算资源管理、网络管理、存储管理等功能模块。
    动态 API 调用:通过 Skyline API 与 OpenStack 后端服务交互。

Skyline APIServer (后端)

  • 基于 FastAPI:轻量级、高性能的 Python Web 框架,支持异步操作,提供更快的 API 响应速度。
    统一接口管理:封装 OpenStack 各服务(如 Keystone、Nova、Neutron 等)的 API,作为前端与后端服务的中间层。
    扩展性强:可通过配置和开发插件方式,支持更多 OpenStack 服务或第三方集成。
    数据库
    存储 Skyline 的元数据,如用户权限、操作日志等。
    通常使用 MySQL 作为默认数据库。

配置文件

  • skyline.yaml:定义 Skyline 的运行参数,包括数据库连接、OpenStack Keystone 地址、日志路径等。
    支持动态加载:配置更改后无需重启容器即可生效(部分情况下)

官网提供两种安装方式:docker部署相对简单一点

源码安装Skyline

官网文档

安装依赖

apt update
apt install -y git python3-pip nginx make ssl-cert
apt install -y libgtk2.0-0 libgtk-3-0 libgbm-dev libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2 libxtst6 xauth xvfb

安装 nvm(nodejs 的版本控制系统),如果拉取不到可以浏览器访问复制粘贴即可

wget -P /root/ --tries=10 --retry-connrefused --waitretry=60 --no-dns-cache --no-cache  https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh
bash /root/install.sh
. /root/.nvm/nvm.sh
root@controller:~# bash /root/install.sh
=> Downloading nvm from git to '/root/.nvm'
=> Cloning into '/root/.nvm'...
remote: Enumerating objects: 380, done.
remote: Counting objects: 100% (380/380), done.
remote: Compressing objects: 100% (323/323), done.
remote: Total 380 (delta 43), reused 178 (delta 29), pack-reused 0 (from 0)
Receiving objects: 100% (380/380), 382.75 KiB | 948.00 KiB/s, done.
Resolving deltas: 100% (43/43), done.
* (HEAD detached at FETCH_HEAD)
  master
=> Compressing and cleaning up git repository

=> Appending nvm source string to /root/.bashrc
=> Appending bash_completion source string to /root/.bashrc
=> Close and reopen your terminal to start using nvm or run the following to use it now:

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion
root@controller:~# . /root/.nvm/nvm.sh

安装 nodejs

nvm install --lts=Erbium
nvm alias default lts/erbium
nvm use default
root@controller:~# nvm install --lts=Erbium
Installing with latest version of LTS line: Erbium
Downloading and installing node v12.22.12...
Downloading https://nodejs.org/dist/v12.22.12/node-v12.22.12-linux-x64.tar.xz...
########################################################################################################################################################################################################## 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v12.22.12 (npm v6.14.16)
! WARNING: Version 'lts/Erbium' does not exist.
Creating default alias: default -> lts/Erbium (-> N/A)
root@controller:~# node -v
v12.22.12
root@controller:~# nvm current
v12.22.12
root@controller:~# nvm alias default lts/erbium
default -> lts/erbium (-> v12.22.12)
root@controller:~# nvm use default
Now using node v12.22.12 (npm v6.14.16)
root@controller:~#

安装 yarn

npm install -g yarn
root@controller:~# npm install -g yarn

> [email protected] preinstall /root/.nvm/versions/node/v12.22.12/lib/node_modules/yarn
> :; (node ./preinstall.js > /dev/null 2>&1 || true)

/root/.nvm/versions/node/v12.22.12/bin/yarn -> /root/.nvm/versions/node/v12.22.12/lib/node_modules/yarn/bin/yarn.js
/root/.nvm/versions/node/v12.22.12/bin/yarnpkg -> /root/.nvm/versions/node/v12.22.12/lib/node_modules/yarn/bin/yarn.js
+ [email protected]
added 1 package in 68.877s

配置组件

从源代码安装 Skyline Console 服务。这里拉取很慢,可直接去浏览器下载

git clone https://opendev.org/openstack/skyline-console.git
root@controller:~# git clone https://opendev.org/openstack/skyline-console.git
Cloning into 'skyline-console'...
remote: Enumerating objects: 22097, done.
remote: Counting objects: 100% (4618/4618), done.
remote: Compressing objects: 100% (636/636), done.
remote: Total 22097 (delta 4364), reused 3982 (delta 3982), pack-reused 17479
Receiving objects: 100% (22097/22097), 55.09 MiB | 109.00 KiB/s, done.
Resolving deltas: 100% (13326/13326), done.

如果遇到以下错误,则需要运行命令:sudo apt install -y ca-certificates

无法访问“https://opendev.org/openstack/skyline-sonsole.git/”:服务器证书验证失败

  • 通过网盘分享的文件:skyline-console-master.tar.gz
    链接: https://pan.baidu.com/s/10qavKsGLiQ6jOirZuS14Ew?pwd=f32s 提取码: f32s
    –来自百度网盘超级会员v4的分享

上传后解压使用

tar -xf skyline-console-master.tar.gz

安装 skyline-console

cd skyline-console
npx browserslist@latest --update-db
apt install python3.12-venv -y
python3 -m venv /root/myenv
source /root/myenv/bin/activate
pip install wheel
pip install build
python -m build
pip install --upgrade setuptools==69.2.0
pip3 install --force-reinstall dist/skyline_console-*.whl
root@controller:~/skyline-console# npx browserslist@latest --update-db
npx: installed 7 in 28.976s
The --update-db command is deprecated.
Please use npx update-browserslist-db@latest instead.
Browserslist DB update will still be made.
Latest version:     1.0.30001692
Installed versions: 1.0.30001228, 1.0.30001300
Removing old caniuse-lite from lock file
Installing new caniuse-lite version
$ yarn add -W caniuse-lite
warning "antd > [email protected]" has unmet peer dependency "dayjs@^1.8.30".
warning " > [email protected]" has unmet peer dependency "eslint-plugin-react-hooks@^4 || ^3 || ^2.3.0 || ^1.7.0".
warning " > [email protected]" has unmet peer dependency "mocha@>=7".
Cleaning package.json dependencies from caniuse-lite
$ yarn remove -W caniuse-lite
warning "antd > [email protected]" has unmet peer dependency "dayjs@^1.8.30".
warning " > [email protected]" has unmet peer dependency "eslint-plugin-react-hooks@^4 || ^3 || ^2.3.0 || ^1.7.0".
warning " > [email protected]" has unmet peer dependency "mocha@>=7".
caniuse-lite has been successfully updated

No target browser changes
make package
(myenv) root@controller:~/skyline-console# make package
------------------
adding 'skyline_console-5.1.0.dev6.dist-info/pbr.json'
adding 'skyline_console-5.1.0.dev6.dist-info/top_level.txt'
adding 'skyline_console-5.1.0.dev6.dist-info/RECORD'
removing build/bdist.linux-x86_64/wheel
Successfully built skyline_console-5.1.0.dev6.tar.gz and skyline_console-5.1.0.dev6-py3-none-any.whl

创建 skyline 文件夹

mkdir -p /etc/skyline /var/log/skyline

生成nginx配置文件

skyline-nginx-generator -o /etc/nginx/nginx.conf
sudo sed -i "s/server .* fail_timeout=0;/server 0.0.0.0:28000 fail_timeout=0;/g" /etc/nginx/nginx.conf

启动 nginx 服务:完成安装

systemctl start nginx.service
systemctl enable nginx.service

Docker安装Skyline

官网文档

配置数据库和Openstack

密码默认设置为000000,可自行替换

mysql -uroot -p000000

创建skyline数据库:

CREATE DATABASE skyline DEFAULT CHARACTER SET \
  utf8 DEFAULT COLLATE utf8_general_ci;

授予数据库适当的访问权限skyline:

GRANT ALL PRIVILEGES ON skyline.* TO 'skyline'@'localhost' \
  IDENTIFIED BY '000000';
GRANT ALL PRIVILEGES ON skyline.* TO 'skyline'@'%' \
  IDENTIFIED BY '000000';

Openstack创建skyline用户:

source /etc/keystone/admin-openrc.sh
openstack user create --domain default --password 000000 skyline

admin给用户添加角色skyline:

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

配置Docker

使用阿里源安装docker服务

apt -y install apt-transport-https ca-certificates curl software-properties-common

curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

apt-get -y install docker-ce
systemctl enable --now docker

从Docker Hub 拉取 Skyline镜像

  • 镜像可能由于网络原因拉取不了,需要配置daemon.json文件
vi /etc/docker/daemon.json
{
    
    
  "registry-mirrors": ["https://registry-mirrors.yunyuan.co"],
  "insecure-registries" : ["0.0.0.0/0"]
}

重启服务

systemctl daemon-reload
systemctl restart docker

拉取该镜像

root@controller:~# docker pull 99cloud/skyline:latest
latest: Pulling from 99cloud/skyline
d9802f032d67: Pull complete
612192bc5a0d: Pull complete
51cf5fe1c329: Pull complete
4f9f7b7874cb: Pull complete
f4fc7b57ec0d: Pull complete
3288df62e646: Pull complete
bcadda1d8554: Pull complete
13c60e5c17b6: Pull complete
d4bcf4d4a42f: Pull complete
a08f6ce1814e: Pull complete
3ac084517a76: Pull complete
Digest: sha256:44e28a612d3e950a8a270aa502fc443a08a67c3a2b457f99fe7197f7bad6be10
Status: Downloaded newer image for 99cloud/skyline:latest
docker.io/99cloud/skyline:latest
  • 如果还是获取不了可网盘下载:
    通过网盘分享的文件:skyline_latest250114.tar
    链接: https://pan.baidu.com/s/1h8icRMZYAMvyL0fuNxfMWA?pwd=yfr4 提取码: yfr4
    –来自百度网盘超级会员v4的分享

创建 skyline 所需的一些文件夹

mkdir -p /etc/skyline /var/log/skyline /var/lib/skyline /var/log/nginx

配置/etc/skyline/skyline.yaml文件

vi /etc/skyline/skyline.yaml
  • 注意替换数据库和keystone的相关连接信息
default:
  database_url: mysql://skyline:[email protected]:3306/skyline
  debug: true
  log_dir: /var/log
openstack:
  keystone_url: http://192.168.200.160:5000/v3/
  system_user_password: "000000"

运行skeylin初始化引导

docker run -d --name skyline_bootstrap \
  -e KOLLA_BOOTSTRAP="" \
  -v /etc/skyline/skyline.yaml:/etc/skyline/skyline.yaml \
  -v /var/log:/var/log \
  --net=host 99cloud/skyline:latest
root@controller:~# docker run -d --name skyline_bootstrap \
  -e KOLLA_BOOTSTRAP="" \
  -v /etc/skyline/skyline.yaml:/etc/skyline/skyline.yaml \
  -v /var/log:/var/log \
  --net=host 99cloud/skyline:latest
b36328ec8e4cb4c80e62a76bc10484651de2425a52db248cab9ccbeeb1598db7

查看容器内部日志

root@controller:~# docker logs b36328ec8e4c
make: *** [Makefile:119: db_sync]
+ echo '/usr/local/bin/gunicorn -c /etc/skyline/gunicorn.py skyline_apiserver.main:app'
+ mapfile -t CMD
++ tail /run_command
++ xargs -n 1
+ [[ -n 0 ]]
+ cd /opt/skyline_apiserver/
+ make db_sync
alembic -c skyline_apiserver/db/alembic/alembic.ini upgrade head
2025-01-14 07:36:22.094 | INFO     | alembic.runtime.migration:__init__:215 - Context impl MySQLImpl.
2025-01-14 07:36:22.095 | INFO     | alembic.runtime.migration:__init__:218 - Will assume non-transactional DDL.
2025-01-14 07:36:22.115 | INFO     | alembic.runtime.migration:run_migrations:623 - Running upgrade  -> 000, init
+ exit 0

查看到数据库内已经完成初始化

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| glance             |
| information_schema |
| keystone           |
| mysql              |
| neutron            |
| nova               |
| nova_api           |
| nova_cell0         |
| performance_schema |
| placement          |
| skyline            |
| sys                |
+--------------------+
12 rows in set (0.004 sec)

MariaDB [(none)]> use skyline;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [skyline]> show tables;
+-------------------+
| Tables_in_skyline |
+-------------------+
| alembic_version   |
| revoked_token     |
| settings          |
+-------------------+
3 rows in set (0.001 sec)

MariaDB [skyline]>

清理容器

root@controller:~# docker ps -a
CONTAINER ID   IMAGE                    COMMAND              CREATED         STATUS                     PORTS     NAMES
b36328ec8e4c   99cloud/skyline:latest   "start_service.sh"   6 minutes ago   Exited (0) 5 minutes ago             skyline_bootstrap
root@controller:~# docker rm b36328ec8e4c
b36328ec8e4c

运行skeyline容器

docker run -d --name skyline --restart=always \
  -v /etc/skyline/skyline.yaml:/etc/skyline/skyline.yaml \
  -v /var/log:/var/log \
  --net=host 99cloud/skyline:latest
root@controller:~# docker run -d --name skyline --restart=always \
  -v /etc/skyline/skyline.yaml:/etc/skyline/skyline.yaml \
  -v /var/log:/var/log \
  --net=host 99cloud/skyline:latest
06f4686fc252890b81625d253449f26ccda5afe0238e9ca40500bc35f7c0998e
root@controller:~# docker ps
CONTAINER ID   IMAGE                    COMMAND              CREATED         STATUS         PORTS     NAMES
06f4686fc252   99cloud/skyline:latest   "start_service.sh"   3 seconds ago   Up 2 seconds             skyline

查看日志

root@controller:~# docker logs 06f4686fc252
+ echo '/usr/local/bin/gunicorn -c /etc/skyline/gunicorn.py skyline_apiserver.main:app'
+ mapfile -t CMD
++ tail /run_command
++ xargs -n 1
+ [[ -n '' ]]
+ GENERATOR_ARGS='--output-file /etc/nginx/nginx.conf'
+ [[ -n '' ]]
+ [[ -n '' ]]
+ skyline-nginx-generator --output-file /etc/nginx/nginx.conf
2025-01-14 07:42:35.556 | DEBUG    | keystoneauth1.identity.v3.base:get_auth_ref:184 - Making authentication request to http://192.168.200.160:5000/v3/auth/tokens
2025-01-14 07:42:35.559 | DEBUG    | urllib3.connectionpool:_new_conn:246 - Starting new HTTP connection (1): 192.168.200.160:5000
2025-01-14 07:42:35.887 | DEBUG    | urllib3.connectionpool:_make_request:474 - http://192.168.200.160:5000 "POST /v3/auth/tokens HTTP/1.1" 201 3480
2025-01-14 07:42:35.888 | DEBUG    | keystoneauth1.identity.v3.base:get_auth_ref:189 - {
    
    "token": {
    
    "methods": ["password"], "user": {
    
    "domain": {
    
    "id": "default", "name": "Default"}, "id": "aa32c9e8bf1043688941d3806b5d377b", "name": "skyline", "password_expires_at": null}, "audit_ids": ["ttBVUzkTQiCw4M08xhPEaw"], "expires_at": "2025-01-14T08:42:35.000000Z", "issued_at": "2025-01-14T07:42:35.000000Z", "project": {
    
    "domain": {
    
    "id": "default", "name": "Default"}, "id": "6a166bba90684340a0cd323f7050caa0", "name": "service"}, "is_domain": false, "roles": [{
    
    "id": "8b70169a0e534455902ed185b6791059", "name": "admin"}, {
    
    "id": "3e15391b2c87436a82de12fbb7982681", "name": "reader"}, {
    
    "id": "749691b26ec14b07a54e675ff7ec6184", "name": "manager"}, {
    
    "id": "e6ff70a44a774213a729322e0530399b", "name": "member"}], "catalog": [{
    
    "endpoints": [{
    
    "id": "9e47b0e39b8a4486adef88b7cfadaa01", "interface": "admin", "region_id": "RegionOne", "url": "http://controller:9292", "region": "RegionOne"}, {
    
    "id": "b933e8156bfa4c82895a324f1f59a154", "interface": "internal", "region_id": "RegionOne", "url": "http://controller:9292", "region": "RegionOne"}, {
    
    "id": "e17d5863691342d7a93110222635ff5b", "interface": "public", "region_id": "RegionOne", "url": "http://controller:9292", "region": "RegionOne"}], "id": "2ac37e786fb441fc8abb9a3d91e58d87", "type": "image", "name": "glance"}, {
    
    "endpoints": [{
    
    "id": "a4b523fd7d8743ed8000580e189122af", "interface": "public", "region_id": "RegionOne", "url": "http://controller:9696", "region": "RegionOne"}, {
    
    "id": "b55a96421d67413796f8b24349ada43f", "interface": "admin", "region_id": "RegionOne", "url": "http://controller:9696", "region": "RegionOne"}, {
    
    "id": "dce16eb156af4f8697be947955aa333a", "interface": "internal", "region_id": "RegionOne", "url": "http://controller:9696", "region": "RegionOne"}], "id": "7a001f483a564163aa587b8e081754bb", "type": "network", "name": "neutron"}, {
    
    "endpoints": [{
    
    "id": "38bd876005574b73b3c407f839834bb0", "interface": "public", "region_id": "RegionOne", "url": "http://controller:8774/v2.1", "region": "RegionOne"}, {
    
    "id": "4e7c06c7bb434c91996950d71bbec21a", "interface": "admin", "region_id": "RegionOne", "url": "http://controller:8774/v2.1", "region": "RegionOne"}, {
    
    "id": "f3e70523608546a8b48b5112451b1778", "interface": "internal", "region_id": "RegionOne", "url": "http://controller:8774/v2.1", "region": "RegionOne"}], "id": "9d183fc925f34ae8b01ad364db5336fe", "type": "compute", "name": "nova"}, {
    
    "endpoints": [{
    
    "id": "40ad8b8058ca49a990906e8f9c4b305b", "interface": "admin", "region_id": "RegionOne", "url": "http://controller:8778", "region": "RegionOne"}, {
    
    "id": "73fda3f889d841c292f8b4b92d991a13", "interface": "internal", "region_id": "RegionOne", "url": "http://controller:8778", "region": "RegionOne"}, {
    
    "id": "a478dc96e015440eaaa3c9195ba3cb04", "interface": "public", "region_id": "RegionOne", "url": "http://controller:8778", "region": "RegionOne"}], "id": "d6d99425a17a405b83be315d40072af3", "type": "placement", "name": "placement"}, {
    
    "endpoints": [{
    
    "id": "33501b74440542188ba76c20b4cbf00e", "interface": "public", "region_id": "RegionOne", "url": "http://controller:5000/v3/", "region": "RegionOne"}, {
    
    "id": "38b0c4b88aac4e6ba4518fd8ce4204b7", "interface": "admin", "region_id": "RegionOne", "url": "http://controller:5000/v3/", "region": "RegionOne"}, {
    
    "id": "63391670a8324515ac1d521b97595c7b", "interface": "internal", "region_id": "RegionOne", "url": "http://controller:5000/v3/", "region": "RegionOne"}], "id": "f0b99290603a4e1883e3d9ae8ccba648", "type": "identity", "name": "keystone"}]}}
2025-01-14 07:42:35.889 | DEBUG    | keystoneauth1.session:_http_log_request:517 - REQ: curl -g -i --cacert "" -X GET http://192.168.200.160:5000/v3/ -H "Accept: application/json" -H "User-Agent: skyline-nginx-generator keystoneauth1/5.8.0 python-requests/2.32.3 CPython/3.8.10" -H "X-Auth-Token: {SHA256}b87b229ef57655f2b0df1ca05bae902aa3f1ede2793e8e3eaf9d48b2acb6c174"
2025-01-14 07:42:36.060 | DEBUG    | urllib3.connectionpool:_make_request:474 - http://192.168.200.160:5000 "GET /v3/ HTTP/1.1" 200 255
2025-01-14 07:42:36.061 | DEBUG    | keystoneauth1.session:_http_log_response:548 - RESP: [200] Connection: Keep-Alive Content-Length: 255 Content-Type: application/json Date: Tue, 14 Jan 2025 07:42:35 GMT Keep-Alive: timeout=5, max=99 Server: Apache/2.4.58 (Ubuntu) Vary: X-Auth-Token x-openstack-request-id: req-70778aa9-1833-432c-a7d5-0fdfaa182505
2025-01-14 07:42:36.061 | DEBUG    | keystoneauth1.session:_http_log_response:580 - RESP BODY: {
    
    "version": {
    
    "id": "v3.14", "status": "stable", "updated": "2020-04-07T00:00:00Z", "links": [{
    
    "rel": "self", "href": "http://192.168.200.160:5000/v3/"}], "media-types": [{
    
    "base": "application/json", "type": "application/vnd.openstack.identity-v3+json"}]}}
2025-01-14 07:42:36.061 | DEBUG    | keystoneauth1.session:request:963 - GET call to http://192.168.200.160:5000/v3/ used request id req-70778aa9-1833-432c-a7d5-0fdfaa182505
2025-01-14 07:42:36.063 | DEBUG    | keystoneauth1.session:_http_log_request:517 - REQ: curl -g -i --cacert "" -X GET http://controller:5000/v3/endpoints?interface=public -H "Accept: application/json" -H "User-Agent: python-keystoneclient" -H "X-Auth-Token: {SHA256}b87b229ef57655f2b0df1ca05bae902aa3f1ede2793e8e3eaf9d48b2acb6c174"
2025-01-14 07:42:36.064 | DEBUG    | urllib3.connectionpool:_new_conn:246 - Starting new HTTP connection (1): controller:5000
2025-01-14 07:42:36.228 | DEBUG    | urllib3.connectionpool:_make_request:474 - http://controller:5000 "GET /v3/endpoints?interface=public HTTP/1.1" 200 1667
2025-01-14 07:42:36.229 | DEBUG    | keystoneauth1.session:_http_log_response:548 - RESP: [200] Connection: Keep-Alive Content-Length: 1667 Content-Type: application/json Date: Tue, 14 Jan 2025 07:42:36 GMT Keep-Alive: timeout=5, max=100 Server: Apache/2.4.58 (Ubuntu) Vary: X-Auth-Token x-openstack-request-id: req-e9016348-f230-4473-9345-1c547bd57de6
2025-01-14 07:42:36.229 | DEBUG    | keystoneauth1.session:_http_log_response:580 - RESP BODY: {
    
    "endpoints": [{
    
    "id": "33501b74440542188ba76c20b4cbf00e", "interface": "public", "region_id": "RegionOne", "service_id": "f0b99290603a4e1883e3d9ae8ccba648", "url": "http://controller:5000/v3/", "enabled": true, "region": "RegionOne", "links": {
    
    "self": "http://controller:5000/v3/endpoints/33501b74440542188ba76c20b4cbf00e"}}, {
    
    "id": "38bd876005574b73b3c407f839834bb0", "interface": "public", "region_id": "RegionOne", "service_id": "9d183fc925f34ae8b01ad364db5336fe", "url": "http://controller:8774/v2.1", "enabled": true, "region": "RegionOne", "links": {
    
    "self": "http://controller:5000/v3/endpoints/38bd876005574b73b3c407f839834bb0"}}, {
    
    "id": "a478dc96e015440eaaa3c9195ba3cb04", "interface": "public", "region_id": "RegionOne", "service_id": "d6d99425a17a405b83be315d40072af3", "url": "http://controller:8778", "enabled": true, "region": "RegionOne", "links": {
    
    "self": "http://controller:5000/v3/endpoints/a478dc96e015440eaaa3c9195ba3cb04"}}, {
    
    "id": "a4b523fd7d8743ed8000580e189122af", "interface": "public", "region_id": "RegionOne", "service_id": "7a001f483a564163aa587b8e081754bb", "url": "http://controller:9696", "enabled": true, "region": "RegionOne", "links": {
    
    "self": "http://controller:5000/v3/endpoints/a4b523fd7d8743ed8000580e189122af"}}, {
    
    "id": "e17d5863691342d7a93110222635ff5b", "interface": "public", "region_id": "RegionOne", "service_id": "2ac37e786fb441fc8abb9a3d91e58d87", "url": "http://controller:9292", "enabled": true, "region": "RegionOne", "links": {
    
    "self": "http://controller:5000/v3/endpoints/e17d5863691342d7a93110222635ff5b"}}], "links": {
    
    "next": null, "self": "http://controller:5000/v3/endpoints?interface=public", "previous": null}}

2025-01-14 07:42:36.230 | DEBUG    | keystoneauth1.session:request:953 - GET call to identity for http://controller:5000/v3/endpoints?interface=public used request id req-e9016348-f230-4473-9345-1c547bd57de6
2025-01-14 07:42:36.231 | DEBUG    | keystoneauth1.session:_http_log_request:517 - REQ: curl -g -i --cacert "" -X GET http://controller:5000/v3/services? -H "Accept: application/json" -H "User-Agent: python-keystoneclient" -H "X-Auth-Token: {SHA256}b87b229ef57655f2b0df1ca05bae902aa3f1ede2793e8e3eaf9d48b2acb6c174"
2025-01-14 07:42:36.388 | DEBUG    | urllib3.connectionpool:_make_request:474 - http://controller:5000 "GET /v3/services HTTP/1.1" 200 1190
2025-01-14 07:42:36.389 | DEBUG    | keystoneauth1.session:_http_log_response:548 - RESP: [200] Connection: Keep-Alive Content-Length: 1190 Content-Type: application/json Date: Tue, 14 Jan 2025 07:42:36 GMT Keep-Alive: timeout=5, max=99 Server: Apache/2.4.58 (Ubuntu) Vary: X-Auth-Token x-openstack-request-id: req-4dd6cfd9-d49f-4815-992d-34d8c39ac25a
2025-01-14 07:42:36.389 | DEBUG    | keystoneauth1.session:_http_log_response:580 - RESP BODY: {
    
    "services": [{
    
    "name": "glance", "description": "OpenStack Image", "id": "2ac37e786fb441fc8abb9a3d91e58d87", "type": "image", "enabled": true, "links": {
    
    "self": "http://controller:5000/v3/services/2ac37e786fb441fc8abb9a3d91e58d87"}}, {
    
    "name": "neutron", "description": "OpenStack Networking", "id": "7a001f483a564163aa587b8e081754bb", "type": "network", "enabled": true, "links": {
    
    "self": "http://controller:5000/v3/services/7a001f483a564163aa587b8e081754bb"}}, {
    
    "name": "nova", "description": "OpenStack Compute", "id": "9d183fc925f34ae8b01ad364db5336fe", "type": "compute", "enabled": true, "links": {
    
    "self": "http://controller:5000/v3/services/9d183fc925f34ae8b01ad364db5336fe"}}, {
    
    "name": "placement", "description": "Placement API", "id": "d6d99425a17a405b83be315d40072af3", "type": "placement", "enabled": true, "links": {
    
    "self": "http://controller:5000/v3/services/d6d99425a17a405b83be315d40072af3"}}, {
    
    "name": "keystone", "id": "f0b99290603a4e1883e3d9ae8ccba648", "type": "identity", "enabled": true, "links": {
    
    "self": "http://controller:5000/v3/services/f0b99290603a4e1883e3d9ae8ccba648"}}], "links": {
    
    "next": null, "self": "http://controller:5000/v3/services", "previous": null}}

2025-01-14 07:42:36.389 | DEBUG    | keystoneauth1.session:request:953 - GET call to identity for http://controller:5000/v3/services used request id req-4dd6cfd9-d49f-4815-992d-34d8c39ac25a
+ nginx
+ echo 'Running command: /usr/local/bin/gunicorn -c /etc/skyline/gunicorn.py skyline_apiserver.main:app'
+ exec /usr/local/bin/gunicorn -c /etc/skyline/gunicorn.py skyline_apiserver.main:app
Running command: /usr/local/bin/gunicorn -c /etc/skyline/gunicorn.py skyline_apiserver.main:app
[2025-01-14 07:42:37 +0000].758 24 DEBUG [-] Using selector: EpollSelector
[2025-01-14 07:42:37 +0000].772 23 DEBUG [-] Using selector: EpollSelector

skyline 镜像包含了 skyline-apiserver 和 skyline-console,可以访问 skyline UI: localhost:9999

在这里插入图片描述

输入管理员用户admin和密码登录,并右上角设置语言为中文

在这里插入图片描述

在这里插入图片描述

创建云主机实例测试

在这里插入图片描述