2022 年 3 月,在麒麟軟體和 openEuler 社群的共同努力下,同時支援 x86_64 和 aarch64 架構的雲底座作業系統 NestOS 首個正式版釋出。NestOS 如何使用?與我們熟知的通用 OS 有哪些異同?本文将以容器化部署 OpenStack 場景作為實際應用案例,嘗試為大家回答上述問題。
整體方案
在本方案中,我們以 Libvirt 建立 NestOS 虛拟化執行個體的方式組建叢集,通過 Kolla-ansible 部署工具完成 OpenStack 容器化部署。任何可正常運作 Kolla-ansible 的主機均可作為部署節點,不建議采用 NestOS 作為部署節點。例如本方案中部署節點為 openEuler 21.09,而 NestOS 則作為 OpenStack 叢集的實際運作環境,擔當控制、計算、存儲等節點。為簡化行文描述,後文以單個 NestOS 執行個體配置進行介紹,實際使用可根據需求添加任意數量 NestOS 執行個體。
如您是首次了解 NestOS,可首先在 openEuler 22.03 官方文檔中查閱 NestOS 相關使用者指南
「部署環境:」
- 部署節點 OS:openEuler 21.09
- NestOS 版本:nestos-22.03.20220329-qemu.x86_64.qcow2
- OpenStack 版本:Wallaby
- Kollla-ansible 版本:12.0.0
「提醒:」
- CPU、記憶體以及硬碟容量應盡可能大,推薦配置為 4C、8G 和 40G, 若采用本地存儲方案(如 LVM)可添加第二塊硬碟。
- 建議使用兩塊網卡,其中網卡 1 用于 ssh 連接配接和通路外網;網卡 2 用于 Neutron 外部(或公共)網絡,可以是 vlan 或 flat,取決于網絡的建立方式。此網卡應該在沒有 IP 位址的情況下處于活動狀态。否則,執行個體将無法通路外部網絡。
NestOS 執行個體建立與配置
準備 Ignition 點火檔案
結合容器化部署 OpenStack 特定場景環境配置需求,我們首先需要準備一份供 NestOS 部署使用的 Ignition 點火配置,主要内容分為作業系統基礎配置與 OpenStack 部署環境初始化兩部分,具體包括:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLi0zaHRGcWdUYuVzVa9GczoVdG1mWfVGc5RHLwIzX39GZhh2csATMflHLwEzX4xSZz91ZsAzMfRHLGZkRGZkRfJ3bs92YskmNhVTYykVNQJVMRhXVEF1X0hXZ0xCNx8VZ6l2cssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLjJTY3MWZ1UzMycDOygTNxMjNxgzMzY2NyYzY0IDM5MjZ2QTOzQzLclDMyIDMy8CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
ignition 檔案被設計為可讀但難以編寫的形式(本質為 json 格式),我們可以先編寫對人友好的 bu 檔案(本質為 yaml 格式),然後通過 Butane 工具将其轉化為 ignition 檔案。
系統配置 passwd 時,如計劃使用密碼驗證的方式通路 NestOS 執行個體,可以使用下述指令生成
${PASSWORD_HASH}
供 bu 檔案使用。
openssl passwd -1 -salt yoursalt
我們按照上述表格中的資訊将部署 OpenStack 所需的相關配置添加到 bu 檔案中,示例如下。如需擷取該檔案,可通路 NestOS 項目倉庫(https://gitee.com/openeuler/NestOS)docs / use_sample / OpenStack / 路徑下擷取。
注意:本檔案配置示例中,形如
${VALUE}
字段均需根據實際部署情況自行配置。
# Valid options are ['centos', 'debian', 'rhel', 'ubuntu']
kolla_base_distro: "centos"
# Valid options are [ binary, source ]
kolla_install_type: "binary"
openstack_release: "wallaby"
kolla_internal_vip_address: "{kolla_internal_vip_address}"
network_interface: "ens2"
api_interface: "{{ network_interface }}"
storage_interface: "{{ network_interface }}"
tunnel_interface: "{{ network_interface }}"
neutron_external_interface: "ens3"
neutron_plugin_agent: "openvswitch"
keepalived_virtual_router_id: "51"
openstack_logging_debug: "True"
enable_glance: "yes"
enable_haproxy: "yes"
enable_keepalived: "{{ enable_haproxy | bool }}"
enable_keystone: "yes"
enable_mariadb: "yes"
enable_memcached: "yes"
enable_neutron: "{{ enable_openstack_core | bool }}"
enable_nova: "{{ enable_openstack_core | bool }}"
enable_rabbitmq: "{{ 'yes' if om_rpc_transport == 'rabbit' or om_notify_transport == 'rabbit' else 'no' }}"
enable_chrony: "yes"
enable_cinder: "yes"
enable_cinder_backup: "yes"
enable_cinder_backend_lvm: "yes"
enable_cloudkitty: "no"
enable_gnocchi: "no"
enable_heat: "{{ enable_openstack_core | bool }}"
enable_horizon: "yes"
enable_horizon: "{{ enable_openstack_core | bool }}"
enable_horizon_blazar: "{{ enable_blazar | bool }}"
enable_horizon_cloudkitty: "{{ enable_cloudkitty | bool }}"
enable_horizon_murano: "{{ enable_murano | bool }}"
enable_horizon_neutron_lbaas: "{{ enable_neutron_lbaas | bool }}"
enable_horizon_sahara: "{{ enable_sahara | bool }}"
enable_horizon_senlin: "{{ enable_senlin | bool }}"
enable_horizon_watcher: "{{ enable_watcher | bool }}"
enable_ironic: "no"
enable_ironic_ipxe: "no"
enable_ironic_neutron_agent: "no"
enable_kafka: "no"
enable_murano: "no"
enable_neutron_lbaas: "yes"
enable_neutron_sriov: "yes"
enable_neutron_qos: "yes"
enable_nova_ssh: "yes"
enable_openvswitch: "{{ enable_neutron | bool and neutron_plugin_agent != 'linuxbridge' }}"
enable_placement: "{{ enable_nova | bool or enable_zun | bool }}"
enable_sahara: "no"
enable_senlin: "no"
enable_swift: "no"
enable_tempest: "no"
enable_watcher: "no"
keystone_token_provider: 'fernet'
keystone_admin_user: "admin"
keystone_admin_project: "admin"
fernet_token_expiry: 86400
glance_backend_file: "yes"
glance_enable_rolling_upgrade: "no"
cinder_volume_group: "cinder-volumes"
cinder_backup_driver: "lvm"
cinder_backup_share: "lvm"
cinder_backup_mount_options_nfs: "lvm"
nova_compute_virt_type: "qemu"
nova_safety_upgrade: "no"
horizon_backend_database: "{{ enable_murano | bool }}"
針對某些相對複雜的初始化配置需求,可以将其編寫為 systemd 托管的 service 服務,如核心參數配置通過寫入檔案配置方式傳入參數,再通過 systemd 服務進行應用:
systemd:
units:
## 核心參數配置
- name: set-kernel-para-for-openstack.service
enabled: true
contents: |
[Unit]
Description= for openstack
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=modprobe br_netfilter
ExecStart=sysctl -p
[Install]
WantedBy=multi-user.target
配置編寫完畢後,可通過如下指令将 bu 檔案通過 Butane 工具轉換為 ignition 點火檔案:
docker run --interactive --rm quay.io/coreos/butane:latest --pretty --strict < nestos.bu > nestos.ign
除本地使用外,也可将生成的 ignition 點火檔案以 http 服務等形式供 NestOS 執行個體部署時遠端通路,實作集中式批量部署配置。
Libvirt 建立 NestOS 執行個體
準備好 ignition 檔案後,使用 virt-install 建立 NestOS 虛拟化執行個體,建立指令參考如下,其中 vcpus、ram 和 disk 參數均為最低要求,如有額外需求,可參考 virt-install 手冊自行調整,${IGNITION_FILE_PATH}為 ignition 檔案路徑,可以為本地路徑或遠端 URL。
** 注意:** 形如
${VALUE}
字段均需根據實際部署情況自行配置。
virt-install --name=${NAME} --vcpus=4 --ram=8192 --import --network=bridge=virbr0 --graphics=none --qemu-commandline="-fw_cfg name=opt/com.coreos/config,file=${IGNITION_FILE_PATH}" --disk=size=40,backing_store=${NESTOS_RELEASE_QCOW2_PATH} --network=bridge=virbr1 --disk=size=40
以上就是 Libvirt 建立 NestOS 虛拟化執行個體的基本流程,可根據需要建立任意數量的 NestOS 執行個體,也可使用 PXE 方式引導部署在裸金屬伺服器。
OpenStack 配置與部署
基于 NestOS 容器化部署 OpenStack 采用了主流的 Kolla-ansible 方案,按上文步驟建立的 NestOS 執行個體已具備 kolla-ansible 部署所需各項條件,在部署過程中無需任何操作。本章節所涉及的指令操作均在部署節點上執行。
1. 配置基礎環境
添加 OpenStack 源
在 openEuler 發行版中已提供 openstack 适配,如部署節點采用 openEuler,安裝 OpenStack 相關軟體包前均需安裝 OpenStack 源。
yum install openstack-release-wallaby
安裝 Kolla 和 Kolla-ansible
yum install openstack-kolla openstack-kolla-ansible
2. 配置 Ansible
将以下選項添加到 Ansible 檔案配置
etc/ansible/ansible.cfg
:
[defaults]
host_key_checking=False
pipelining=True
forks=100
配置 Kolla Ansible
Inventory
Inventory 是一個 Ansible 檔案,可以在其中指定主機及其所屬的組,使用它來定義節點角色和通路憑證。
Kolla Ansible 附帶了 all-in-one 和 multinode 示例清單檔案。它們之間的差別在于,前者是部署單節點 OpenStack,後者則是使用多個節點。本文将使用 multinode 方式部署。
- 在 multinode 檔案中編輯環境的節點資訊,例如:
[control]
nestos ansible_ssh_user=${USERNAME} ansible_ssh_password=${USERPASSWARD} ansible_become=true
[network]
nestos
[compute]
nestos ansible_ssh_user=${USERNAME} ansible_ssh_password=${USERPASSWARD} ansible_become=true
[monitoring]
nestos
[storage]
nestos
[deployment]
localhost ansible_connection=local become=true
- 檢查配置是否正确,運作:
ansible -i ./multinode all -m ping
Kolla 密碼
在部署過程中使用的密碼存儲在/etc/kolla/passwords.yml 檔案中。初始情況下,該檔案中的所有密碼都是空白的,必須手動填充或通過運作随機密碼生成器來填充:
kolla-genpwd
SourceURL:file:///home/lijian/文檔/公衆号文檔_NestOS 應用:容器化部署 OpenStack/20220704_NestOS 應用案例:容器化部署 OpenStack.docx
Kolla globals.yml
globals.yml 是 Kolla Ansible 的主要配置。由于目前 OpenStack 官方容器鏡像還未正式支援 openEuler 系統,是以在部署時将選用 CentOS 容器鏡像。
- 鏡像選擇
# Valid options are ['centos', 'debian', 'rhel', 'ubuntu']
kolla_base_distro: "centos"
# Valid options are [ binary, source ]
kolla_install_type: "binary"
# Do not override this unless you know what you are doing.
openstack_release: "wallaby"
-
網絡
Kolla Ansible 需要設定一些網絡選項。
network_interface: "eth0"
neutron_external_interface: "eth1"
kolla_internal_vip_address: "10.1.0.250"
-
啟用其他服務
預設情況下,Kolla Ansible 提供了大量的附加服務,可根據需求啟用服務。例如,啟用 cinder 服務:
enable_cinder: "yes"
4. 部署 OpenStack
Kolla Ansible 提供了一個 playbook,能夠以指定的版本安裝所有必需的服務。
下面為使用 multinode 配置的情況,如使用 all-in-one,需進行替換。也可添加-vvv 參數,檢視詳細執行日志。
1. 引導服務
kolla-ansible -i ./multinode bootstrap-servers
2. 環境檢查
kolla-ansible -i ./multinode prechecks
3. 拉取鏡像
kolla-ansible -i ./multinode pull
4. 執行部署
kolla-ansible -i ./multinode deploy
如部署失敗,可執行銷毀指令:
kolla-ansible destroy -i ./multinode --yes-i-really-really-mean-it
5. 使用 OpenStack
- 安裝 OpenStack CLI 用戶端
yum install python3-openstackclient
- OpenStack 需要一個 openrc 檔案,其中設定了管理者使用者的憑證。生成該檔案:
kolla-ansible post-deploy
. /etc/kolla/admin-openrc.sh
- 根據安裝 Kolla Ansible 的方式,執行下述腳本建立示例網絡,鏡像等。
kolla-ansible/tools/init-runonce
- 通過 ip 位址與 admin-openrc.sh 中提供的 horizon 賬号密碼進行登入:
登入成功後可看到 OpenStack 的 web 界面:
更多詳細資訊可查閱 OpenStack 官方部署文檔。
總結
NestOS 作為一款在 openEuler 社群 CloudNative Sig 組孵化的雲底座作業系統,從以上部署 OpenStack 的流程可以看出,它專為運作容器化工作負載而設計,意在成為計算叢集的安全可靠主機。在第一次啟動期間,NestOS 使用 ignition 點火檔案配置系統,無論是在雲端、虛拟化還是裸金屬,NestOS 始終都從同一個地方開始,我們還可将 ignition 儲存于伺服器中,供 NestOS 遠端通路,實作集中式的配置管理,這為大規模部署叢集提供了便利。
NestOS 旨在作為不可變基礎架構進行管理,當機器建立完成後,如想要更新配置不應通過修改/etc 或其他方式進行更改,而應使用新的 ignition 點火檔案配置替換機器。這與我們管理容器的方式類似,容器鏡像不會就地更新,而是從頭開始重新建構并重新部署。這種方法可以在負載增加時輕松擴充,隻需使用相同的 ignition 配置即可啟動其他計算機。
NestOS 将配置工具 ignition 與 rpm-ostree、OCI 支援、Selinux 強化等技術內建在一起,采用基于雙系統分區、容器技術和叢集架構的設計思路,搭載 iSulad、docker、podman 等主流容器基礎平台,克服了由于使用者修改系統内容、使用者服務對系統元件依賴,以及系統軟體包更新時不穩定中間态等種種導緻更新過程不可靠的因素,最終以一種輕量級、定制化的作業系統呈現出來,可以适應各種不同的基礎設施環境。