實習將近一個月了,期間不斷努力,終于算是把OpenStack Ironic項目實現裸機部署的過程理解了一遍,并在小規模集群上成功實踐。整理一些這段時間工作的內容,就算是一個階段性的小項目總結了。
Ironic
Ironic是OpenStack的一個子項目,用于實現在云里像管理虛擬機一樣管理裸機。
Ironic在OpenStack中的概念架構圖如下
其中Bare Metal就是我們要控制的物理機了,Neutron為其提供網絡服務,Cinder提供塊存儲服務,Glance則提供裸機部署時的鏡像緩存服務,在部署過程中,我們的Ironic模塊要和Neutron,Nova,Glance,Keystone這些核心的OpenStack項目配合,才能完美實現裸機部署的過程。
裸機部署過程中用到的一些核心的技術
(PXE) 預引導執行環境,PXE是英特爾和微軟開發的Wired for Management(WfM)規范的一部分。PXE使系統的BIOS和網絡接口卡(NIC)能夠從網絡引導計算機而不是磁盤。引導是系統將OS加載到本地存儲器的過程,以便處理器可以執行該過程。允許系統通過網絡引導這種功能簡化了管理員和服務器部署和服務器的管理。
動態主機配置協議(DHCP) DHCP是用于英特網協議(IP)網絡的標準化網絡協議,用于動態分配網絡配置參數,例如接口和服務的IP地址。使用PXE,BIOS使用DHCP獲取網絡接口的IP地址,并找到存儲網絡引導程序(NBP)的服務器。
網絡引導程序(NBP) NBP等同于GRUB(Grand Unified Bootloader)或 LILO(Linux LOader) – 傳統上用于本地引導的加載器。與硬件驅動器環境中的引導程序一樣,NBP負責將OS那個加載到內存中,以便可以通過網絡引導操作系統。
普通文件傳輸協議(TFTP) TFTP是一種簡單的文件傳輸協議,通常用于在本地環境中的計算機之間自動傳輸配置或引導文件。在PXE環境中,TFTP用于使用來自DHCP服務器的信息通過網絡下載NBP。
智能平臺管理接口(IPMI) IPMI是系統管理員用于計算機系統的帶外管理和監視其操作的標準化計算機系統接口。這是一種通過僅使用于硬件而不是操作系統的網絡連接來管理可能無響應或斷電的系統的方法。
Ironic裸機部署的過程
核心流程分析
1、引導實例請求通過 Nova API 進入,通過消息隊列進入 Nova 調度程序。
2、Nova Scheduler 應用過濾器并查找符合條件的虛擬機監控nova調度程序,還使用flavor的extra_specs(例如 cpu_arch)來匹配目標物理節點。
3、Nova compute 管理選中hypervisor的資源聲明。
4、Nova compute 管理器根據 nova引導請求中網絡接口在Networking服務中創建(未綁定)租戶虛擬接口(VIF)。這里需要注意的是,端口的MAC將隨機生成,并且當VIF連接到某個節點以對應于節點網絡接口卡時MAC將更新。
5、nova compute創建一個 spawn 任務,它包含所有信息,例如從哪個鏡像引導等。它從Nova compute的virt層調用 driver.spawn。在spawn過程中,virt驅動程序執行以下操作: 更新目標ironic節點的deploy鏡像,實例UUID,請求的功能和各種flavor屬性。通過調用ironic API 驗證節點的電源和部署的接口。將之前創建的VIF附加到節點。每個neutron port 可以被附加到任何ironic port和port group,port groups 比 ports有更高的優先級。在Ironic這邊,這個工作時由 network interface做的。
6、Nova 的 ironic驅動程序通過 Ironic API 向服務裸機節點的 Ironic conductor 發出部署請求。
7、配置虛擬接口,Neutron API更新DHCP端口以設置 PXE/TFTP選項。在使用neutron網絡接口的情況下,ironic在網絡服務中創建單獨的配置端口,在 flat 網絡接口的情況下,nova創建的端口用于配置和部署實例網絡。
8、Ironic節點的啟動接口準備PXE配置和緩存 deploy kernel和 ramdisk。
9、Ironic 節點通過 Management interfacec發出命令來啟動節點的網絡引導。
10、Ironic 節點的 Deploy Interface 緩存實例鏡像(在 iSCSI 部署接口的情況下),緩存kernel和ramdisk,在netboot的時候需要它。
11、Ironic節點的Power Interface 指示節點的電源接口通電。
12、節點引導部署ramdisk
13、根據確切的驅動程序需求,conductor 將通過iSCSI復制鏡像到物理節點。
14、節點的引導接口將 pxe config切換為引用實例鏡像,要求 ramdisk agent 軟關閉節點電源,如果ramdisk agent 軟關閉電源失敗,則通過IPMI/BMS呼叫關機裸機節點電源。
15、部署接口會觸發網絡接口,以便在創建時刪除配置端口,并將租戶端口綁定到節點。然后給節點上電。
16、裸機節點的 provisioning state更新為active狀態。
部署實踐
安裝好Ubuntu server 16.04系統作為裸機部署的控制節點
配置網絡
auto eth0
iface eth0 inet static
gateway 192.168.0.253
address 192.168.0.50/24
mtu 1500
#neutron
auto eth1
iface eth1 inet manual
up ip link set dev eth1 promisc on
up ip link set dev eth1 up
down ip link set dev eth1 down
down ip link set dev eth1 promisc off
eth0 做為 API_NET 接口,提供 OpenStack 的管理網絡,我們給它分配一個靜態IP,這里的地址需要和你的實際網絡環境一致。
eth1 做為 EXT_NET 接口,提供 OpenStack 的 neutron 網絡,這里我們啟動網口但是不對它進行IP配置。
安裝kolla環境,部署OpenStack with Ironic
更新apt源,安裝依賴
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install python-jinja2 python-pip libssl-dev -fy
配置 pip 加速,使用阿里云 pip 源
mkdir ~/.pip
tee ~/.pip/pip.conf <<-‘EOF’
[global]
trusted-host = mirrors.aliyun.com
index-url = https://mirrors.aliyun.com/pypi/simple
EOF
安裝 kolla,kolla-ansible,python-openstackclient
sudo pip install –upgrade pip
sudo pip install ansible
sudo pip install kolla-ansible==4.0.3
sudo pip install python-openstackclient
Kolla部署Ironic配置
sudo cp -r /usr/local/share/kolla-ansible/etc_examples/kolla /etc/kolla
sudo vim /etc/kolla/global.yml
# 關鍵配置修改
# Valid options are [ CentOS, Oraclelinux, ubuntu ]
kolla_base_distro: “centos”
# Valid options are [ binary, source ]
kolla_install_type: “binary”
# Valid option is Docker repository tag
openstack_release: “4.0.0”
# api_net 的地址
kolla_internal_vip_address: “192.168.0.50”
network_interface: “eth0”
neutron_external_interface: “eth1”
neutron_plugin_agent: “openvswitch”
kolla_enable_tls_external: “no”
ironic_cleaning_network: “public1”
ironic_dnsmasq_dhcp_range: “192.168.8.1,192.168.8.5”
enable_ironic: “yes”
enable_haproxy: “no”
Ironic 相關配置
# 啟用內核支持模塊,刪除open-iscsi
sudo modprobe configfs
sudo apt-get remove open-iscsi
sudo mkdir -p /etc/kolla/config/ironic
cd /etc/kolla/config/ironic
# 下載和存儲ironic部署時引導鏡像
sudo wget http://otcloud-gateway.bj.intel.com/deployment-img/ironic-agent.kernel
sudo wget http://otcloud-gateway.bj.intel.com/deployment-img/ironic-agent.initramfs
sudo mv ironic.conf /etc/kolla/config/ironic.conf
#ironic.conf的內容
[DEFAULT]
enabled_drivers=pxe_ipmitool
[conductor]
automated_clean=false
# pxe 尋找tftp服務器是通過這個地址找的,如果不配置,pxe將無法從tftp服務拿到鏡像,從而超時失敗
[pxe]
tftp_server=192.168.1.50
kolla快速部署環境
# 生成密碼
kolla-genpwd
# 初始化環境,安裝一些基礎依賴如 docker
sudo kolla-ansible
-i /usr/local/share/kolla-ansible/ansible/inventory/all-in-one
bootstrap-servers
# 配置dockerhub加速,我們用國內的阿里云源加速
sudo tee /etc/docker/daemon.json <<-‘EOF’
{
“registry-mirrors”: [“https://ao6wb0ej.mirror.aliyuncs.com”]
}
EOF
# 配置完后重啟docker
sudo systemctl daemon-reload
sudo service docker restart
# 拉取鏡像
sudo kolla-ansible pull
# 預檢查
sudo kolla-ansible prechecks
-i /usr/local/share/kolla-ansible/ansible/inventory/all-in-one
# 部署
sudo kolla-ansible deploy
-i /usr/local/share/kolla-ansible/ansible/inventory/all-in-one
# 生成部署環境文件,/etc/kolla/admin-openrc.sh 里面有重要的系統初始化配置
sudo kolla-ansible post-deploy
配置br-ex
# 配置 eth1 即neutron對應的網卡所在的網絡環境
auto br-ex
iface br-ex inet static
address 192.168.1.50
netmask 255.255.255.0
gateway 192.168.1.253
dns-nameserver 192.168.1.253
# 注釋掉 eth1 原來的配置
Ironic 初始環境 SetUp
#!/bin/bash
# ironic 管理網段
EXT_NET_CIDR=’192.168.1.0/24′
EXT_NET_RANGE=’start=192.168.1.20,end=192.168.1.100′
EXT_NET_GATEWAY=’192.168.1.253′
EXT_NET_CIDR_DNS=’192.168.1.253′
# ironic init setup
# create ironic manage network
openstack network create –provider-physical-network physnet1
–provider-network-type flat public1
openstack subnet create
–allocation-pool ${EXT_NET_RANGE} –network public1
–subnet-range ${EXT_NET_CIDR} –gateway ${EXT_NET_GATEWAY} –dns-nameserver ${EXT_NET_CIDR_DNS} — public1-subnet
# 上傳部署的引導鏡像
openstack image create –disk-format aki –container-format aki –public
–file /etc/kolla/config/ironic/ironic-agent.kernel deploy-vmlinuz
openstack image create –disk-format ari –container-format ari –public
–file /etc/kolla/config/ironic/ironic-agent.initramfs deploy-initrd
使用diskimage-builder制作ubuntu部署鏡像
sudo pip install diskimage-builder
sudo apt install -y qemu-utils
disk-image-create ubuntu baremetal dhcp-all-interfaces -o my-image
將制作的用戶鏡像上傳到 glance
glance image-create –name my-kernel –visibility public
–disk-format aki –container-format aki < my-image.vmlinuz
glance image-create –name my-image.initrd –visibility public
–disk-format ari –container-format ari < my-image.initrd
MY_VMLINUZ_UUID=$(glance image-list|grep my-kernel|awk -F “| ” ‘{print $2}’)
MY_INITRD_UUID=$(glance image-list|grep my-image.initrd|awk -F “| ” ‘{print $2}’)
glance image-create –name my-image –visibility public
–disk-format qcow2 –container-format bare –property
kernel_id=$MY_VMLINUZ_UUID –property
ramdisk_id=$MY_INITRD_UUID < my-image.qcow2
生成ssh-key,以便免密鑰登錄實例
# 生成密鑰對
if [ ! -f ~/.ssh/id_rsa.pub ]; then
echo Generating ssh key.
ssh-keygen -t rsa -f ~/.ssh/id_rsa
fi
if [ -r ~/.ssh/id_rsa.pub ]; then
echo Configuring nova public key and quotas.
openstack keypair create –public-key ~/.ssh/id_rsa.pub mykey
fi
注冊BareMetal節點,啟動部署裸機的操作系統
source server_ipmi
# 物理裸機的配置,可小不可大于實際值
RAM=65536
DISK=800
VCPUS=32
HOST_CPU_ARCH=x86_64
export IRONIC_API_VERSION=1.20
DEPLOY_VMLINUZ_UUID=$(glance image-list|grep deploy-vmlinuz|awk -F “| ” ‘{print $2}’)
DEPLOY_INITRD_UUID=$(glance image-list|grep deploy-initrd|awk -F “| ” ‘{print $2}’)
# node1 創建 flavor
nova flavor-create ai-bm-node1 1 ${RAM} ${DISK} ${VCPUS}
nova flavor-key ai-bm-node1 set cpu_arch=x86_64
nova flavor-key ai-bm-node1 set resources:CUSTOM_BAREMETAL_NODE1_AI=1
nova flavor-key ai-bm-node1 set resources:VCPU=0
nova flavor-key ai-bm-node1 set resources:MEMORY_MB=0
nova flavor-key ai-bm-node1 set resources:DISK_GB=0
# 創建 node
ironic node-create -d pxe_ipmitool -n node1
NODE1_UUID=$(ironic node-list|grep node1|awk -F “| ” ‘{print $2}’)
# 設置 node 的 ipmi信息
ironic node-update $NODE1_UUID add driver_info/ipmi_username=$s1_ipmi_username
driver_info/ipmi_password=$s1_ipmi_password driver_info/ipmi_address=$s1_ipmi_address
driver_info/ipmi_terminal_port=623
# 設置 node 的引導鏡像信息
ironic node-update $NODE1_UUID add driver_info/deploy_kernel=$DEPLOY_VMLINUZ_UUID
driver_info/deploy_ramdisk=$DEPLOY_INITRD_UUID
# 設置 node 的基本配置信息
ironic node-update $NODE1_UUID add properties/cpus=${VCPUS} properties/memory_mb=${RAM}
properties/local_gb=${DISK} properties/cpu_arch=${HOST_CPU_ARCH}
# 設置 node 的resource-class,方面node判斷部署到哪個裸機節點
openstack –os-baremetal-api-version 1.21 baremetal node set $NODE1_UUID
–resource-class CUSTOM_BAREMETAL_NODE1_AI
# 設置 啟動網口的 MAC 地址,即 node 的 port
ironic port-create -n $NODE1_UUID -a $s1_nic_mac_address
# 設置 node狀態為 provide
ironic –ironic-api-version 1.20 node-set-provision-state $NODE1_UUID manage
ironic –ironic-api-version 1.20 node-set-provision-state $NODE1_UUID provide
# 啟動部署
openstack server create –image my-image –flavor ai-bm-node1
–key-name mykey –network public1 node1
本文涉及到的所有腳本可以到Linux公社資源站下載,詳細部署可參考這套腳本
——————————————分割線——————————————
免費下載地址在 http://linux.linuxidc.com/
用戶名與密碼都是www.linuxidc.com
具體下載目錄在 /2018年資料/9月/30日/OpenStack Ironic實現裸機部署/
下載方法見 http://www.linuxidc.com/Linux/2013-07/87684.htm
——————————————分割線——————————————