站長資訊網
        最全最豐富的資訊網站

        OpenStack Ironic實現裸機部署

        實習將近一個月了,期間不斷努力,終于算是把OpenStack Ironic項目實現裸機部署的過程理解了一遍,并在小規模集群上成功實踐。整理一些這段時間工作的內容,就算是一個階段性的小項目總結了。

        Ironic

        Ironic是OpenStack的一個子項目,用于實現在云里像管理虛擬機一樣管理裸機。

        Ironic在OpenStack中的概念架構圖如下

        OpenStack Ironic實現裸機部署

        其中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裸機部署的過程

        OpenStack 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

        ——————————————分割線——————————————

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 国产精品视频一区国模私拍| 88久久精品无码一区二区毛片 | 国产精品一区二区久久| 久久久久国产精品嫩草影院 | 国产精品成人在线| 亚洲国产一成人久久精品| 国产精品无码DVD在线观看| 91久久婷婷国产综合精品青草| 午夜精品一区二区三区在线观看| 99久久精品国产一区二区三区| 精品久久久久久无码专区| 亚洲国产精品一区二区第一页免 | 精品视频在线免费观看| 国产精品一区二区久久不卡 | 精品久久久久久| 国产中老年妇女精品| 人妻少妇精品无码专区二区| 无码国内精品久久人妻麻豆按摩 | 国产欧美日韩精品a在线观看| 亚洲国产精品不卡毛片a在线| 国产伦精品一区二区三区视频猫咪| 精品久久一区二区三区| 国产精品9999久久久久| 一本一本久久aa综合精品| 午夜成人精品福利网站在线观看 | 国产午夜精品理论片久久| 欧美亚洲精品在线| 精品福利资源在线| 99精品久久精品| 国产精品免费精品自在线观看| 大伊香蕉精品视频在线导航| 国产精品露脸国语对白| 国内精品伊人久久久久AV影院| 精品国精品国产自在久国产应用| 精品人妻va出轨中文字幕| 精品无人区一区二区三区| 国产国拍亚洲精品mv在线观看 | 欧美精品国产日韩综合在线| 久久成人精品视频| 777欧美午夜精品影院| 99免费精品国产|