實(shí)習(xí)將近一個(gè)月了,期間不斷努力,終于算是把OpenStack Ironic項(xiàng)目實(shí)現(xiàn)裸機(jī)部署的過(guò)程理解了一遍,并在小規(guī)模集群上成功實(shí)踐。整理一些這段時(shí)間工作的內(nèi)容,就算是一個(gè)階段性的小項(xiàng)目總結(jié)了。
Ironic
Ironic是OpenStack的一個(gè)子項(xiàng)目,用于實(shí)現(xiàn)在云里像管理虛擬機(jī)一樣管理裸機(jī)。
Ironic在OpenStack中的概念架構(gòu)圖如下
其中Bare Metal就是我們要控制的物理機(jī)了,Neutron為其提供網(wǎng)絡(luò)服務(wù),Cinder提供塊存儲(chǔ)服務(wù),Glance則提供裸機(jī)部署時(shí)的鏡像緩存服務(wù),在部署過(guò)程中,我們的Ironic模塊要和Neutron,Nova,Glance,Keystone這些核心的OpenStack項(xiàng)目配合,才能完美實(shí)現(xiàn)裸機(jī)部署的過(guò)程。
裸機(jī)部署過(guò)程中用到的一些核心的技術(shù)
(PXE) 預(yù)引導(dǎo)執(zhí)行環(huán)境,PXE是英特爾和微軟開(kāi)發(fā)的Wired for Management(WfM)規(guī)范的一部分。PXE使系統(tǒng)的BIOS和網(wǎng)絡(luò)接口卡(NIC)能夠從網(wǎng)絡(luò)引導(dǎo)計(jì)算機(jī)而不是磁盤(pán)。引導(dǎo)是系統(tǒng)將OS加載到本地存儲(chǔ)器的過(guò)程,以便處理器可以執(zhí)行該過(guò)程。允許系統(tǒng)通過(guò)網(wǎng)絡(luò)引導(dǎo)這種功能簡(jiǎn)化了管理員和服務(wù)器部署和服務(wù)器的管理。
動(dòng)態(tài)主機(jī)配置協(xié)議(DHCP) DHCP是用于英特網(wǎng)協(xié)議(IP)網(wǎng)絡(luò)的標(biāo)準(zhǔn)化網(wǎng)絡(luò)協(xié)議,用于動(dòng)態(tài)分配網(wǎng)絡(luò)配置參數(shù),例如接口和服務(wù)的IP地址。使用PXE,BIOS使用DHCP獲取網(wǎng)絡(luò)接口的IP地址,并找到存儲(chǔ)網(wǎng)絡(luò)引導(dǎo)程序(NBP)的服務(wù)器。
網(wǎng)絡(luò)引導(dǎo)程序(NBP) NBP等同于GRUB(Grand Unified Bootloader)或 LILO(Linux LOader) – 傳統(tǒng)上用于本地引導(dǎo)的加載器。與硬件驅(qū)動(dòng)器環(huán)境中的引導(dǎo)程序一樣,NBP負(fù)責(zé)將OS那個(gè)加載到內(nèi)存中,以便可以通過(guò)網(wǎng)絡(luò)引導(dǎo)操作系統(tǒng)。
普通文件傳輸協(xié)議(TFTP) TFTP是一種簡(jiǎn)單的文件傳輸協(xié)議,通常用于在本地環(huán)境中的計(jì)算機(jī)之間自動(dòng)傳輸配置或引導(dǎo)文件。在PXE環(huán)境中,TFTP用于使用來(lái)自DHCP服務(wù)器的信息通過(guò)網(wǎng)絡(luò)下載NBP。
智能平臺(tái)管理接口(IPMI) IPMI是系統(tǒng)管理員用于計(jì)算機(jī)系統(tǒng)的帶外管理和監(jiān)視其操作的標(biāo)準(zhǔn)化計(jì)算機(jī)系統(tǒng)接口。這是一種通過(guò)僅使用于硬件而不是操作系統(tǒng)的網(wǎng)絡(luò)連接來(lái)管理可能無(wú)響應(yīng)或斷電的系統(tǒng)的方法。
Ironic裸機(jī)部署的過(guò)程
核心流程分析
1、引導(dǎo)實(shí)例請(qǐng)求通過(guò) Nova API 進(jìn)入,通過(guò)消息隊(duì)列進(jìn)入 Nova 調(diào)度程序。
2、Nova Scheduler 應(yīng)用過(guò)濾器并查找符合條件的虛擬機(jī)監(jiān)控nova調(diào)度程序,還使用flavor的extra_specs(例如 cpu_arch)來(lái)匹配目標(biāo)物理節(jié)點(diǎn)。
3、Nova compute 管理選中hypervisor的資源聲明。
4、Nova compute 管理器根據(jù) nova引導(dǎo)請(qǐng)求中網(wǎng)絡(luò)接口在Networking服務(wù)中創(chuàng)建(未綁定)租戶(hù)虛擬接口(VIF)。這里需要注意的是,端口的MAC將隨機(jī)生成,并且當(dāng)VIF連接到某個(gè)節(jié)點(diǎn)以對(duì)應(yīng)于節(jié)點(diǎn)網(wǎng)絡(luò)接口卡時(shí)MAC將更新。
5、nova compute創(chuàng)建一個(gè) spawn 任務(wù),它包含所有信息,例如從哪個(gè)鏡像引導(dǎo)等。它從Nova compute的virt層調(diào)用 driver.spawn。在spawn過(guò)程中,virt驅(qū)動(dòng)程序執(zhí)行以下操作: 更新目標(biāo)ironic節(jié)點(diǎn)的deploy鏡像,實(shí)例UUID,請(qǐng)求的功能和各種flavor屬性。通過(guò)調(diào)用ironic API 驗(yàn)證節(jié)點(diǎn)的電源和部署的接口。將之前創(chuàng)建的VIF附加到節(jié)點(diǎn)。每個(gè)neutron port 可以被附加到任何ironic port和port group,port groups 比 ports有更高的優(yōu)先級(jí)。在Ironic這邊,這個(gè)工作時(shí)由 network interface做的。
6、Nova 的 ironic驅(qū)動(dòng)程序通過(guò) Ironic API 向服務(wù)裸機(jī)節(jié)點(diǎn)的 Ironic conductor 發(fā)出部署請(qǐng)求。
7、配置虛擬接口,Neutron API更新DHCP端口以設(shè)置 PXE/TFTP選項(xiàng)。在使用neutron網(wǎng)絡(luò)接口的情況下,ironic在網(wǎng)絡(luò)服務(wù)中創(chuàng)建單獨(dú)的配置端口,在 flat 網(wǎng)絡(luò)接口的情況下,nova創(chuàng)建的端口用于配置和部署實(shí)例網(wǎng)絡(luò)。
8、Ironic節(jié)點(diǎn)的啟動(dòng)接口準(zhǔn)備PXE配置和緩存 deploy kernel和 ramdisk。
9、Ironic 節(jié)點(diǎn)通過(guò) Management interfacec發(fā)出命令來(lái)啟動(dòng)節(jié)點(diǎn)的網(wǎng)絡(luò)引導(dǎo)。
10、Ironic 節(jié)點(diǎn)的 Deploy Interface 緩存實(shí)例鏡像(在 iSCSI 部署接口的情況下),緩存kernel和ramdisk,在netboot的時(shí)候需要它。
11、Ironic節(jié)點(diǎn)的Power Interface 指示節(jié)點(diǎn)的電源接口通電。
12、節(jié)點(diǎn)引導(dǎo)部署ramdisk
13、根據(jù)確切的驅(qū)動(dòng)程序需求,conductor 將通過(guò)iSCSI復(fù)制鏡像到物理節(jié)點(diǎn)。
14、節(jié)點(diǎn)的引導(dǎo)接口將 pxe config切換為引用實(shí)例鏡像,要求 ramdisk agent 軟關(guān)閉節(jié)點(diǎn)電源,如果ramdisk agent 軟關(guān)閉電源失敗,則通過(guò)IPMI/BMS呼叫關(guān)機(jī)裸機(jī)節(jié)點(diǎn)電源。
15、部署接口會(huì)觸發(fā)網(wǎng)絡(luò)接口,以便在創(chuàng)建時(shí)刪除配置端口,并將租戶(hù)端口綁定到節(jié)點(diǎn)。然后給節(jié)點(diǎn)上電。
16、裸機(jī)節(jié)點(diǎn)的 provisioning state更新為active狀態(tài)。
部署實(shí)踐
安裝好Ubuntu server 16.04系統(tǒng)作為裸機(jī)部署的控制節(jié)點(diǎn)
配置網(wǎng)絡(luò)
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 的管理網(wǎng)絡(luò),我們給它分配一個(gè)靜態(tài)IP,這里的地址需要和你的實(shí)際網(wǎng)絡(luò)環(huán)境一致。
eth1 做為 EXT_NET 接口,提供 OpenStack 的 neutron 網(wǎng)絡(luò),這里我們啟動(dòng)網(wǎng)口但是不對(duì)它進(jìn)行IP配置。
安裝kolla環(huán)境,部署OpenStack with Ironic
更新apt源,安裝依賴(lài)
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
# 關(guān)鍵配置修改
# 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 相關(guān)配置
# 啟用內(nèi)核支持模塊,刪除open-iscsi
sudo modprobe configfs
sudo apt-get remove open-iscsi
sudo mkdir -p /etc/kolla/config/ironic
cd /etc/kolla/config/ironic
# 下載和存儲(chǔ)ironic部署時(shí)引導(dǎo)鏡像
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的內(nèi)容
[DEFAULT]
enabled_drivers=pxe_ipmitool
[conductor]
automated_clean=false
# pxe 尋找tftp服務(wù)器是通過(guò)這個(gè)地址找的,如果不配置,pxe將無(wú)法從tftp服務(wù)拿到鏡像,從而超時(shí)失敗
[pxe]
tftp_server=192.168.1.50
kolla快速部署環(huán)境
# 生成密碼
kolla-genpwd
# 初始化環(huán)境,安裝一些基礎(chǔ)依賴(lài)如 docker
sudo kolla-ansible
-i /usr/local/share/kolla-ansible/ansible/inventory/all-in-one
bootstrap-servers
# 配置dockerhub加速,我們用國(guó)內(nèi)的阿里云源加速
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
# 預(yù)檢查
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
# 生成部署環(huán)境文件,/etc/kolla/admin-openrc.sh 里面有重要的系統(tǒng)初始化配置
sudo kolla-ansible post-deploy
配置br-ex
# 配置 eth1 即neutron對(duì)應(yīng)的網(wǎng)卡所在的網(wǎng)絡(luò)環(huán)境
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 原來(lái)的配置
Ironic 初始環(huán)境 SetUp
#!/bin/bash
# ironic 管理網(wǎng)段
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
# 上傳部署的引導(dǎo)鏡像
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
將制作的用戶(hù)鏡像上傳到 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,以便免密鑰登錄實(shí)例
# 生成密鑰對(duì)
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
注冊(cè)BareMetal節(jié)點(diǎn),啟動(dòng)部署裸機(jī)的操作系統(tǒng)
source server_ipmi
# 物理裸機(jī)的配置,可小不可大于實(shí)際值
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 創(chuàng)建 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
# 創(chuàng)建 node
ironic node-create -d pxe_ipmitool -n node1
NODE1_UUID=$(ironic node-list|grep node1|awk -F “| ” ‘{print $2}’)
# 設(shè)置 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
# 設(shè)置 node 的引導(dǎo)鏡像信息
ironic node-update $NODE1_UUID add driver_info/deploy_kernel=$DEPLOY_VMLINUZ_UUID
driver_info/deploy_ramdisk=$DEPLOY_INITRD_UUID
# 設(shè)置 node 的基本配置信息
ironic node-update $NODE1_UUID add properties/cpus=${VCPUS} properties/memory_mb=${RAM}
properties/local_gb=${DISK} properties/cpu_arch=${HOST_CPU_ARCH}
# 設(shè)置 node 的resource-class,方面node判斷部署到哪個(gè)裸機(jī)節(jié)點(diǎn)
openstack –os-baremetal-api-version 1.21 baremetal node set $NODE1_UUID
–resource-class CUSTOM_BAREMETAL_NODE1_AI
# 設(shè)置 啟動(dòng)網(wǎng)口的 MAC 地址,即 node 的 port
ironic port-create -n $NODE1_UUID -a $s1_nic_mac_address
# 設(shè)置 node狀態(tài)為 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
# 啟動(dòng)部署
openstack server create –image my-image –flavor ai-bm-node1
–key-name mykey –network public1 node1
本文涉及到的所有腳本可以到Linux公社資源站下載,詳細(xì)部署可參考這套腳本
——————————————分割線——————————————
免費(fèi)下載地址在 http://linux.linuxidc.com/
用戶(hù)名與密碼都是www.linuxidc.com
具體下載目錄在 /2018年資料/9月/30日/OpenStack Ironic實(shí)現(xiàn)裸機(jī)部署/
下載方法見(jiàn) http://www.linuxidc.com/Linux/2013-07/87684.htm
——————————————分割線——————————————