2022 年 3 月,在麒麟軟件和 openEuler 社區(qū)的共同努力下,同時支持 x86_64 和 aarch64 架構的云底座操作系統 NestOS 首個正式版發(fā)布。NestOS 如何使用?與我們熟知的通用 OS 有哪些異同?本文將以容器化部署 OpenStack 場景作為實際應用案例,嘗試為大家回答上述問題。
整體方案
在本方案中,我們以 Libvirt 創(chuàng)建 NestOS 虛擬化實例的方式組建集群,通過 Kolla-ansible 部署工具完成 OpenStack 容器化部署。任何可正常運行 Kolla-ansible 的主機均可作為部署節(jié)點,不建議采用 NestOS 作為部署節(jié)點。例如本方案中部署節(jié)點為 openEuler 21.09,而 NestOS 則作為 OpenStack 集群的實際運行環(huán)境,擔當控制、計算、存儲等節(jié)點。為簡化行文描述,后文以單個 NestOS 實例配置進行介紹,實際使用可根據需求添加任意數量 NestOS 實例。
如您是首次了解 NestOS,可首先在 openEuler 22.03 官方文檔中查閱 NestOS 相關用戶指南(https://docs.openeuler.org/zh/docs/22.03_LTS/docs/NestOS/overview.html)
「部署環(huán)境:」
- 部署節(jié)點 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,取決于網絡的創(chuàng)建方式。此網卡應該在沒有 IP 地址的情況下處于活動狀態(tài)。否則,實例將無法訪問外部網絡。
NestOS 實例創(chuàng)建與配置
準備 Ignition 點火文件
結合容器化部署 OpenStack 特定場景環(huán)境配置需求,我們首先需要準備一份供 NestOS 部署使用的 Ignition 點火配置,主要內容分為操作系統基礎配置與 OpenStack 部署環(huán)境初始化兩部分,具體包括:
類別 | 配置項 | 用途 |
---|---|---|
passwd | 配置 NestOS 登錄用戶和訪問鑒權等相關信息 | |
系統配置 | 主機名 | 配置 NestOS 實例主機名 |
網卡 1 | 該網卡負責部署、運維 NestOS 實例,提供基礎網絡環(huán)境 | |
時區(qū) | 配置 NestOS 實例默認時區(qū) | |
內核參數 | OpenStack 部署環(huán)境需確保開啟部分內核參數 | |
網卡 2 | 該網卡專用于 Neutron 使用 | |
OpenStack 部署環(huán)境初始化 | 安裝 python 環(huán)境 | OpenStack 部署需 python 環(huán)境支持 |
關閉 selinux | OpenStack 部署環(huán)境需關閉 selinux | |
時間同步 | OpenStack 部署環(huán)境需通過 chronyd 服務同步集群時間 | |
存儲配置 | 供 OpenStack 集群使用,本地存儲方案必選 |
ignition 文件被設計為可讀但難以編寫的形式(本質為 json 格式),我們可以先編寫對人友好的 bu 文件(本質為 yaml 格式),然后通過 Butane 工具將其轉化為 ignition 文件。
系統配置 passwd 時,如計劃使用密碼驗證的方式訪問 NestOS 實例,可以使用下述命令生成**${PASSWORD_HASH}**供 bu 文件使用。
opensslpasswd-1-saltyoursalt
我們按照上述表格中的信息將部署 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=foropenstack
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=modprobebr_netfilter
ExecStart=sysctl-p
[Install]
WantedBy=multi-user.target
配置編寫完畢后,可通過如下命令將 bu 文件通過 Butane 工具轉換為 ignition 點火文件:
dockerrun--interactive--rmquay.io/coreos/butane:latest--pretty--strictnestos.ign
除本地使用外,也可將生成的 ignition 點火文件以 http 服務等形式供 NestOS 實例部署時遠程訪問,實現集中式批量部署配置。
Libvirt 創(chuàng)建 NestOS 實例
準備好 ignition 文件后,使用 virt-install 創(chuàng)建 NestOS 虛擬化實例,創(chuàng)建指令參考如下,其中 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_cfgname=opt/com.coreos/config,file=${IGNITION_FILE_PATH}"--disk=size=40,backing_store=${NESTOS_RELEASE_QCOW2_PATH}--network=bridge=virbr1--disk=size=40
以上就是 Libvirt 創(chuàng)建 NestOS 虛擬化實例的基本流程,可根據需要創(chuàng)建任意數量的 NestOS 實例,也可使用 PXE 方式引導部署在裸金屬服務器。
OpenStack 配置與部署
基于 NestOS 容器化部署 OpenStack 采用了主流的 Kolla-ansible 方案,按上文步驟創(chuàng)建的 NestOS 實例已具備 kolla-ansible 部署所需各項條件,在部署過程中無需任何操作。本章節(jié)所涉及的指令操作均在部署節(jié)點上執(zhí)行。
配置基礎環(huán)境
添加 OpenStack 源
在 openEuler 發(fā)行版中已提供 openstack 適配,如部署節(jié)點采用 openEuler,安裝 OpenStack 相關軟件包前均需安裝 OpenStack 源。
yuminstallopenstack-release-wallaby
安裝 Kolla 和 Kolla-ansible
yuminstallopenstack-kollaopenstack-kolla-ansible
配置 Ansible
將以下選項添加到 Ansible 配置文件**/etc/ansible/ansible.cfg**:
[defaults]
host_key_checking=False
pipelining=True
forks=100
配置 Kolla Ansible
Inventory
Inventory 是一個 Ansible 文件,可以在其中指定主機及其所屬的組,使用它來定義節(jié)點角色和訪問憑證。
Kolla Ansible 附帶了 all-in-one 和 multinode 示例清單文件。它們之間的區(qū)別在于,前者是部署單節(jié)點 OpenStack,后者則是使用多個節(jié)點。本文將使用 multinode 方式部署。
- 在 multinode 文件中編輯環(huán)境的節(jié)點信息,例如:
[control]
nestosansible_ssh_user=${USERNAME}ansible_ssh_password=${USERPASSWARD}ansible_become=true
[network]
nestos
[compute]
nestosansible_ssh_user=${USERNAME}ansible_ssh_password=${USERPASSWARD}ansible_become=true
[monitoring]
nestos
[storage]
nestos
[deployment]
localhostansible_connection=localbecome=true
- 檢查配置是否正確,運行:
ansible-i./multinode all-mping
Kolla 密碼
在部署過程中使用的密碼存儲在/etc/kolla/passwords.yml 文件中。初始情況下,該文件中的所有密碼都是空白的,必須手動填充或通過運行隨機密碼生成器來填充:
kolla-genpwd
SourceURL///home/lijian/文檔/公眾號文檔_NestOS 應用:容器化部署 OpenStack/20220704_NestOS 應用案例:容器化部署 OpenStack.docx
Kolla globals.yml
globals.yml 是 Kolla Ansible 的主要配置文件。由于當前 OpenStack 官方容器鏡像還未正式支持 openEuler 系統,因此在部署時將選用 CentOS 容器鏡像。
- 鏡像選擇
#Validoptionsare['centos','debian','rhel','ubuntu']
kolla_base_distro:"centos"
#Validoptionsare[binary,source]
kolla_install_type:"binary"
#Donotoverridethisunlessyouknowwhatyouaredoing.
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"
部署 OpenStack
Kolla Ansible 提供了一個 playbook,能夠以指定的版本安裝所有必需的服務。
下面為使用 multinode 配置的情況,如使用 all-in-one,需進行替換。也可添加-vvv 參數,查看詳細執(zhí)行日志。
- 引導服務
kolla-ansible-i./multinodebootstrap-servers
- 環(huán)境檢查
kolla-ansible-i./multinodeprechecks
- 拉取鏡像
kolla-ansible-i./multinodepull
- 執(zhí)行部署
kolla-ansible-i./multinodedeploy
如部署失敗,可執(zhí)行銷毀命令:
kolla-ansibledestroy-i./multinode--yes-i-really-really-mean-it
使用 OpenStack
- 安裝 OpenStack CLI 客戶端
yuminstallpython3-openstackclient
- OpenStack 需要一個 openrc 文件,其中設置了管理員用戶的憑證。生成該文件:
kolla-ansiblepost-deploy
./etc/kolla/admin-openrc.sh
- 根據安裝 Kolla Ansible 的方式,執(zhí)行下述腳本創(chuàng)建示例網絡,鏡像等。
kolla-ansible/tools/init-runonce
- 通過 ip 地址與 admin-openrc.sh 中提供的 horizon 賬號密碼進行登錄:
登錄成功后可看到 OpenStack 的 web 界面:
更多詳細信息可查閱 OpenStack 官方部署文檔:https://docs.openstack.org/kolla-ansible/wallaby/user/quickstart.html。
總結
NestOS 作為一款在 openEuler 社區(qū) CloudNative Sig 組孵化的云底座操作系統,從以上部署 OpenStack 的流程可以看出,它專為運行容器化工作負載而設計,意在成為計算集群的安全可靠主機。在第一次啟動期間,NestOS 使用 ignition 點火文件配置系統,無論是在云端、虛擬化還是裸金屬,NestOS 始終都從同一個地方開始,我們還可將 ignition 保存于服務器中,供 NestOS 遠程訪問,實現集中式的配置管理,這為大規(guī)模部署集群提供了便利。
NestOS 旨在作為不可變基礎架構進行管理,當機器創(chuàng)建完成后,如想要更新配置不應通過修改/etc 或其他方式進行更改,而應使用新的 ignition 點火文件配置替換機器。這與我們管理容器的方式類似,容器鏡像不會就地更新,而是從頭開始重新構建并重新部署。這種方法可以在負載增加時輕松擴展,只需使用相同的 ignition 配置即可啟動其他計算機。
NestOS 將配置工具 ignition 與 rpm-ostree、OCI 支持、Selinux 強化等技術集成在一起,采用基于雙系統分區(qū)、容器技術和集群架構的設計思路,搭載 iSulad、docker、podman 等主流容器基礎平臺,克服了由于用戶修改系統內容、用戶服務對系統組件依賴,以及系統軟件包升級時不穩(wěn)定中間態(tài)等種種導致升級過程不可靠的因素,最終以一種輕量級、定制化的操作系統呈現出來,可以適應各種不同的基礎設施環(huán)境。
More
openEuler 社區(qū)的 OpenStack 生態(tài)正在逐步完善,期待 Sig-OpenStack 盡快推出 openEuler 社區(qū)支持維護的 OpenStack 容器鏡像。未來 NestOS 項目也計劃與 Sig-OpenStack 緊密合作,推出更加適用于 NestOS 部署方式的部署工具,不僅如此,我們也會推出特定于 OpenStack 場景使用的 NestOS 集成定制版本,減少冗余軟件包,在降低操作系統基座底噪的同時減少暴露攻擊面,實現更便捷、更高效地部署。
「聯系我們」
NestOS 項目官方倉庫:https://gitee.com/openeuler/NestOS
您也可通過 openEuler 社區(qū) sig-cloudnative 與 sig-K8sDistro 聯系我們。
-
操作系統
+關注
關注
37文章
6747瀏覽量
123204 -
容器
+關注
關注
0文章
494瀏覽量
22046 -
OpenStack
+關注
關注
1文章
69瀏覽量
18898
原文標題:NestOS應用案例:容器化部署OpenStack
文章出處:【微信號:openEulercommunity,微信公眾號:openEuler】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論