安装环境:

操作系统: Rocky 8.4 (Centos 8.4)

工 具:kolla-ansible

功能

主机名

网卡1(bond0)

网卡1(bond1)

备注

控制节点

controller01.os controller02.os controller03.os

10.200.200.2 10.200.200.3 10.200.200.4

 

controller01.os部署节点

计算节点

nova01.os nova02.os nova03.os

10.200.200.5 10.200.200.6 10.200.200.7

 

 


一、系统安装与配置



1.基本配置(控制节点及计算节点)

1.1 修改主机名

# hostnamectl set-hostname controller01.os

1.2 将主机名解析写入hosts

10.200.200.2 controller01.os controller01
10.200.200.3 controller02.os controller02
10.200.200.4 controller03.os controller03
10.200.200.5 nova01.os nova01
10.200.200.6 nova02.os nova02
10.200.200.7 nova03.os nova03

1.3 设置IP

# vim /etc/sysconfig/network-scripts/ifcfg-bond0
BONDING_OPTS="mode=balance-rr miimon=100"
TYPE=Bond
BONDING_MASTER=yes
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
IPADDR=10.200.200.2
PREFIX=24
GATEWAY=10.200.200.1
DNS1=10.200.200.254
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV4_DNS_PRIORITY=100
IPV6_DISABLED=yes
IPV6INIT=no
NAME=bond0
DEVICE=bond0
ONBOOT=yes

# vim /etc/sysconfig/network-scripts/ifcfg-eno3
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
NAME=eno3
DEVICE=eno3
ONBOOT=yes
SLAVE=yes
MASTER=bond0

1.4 关闭防火墙

# systemctl stop firewalld
# systemctl disable firewalld

1.5 关闭selinux

# vim /etc/selinux/config
SELINUX=disabled

1.6 免密设置(控制节点)

# ssh-keygen
# ssh-copy-id root@controller01.os
# ssh-copy-id root@controller02.os
# ssh-copy-id root@controller02.os
# ssh-copy-id root@nova01.os
# ssh-copy-id root@nova02.os
# ssh-copy-id root@nova03.os



2.安装软件(部署节点)

2.1 添加源

# vim /etc/yum.repos.d/epel.repo
[epel]
name = epel
baseurl=https://mirrors.aliyun.com/epel/8/Everything/x86_64/
enabled=1
gpgcheck=0

# vim /etc/yum.repos.d/ceph.repo
[ceph]
name = ceph
baseurl=https://download.ceph.com/rpm-pacific/el8/x86_64
enabled=1
gpgcheck=0

# vim /etc/yum.repos.d/docker-ce.repo
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=http://mirrors.aliyun.com/docker-ce/linux/centos/8/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/docker-ce/linux/centos/gpg

2.2 安装软件

# dnf install -y python3 python3-pip chrony docker-ce git ceph-common
# pip3 install cryptography==3.3.2 ansible==2.9.12 kolla-ansible docker openstackclient

2.3 配置chrony服务

修改chrony,添加ntp 服务器

# vim /etc/chrony.conf
pool cn.pool.ntp.org iburst

启动chrony服务

# systemctl start chronyd
# systemctl enable chronyd

2.4 配置docker服务

修改docker源,使用国内源

# vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}

启动docker服务

# systemctl start docker
# systemctl enable docker



3.其它节点配置

3.1 设置ansible

# vim /etc/ansible/ansible.cfg
[defaults]
inventory = /etc/ansible/hosts
remote_port = 22
remote_user = root
private_key_file = /root/.ssh/id_rsa
host_key_checking = False
pipelining = True
forks = 100

# vim /etc/ansible/hosts
[openstack]
10.200.200.3
10.200.200.4
10.200.200.5
10.200.200.6
10.200.200.7

[nova]
10.200.200.5
10.200.200.6
10.200.200.7

3.2 添加源

# ansible openstack -m copy -a 'src=/etc/yum.repos.d/docker-ce.repo dest=/etc/yum.repos.d/'

3.3 安装软件

# dnf install -y python3 python3-pip chrony docker-ce
# pip3 install docker

3.4 配置chrony服务

修改chrony,添加 ntp 服务器

# ansible openstack -m copy -a 'src=/etc/chrony.conf dest=/etc/'

启动chrony服务

# ansible openstack -m shell -a 'systemctl start chronyd'
# ansible openstack -m shell -a 'systemctl enable chronyd'

3.5 配置docker服务

修改docker源,使用国内源

# ansible openstack -m copy -a 'src=/etc/docker/daemon.json dest=/etc/docker/'

启动docker服务

# ansible openstack -m shell -a 'systemctl start docker'
# ansible openstack -m shell -a 'systemctl enable docker'



二、配置kolla-ansible



1.kolla-ansible初始化

创建/etc/kolla目录

# mkdir /etc/kolla

将kolla配置复制到/etc/kolla

# cp /usr/local/share/kolla-ansible/etc_examples/kolla/globals.yml /etc/kolla/
# cp /usr/local/share/kolla-ansible/etc_examples/kolla/passwords.yml /etc/kolla/

将清单文件复制到/root

# cp /usr/local/share/kolla-ansible/ansible/inventory/multinode /root/

修改清单文件/root/multinode

[control]
# These hostname must be resolvable from your deployment host
controller01.os
controller02.os
controller03.os

# The above can also be specified as follows:
#control[01:03]     ansible_user=kolla

# The network nodes are where your l3-agent and loadbalancers will run
# This can be the same as a host in the control group
[network:children]
control

[compute]
nova01.os
nova02.os
nova03.os

[monitoring]
controller01.os

# When compute nodes and control nodes use different interfaces,
# you need to comment out "api_interface" and other interfaces from the globals.yml
# and specify like below:
#compute01 neutron_external_interface=eth0 api_interface=em1 storage_interface=em1 tunnel_interface=em1

[storage:children]
control

[deployment]
localhost       ansible_connection=local

生成集群各组件所需的密码文件

# kolla-genpwd



2.配置部署脚本

修改/etc/kolla/global.yml文件,前面说到在节点配置文件里设置的是哪个组件安装在哪个节点上。

而globals.yml文件里定义的是,启用哪些组件,组件的具体配置信息。配置完成后的需要修改的配置信息如下所示:

---
kolla_base_distro: "centos"
kolla_install_type: "source"
kolla_internal_vip_address: "10.200.200.253"
kolla_internal_fqdn: "control.os"
kolla_external_vip_address: "{{ kolla_internal_vip_address }}"
kolla_external_fqdn: "control.os"
network_interface: "bond0"
neutron_external_interface: "bond1"
neutron_plugin_agent: "openvswitch"
openstack_region_name: "RegionOne"
enable_openstack_core: "yes"
enable_glance: "{{ enable_openstack_core | bool }}"
enable_haproxy: "yes"
enable_keepalived: "{{ enable_haproxy | bool }}"
enable_keystone: "{{ enable_openstack_core | bool }}"
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_outward_rabbitmq: "{{ enable_murano | bool }}"
enable_cinder: "yes"
enable_cinder_backup: "yes"
enable_horizon: "{{ enable_openstack_core | bool }}"
enable_neutron_qos: "yes"
enable_neutron_agent_ha: "yes"
enable_neutron_provider_networks: "yes"
enable_neutron_segments: "yes"
enable_neutron_port_forwarding: "yes"
enable_nova_serialconsole_proxy: "yes"
glance_backend_ceph: "yes"
glance_backend_file: "no"
cinder_backend_ceph: "yes"
nova_backend_ceph: "yes"

说明:

1. network_interface 这个接口是所有的api服务默认绑定的,所有的vxlan/tunnel和存储网络流量都会默认通过这个接口,此接口必须包含 IP 地址。

2. neutron_external_interface 这是给予 neutron 作为其外部网络端口的接口。 尽管此接口上可以存在 IP 地址,但它在大多数配置中都无法使用,因此,建议不要为该接口配置任何 IP 地址。



3.配置外部 Ceph

创建openstack各组件配置文件目录

# mkdir -p /etc/kolla/config/{nova,cinder,glance,neutron,horizon}
# mkdir -p /etc/kolla/config/cinder/{cinder-volume,cinder-backup}

将ceph集群的相关配置及认证文件复制到/etc/ceph目录

# ls /etc/ceph
ceph.conf
ceph.client.admin.keyring
ceph.client.cinder-backup.keyring
ceph.client.cinder.keyring
ceph.client.glance.keyring
ceph.client.gnocchi.keyring

glance组件

# cp /etc/ceph/ceph.conf /etc/kolla/config/glance/
# cp /etc/ceph/ceph.client.glance.keyring /etc/kolla/config/glance/

nova组件

# cp /etc/ceph/ceph.conf /etc/kolla/config/nova/
# cp /etc/ceph/ceph.client.cinder.keyring /etc/kolla/config/nova/

cinder组件

# cp /etc/ceph/ceph.conf  /etc/kolla/config/cinder/
# cp /etc/ceph/ceph.client.cinder.keyring /etc/kolla/config/cinder/cinder-volume/
# cp /etc/ceph/ceph.client.cinder.keyring /etc/kolla/config/cinder/cinder-backup/
# cp /etc/ceph/ceph.client.cinder-backup.keyring /etc/kolla/config/cinder/cinder-backup/



4.glance服务创建配置文件

创建配置文件glance-api.conf

# vim /etc/kolla/config/glance/glance-api.conf
[DEFAULT]
show_image_direct_url = True
hw_scsi_model = virtio-scsi    #添加 virtio-scsi 控制器以获得更好的性能、并支持 discard 操作
hw_disk_bus = scsi             #把所有 cinder 块设备都连到这个控制器
hw_qemu_guest_agent = yes      #启用 QEMU guest agent (访客代|理)
os_require_quiesce = yes       #通过 QEMU guest agent 发送fs-freeze/thaw调用

[glance_store]
stores = rbd
default_store = rbd
default_backend = rbd

[rbd]
rbd_store_ceph_conf = /etc/ceph/ceph.conf
rbd_store_user = glance
rbd_store_pool = images
rbd_store_chunk_size = 8



5.nova服务创建配置文件

为了直接从 Ceph 卷启动虚拟机,必须为 Nova 配置临时后端。 建议在Ceph 配置文件中启用 RBD 缓存; 此外,启用客户端管理套接字允许收集指标,对于故障排除非常有用。启用 RBD 缓存和管理套接字,确保在每个管理程序的 ceph.conf 中包含:

[client.libvirt]
admin socket = /var/run/ceph/$cluster-$type.$id.$pid.$cctid.asok
log file = /var/log/ceph/qemu-guest-$pid.log
rbd cache = true
rbd cache writethrough until flush = true
rbd concurrent management ops = 20

配置这些目录权限:

mkdir -p /var/run/ceph/ /var/log/ceph/
chown qemu:libvirtd /var/run/ceph/ /var/log/ceph/

注意:  用户 qemu 和组 libvirtd 可能因系统而异。

创建配置文件nova-compute.conf

# vim /etc/kolla/config/nova/nova-compute.conf
[DEFAULT]
cpu_allocation_ratio = 10.0        // CPU分配超售比例
ram_allocation_ratio = 1.0         // 内存分配超售比例
disk_allocation_ratio = 1.0
initial_cpu_allocation_ratio = 16.0
reserved_host_memory_mb = 10240    //预留10GB内存,这部分内存不能被虚拟机使用
resume_guests_state_on_host_boot = True  //计算节点物理机重启后,上面的虚拟机都会自动启动
vcpu_pin_set = 4-$      // 虚拟机 vCPU 的绑定范围,可以防止虚拟机争抢宿主机进程的 CPU 资源,建议值是预留前几个物理 CPU,把后面的所有 CPU 分配给虚拟机使用

[libvirt]
virt_type = kvm
images_rbd_pool=vms
images_type=rbd
images_rbd_ceph_conf=/etc/ceph/ceph.conf
rbd_user=cinder
rbd_secret_uuid=4a495286-1952-4047-8a49-04608979c663
live_migration_flag = VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE,VIR_MIGRATE_PERSIST_DEST,VIR_MIGRATE_TUNNELLED
inject_password = true
inject_key = true
swtmp_enabled = true          // 启用软TPM
swtpm_user = tss
swtpm_group = tss

[hyperv]
enable_instance_metrics_collection = true

注意:如果使用的是 cephx 身份验证,还需要配置中添加libvirt用户及密钥uuid, nova-compute.conf里的rbd_secret_uuid=填写下面的这个值

# grep cinder_rbd_secret_uuid /etc/kolla/passwords.yml
cinder_rbd_secret_uuid: 4a495286-1952-4047-8a49-04608979c663



6.cinder服务创建配置文件

创建配置文件cinder-volume.conf

# vim /etc/kolla/config/cinder/cinder-volume.conf
[DEFAULT]
enabled_backends = rbd-1,rbd-2
glance_api_version = 2

[rbd-1]
volume_driver=cinder.volume.drivers.rbd.RBDDriver
volume_backend_name= RBD-HDD
rbd_pool=volumes
rbd_ceph_conf=/etc/ceph/ceph.conf
rbd_flatten_volume_from_snapshot = false
rbd_max_clone_depth = 5
rbd_store_chunk_size = 4
rados_connect_timeout = -1
backend_host=rbd:volumes
rbd_user=cinder
rbd_secret_uuid=4a495286-1952-4047-8a49-04608979c663

# 配置不同类型的池
[rbd-2]
volume_driver=cinder.volume.drivers.rbd.RBDDriver
volume_backend_name= RBD-SSD
rbd_pool= ssd
rbd_ceph_conf=/etc/ceph/ceph.conf
rbd_flatten_volume_from_snapshot = false
rbd_max_clone_depth = 5
rbd_store_chunk_size = 4
rados_connect_timeout = -1
rbd_user=cinder
rbd_secret_uuid=4a495286-1952-4047-8a49-04608979c663

注意:

1.如果使用的是 cephx 身份验证,还需要配置中添加libvirt用户及密钥uuid, cinder-volume.conf里的rbd_secret_uuid=填写下面的这个值

# grep cinder_rbd_secret_uuid /etc/kolla/passwords.yml 
cinder_rbd_secret_uuid: 4a495286-1952-4047-8a49-04608979c663

2. 卷类型关联

# openstack volume type set --property volume_backend_name=RBD-SSD SSD

创建配置文件cinder-backup.conf

# vim /etc/kolla/config/cinder/cinder-backup.conf
[DEFAULT]
backup_driver = cinder.backup.drivers.ceph.CephBackupDriver
backup_ceph_conf=/etc/ceph/ceph.conf
backup_ceph_user=cinder-backup
backup_ceph_chunk_size = 134217728
backup_ceph_pool=backups
backup_ceph_stripe_unit = 0
backup_ceph_stripe_count = 0
restore_discard_excess_bytes = true



7.neutron服务创建配置文件

创建配置文件ml2_conf.ini

# vim /etc/kolla/config/neutron/ml2_conf.ini
[ml2]
type_drivers = flat,vlan,vxlan
tenant_network_types = vxlan
mechanism_drivers = openvswitch,l2population
extension_drivers = qos,port_security

[ml2_type_flat]
flat_networks = physnet0
physical_interface_mappings = physnet0:bond1

[ml2_type_vlan]
network_vlan_ranges = physnet1:100:200
physical_interface_mappings = physnet1:bond1

[ml2_type_vxlan]
vni_ranges = 1:1000
vxlan_group = 239.1.1.1

创建配置文件openvswitch_agent.ini

# vim /etc/kolla/config/neutron/openvswitch_agent.ini
[agent]
tunnel_types = vxlan
l2_population = true
arp_responder = true
extensions = qos

[security]
firewall_driver=openvswitch

[ovs]
tenant_network_type = vlan
network_vlan_ranges=physnet1:100:200
integration_bridge = br-int
bridge_mappings = physnet1:br-ex

注意:network_vlan_ranges = physnet1:100:200里的100:200是对应物理交换机上实际要使用的vlan编号,physical_interface_mappings = physnet1:bond1,bond1是物理机上的网卡,用来走虚拟机网络的。



8.horizon服务创建配置文件

创建配置文件custom_local_settings , 创建实例时不创建卷:

# vim /etc/kolla/config/horizon/custom_local_settings
TIME_ZONE = "Asia/Shanghai"
DROPDOWN_MAX_ITEMS = 100

LAUNCH_INSTANCE_DEFAULTS = {
    'create_volume': False,
    'hide_create_volume': True,
    'config_driver': True,
}



三、部署集群



1.kolla 部署依赖项检查与安装:

# kolla-ansible -i /root/multinode bootstrap-servers



2.对主机进行部署前检查:

# kolla-ansible -i /root/multinode prechecks



3.进行实际的 OpenStack 部署

# kolla-ansible -i /root/multinode deploy



4.生成admin-openrc.sh

# kolla-ansible post-deploy

安装完成后,打开上面配置的域名地址即可访问安装好的openstack集群。



5.单个服务重新配置部署

如需要修改某个服务的配置信息,比如修改cinder对接后端ceph的信息,修改后执行reconfure即可

kolla-ansible -i /root/multinode reconfigure -t cinder



四、网络配置



1.创建vlan网络直通内网

# openstack network create --os-project-name admin --share --provider-network-type vlan --provider-physical-network physnet1 --provider-segment 100 pubnet-vlan100

# openstack subnet create --os-project-name admin --network pubnet-vlan100 --gateway 10.200.100.1 --subnet-range 10.200.100.0/24 --dns-nameserver 10.200.100.254 subnet-pubnet-vlan100



2.创建私有内网,通过NAT访问外网

(1) 创建External网络

# openstack network create --os-project-name admin --external --provider-network-type vlan --provider-physical-network physnet1 --provider-segment 101 floatnet-vlan101

# openstack subnet create --os-project-name admin --network floatnet-vlan101 --gateway 10.200.101.1 --subnet-range 10.200.101.0/24 --dns-nameserver 10.200.101.254 subnet-floatnet-vlan101

(2) 创建私有网络

# openstack network create --project test --provider-network-type vxlan --provider-segment 900 private-net192

# openstack subnet create --project test --network private-net192 --gateway 192.168.0.1 --subnet-range  192.168.0.0/24 subnet-private-net192

(3) 创建路由

# openstack router create --project test router-gateway192

# openstack router add subnet --os-project-name test router-gateway192 subnet-private-net192

# openstack router set --external-gateway floatnet-vlan101 --enable-snat router-gateway192

注: 创建路由时,如果路由与私有网络不在同一项目里,创建的实例会无法绑定浮动IP(显示:“无可用端口”).



3.关联浮动IP

查找实例的fixed ip

# openstack server list --project test |grep 9720e1bd-633e-4058-bd84-a0fc4aae2351
| 9720e1bd-633e-4058-bd84-a0fc4aae2351 | ltpb-20 | ACTIVE | private-net192=192.168.0.183 | ltptest | c4-m8-d20 |

查找实例的port id

# openstack port list --project test |grep 192.168.0.183
| 63dfc55c-ab9e-4dec-a53a-735a87078981 | ltp  | fa:16:3e:50:ce:b8 | ip_address='192.168.0.183', subnet_id='54a123ca-6785-4945-8f4b-1b9b0aeea6a6'   | ACTIVE |

创建float ip

# openstack floating ip create --project test floatnet-vlan101

列出float ip

# openstack floating ip list
| 047173c5-cc8f-4f4a-b524-d888510383ca | 10.200.101.132      | None             | None | 4513dd3e-3aa8-4c08-8cbb-41089b450434 | fb9317f63f034396a54b31edb1efb497 |

绑定float ip

# openstack floating ip set --port 63dfc55c-ab9e-4dec-a53a-735a87078981 10.200.101.132

 



五、添加/删除主机



1.添加控制节点

bootstrap-servers 命令可用于准备添加到系统中的新主机,它为新主机在 /etc/hosts 中添加了一个条目,并且某些服务(例如 RabbitMQ)要求每个控制器上的所有控制器都存在条目。 如果使用 --limit 参数,确保包含所有控制器。

# kolla-ansible -i <inventory> bootstrap-servers [ --limit <limit> ]

将容器映像下拉到新主机。 可以使用 --limit 参数,并且只需要包含新主机。

# kolla-ansible -i <inventory> pull --limit [ --limit <limit> ]

将容器部署到新主机。 如果使用 --limit 参数,请确保包含所有控制器

# kolla-ansible -i <inventory> deploy --limit [ --limit <limit> ]

新控制器现已部署。 通过对控制平面进行测试,以验证新控制器是否正常运行。

某些资源可能不会自动平衡到新控制器上。 手动将这些资源重新平衡到新控制器上可能会有所帮助。



2.添加计算节点

bootstrap-servers 命令可用于准备添加到系统中的新主机

# kolla-ansible -i <inventory> bootstrap-servers [ --limit <limit> ]

将容器映像下拉到新主机。 可以使用 --limit 参数,并且只需要包含新主机。

# kolla-ansible -i <inventory> pull --limit [ --limit <limit> ]

在新主机上部署容器。 可以使用 --limit 参数,并且只需要包含新主机。

# kolla-ansible -i <inventory> deploy [ --limit <limit> ]

现在已部署新的计算节点。通过对计算节点执行测试以验证它们是否正常运行。

查看注册的计算节点

# openstack resource provider list

服务器实例不会自动平衡到新的计算节点上,将一些服务器实例实时迁移到新主机上

# openstack server migrate <server> --live-migration --host <target host> --os-compute-api-version 2.30



3.删除控制节点

删除控制器或其他运行集群服务的主机时,请考虑集群中是否有足够的主机来形成仲裁。 例如,在具有 3 个控制器的系统中,一次只能删除一个。 还要考虑这对冗余的影响。

在从集群中删除现有控制器之前,建议移动它们托管的资源。 在这里将介绍由 Neutron DHCP 代|理托管的网络和由 Neutron L3 代|理托管的路由器。 可能需要其他操作,具体取决于现有的环境和配置。

对于每个被移除的主机,在该主机上找到 Neutron 路由器并移动它们。

禁用 L3 代|理

# l3_id=$(openstack network agent list --host <host> --agent-type l3 -f value -c ID)
# target_l3_id=$(openstack network agent list --host <target host> --agent-type l3 -f value -c ID)
# openstack router list --agent $l3_id -f value -c ID | while read router; do
  openstack network agent remove router $l3_id $router --l3;
  openstack network agent add router $target_l3_id $router --l3;
done
# openstack network agent set $l3_id --disable

禁用 DHCP 代|理

# dhcp_id=$(openstack network agent list --host <host> --agent-type dhcp -f value -c ID)
# target_dhcp_id=$(openstack network agent list --host <target host> --agent-type dhcp -f value -c ID)
# openstack network list --agent $dhcp_id -f value -c ID | while read network; do
  openstack network agent remove network $dhcp_id $network --dhcp ;
  openstack network agent add network $target_dhcp_id $network --dhcp ;
done

停止并删除主机上正在运行的所有服务:

# kolla-ansible -i <inventory> stop --yes-i-really-really-mean-it [ --limit <limit> ]

从 Ansible 清单中删除主机

重新配置其余控制器以更新 MariaDB 和 RabbitMQ 等集群的成员资格。 使用合适的限制,例如 --limit 控制。

# kolla-ansible -i <inventory> deploy [ --limit <limit> ]

执行测试以验证其余群集主机是否正常运行。

对于每个主机,清理它的服务:

# openstack network agent list --host <host> -f value -c ID | while read id; do
  openstack network agent delete $id ; 
done

# openstack compute service list --os-compute-api-version 2.53 --host <host> -f value -c ID | while read id; do
  openstack compute service delete --os-compute-api-version 2.53 $id ;
done



4.删除计算节点

从系统中删除计算节点时,请考虑是否有能力在剩余的计算节点上托管正在运行的工作负载。 包括可能发生的故障的开销。

在从系统中删除计算节点之前,建议迁移或销毁它们托管的任何实例。

对于每个主机,禁用计算服务以确保没有新实例被调度到它。

# openstack compute service set <host> nova-compute --disable

如果可能,将实例实时迁移到另一台主机。

# openstack server list --host <host> -f value -c ID | while read server; do 
  openstack server migrate --live-migration $server; 
done

验证迁移是否成功。

停止并删除主机上正在运行的所有服务:

# kolla-ansible -i <inventory> destroy --yes-i-really-really-mean-it [ --limit <limit> ]

从 Ansible 清单中删除主机。

对于每个主机,清理它的服务:

# openstack network agent list --host <host> -f value -c ID | while read id; do
  openstack network agent delete $id ;
done

# openstack compute service list --os-compute-api-version 2.53 --host <host> -f value -c ID | while read id; do
  openstack compute service delete --os-compute-api-version 2.53 $id ;
done

 删除计算节点网络代|理信息

# openstack network agent list
+--------------------------------------+--------------------+---------+-------------------+-------+-------+---------------------------+
| ID                                   | Agent Type         | Host    | Availability Zone | Alive | State | Binary                    |
+--------------------------------------+--------------------+---------+-------------------+-------+-------+---------------------------+
| 0aaf97e4-42eb-4319-97f0-ef707360983b | Open vSwitch agent | nova01  | None              | :-)   | UP    | neutron-openvswitch-agent |

# openstack network agent delete 0aaf97e4-42eb-4319-97f0-ef707360983b

删除计算节点主机信息

# openstack compute service list --os-compute-api-version 2.53

+--------------------------------------+----------------+--------+----------+----------+-------+----------------------------+
| ID                                   | Binary         | Host   | Zone     | Status   | State | Updated At                 |
+--------------------------------------+----------------+--------+----------+----------+-------+----------------------------+
| b5f154c5-422e-40b2-acd2-bb9ab9f3d657 | nova-compute   | nova01 | nova     | disabled | down  | 2021-10-24T05:45:10.000000 |
| 397d9c39-7645-4f06-bda0-f15bcea2f454 | nova-compute   | nova02 | nova     | disabled | up    | 2021-10-24T05:56:57.000000 |
| b8351401-95f8-49ed-b811-20890b72c2e9 | nova-compute   | nova03 | nova     | enabled  | up    | 2021-10-24T05:57:20.000000 |

# openstack compute service delete b5f154c5-422e-40b2-acd2-bb9ab9f3d657

执行测试以验证其余群集主机是否正常运行。

注意:如果添加新节点与旧节点同名,还需要将资源表(placement)的旧节点的相关信息删除

## 查询旧节点的信息
select * from resource_providers where name = 'nova01.avlyun.org';

## 获取id及root_provider_id 
## id = 837044
## root_provider_id = 837044

## 删除旧节点资源信息
delete from inventories where resource_provider_id=837044;

delete from resource_provider_traits where resource_provider_id=837044;  

SET foreign_key_checks = 0;
delete from resource_providers where name = 'nova01.avlyun.org';
SET foreign_key_checks = 1;



六、Ironic 部署



1.预部署配置

在 /etc/kolla/globals.yml 中启用 Ironic:

enable_ironic: "yes"
enable_ironic_ipxe: "yes"
enable_ironic_neutron_agent: "{{ enable_neutron | bool and enable_ironic | bool }}"
enable_ironic_pxe_uefi: "yes"

在同一个文件中,定义一个网络接口作为 dnsmasq 的默认 NIC,一个可供 Ironic 检查器使用的 IP 地址范围,以及一个用于 Ironic 清理网络的网络:

ironic_dnsmasq_interface: "eth1"
ironic_dnsmasq_dhcp_range: "192.168.5.100,192.168.5.110"
ironic_cleaning_network: "public1"

在同一个文件中,可以选择用于 Ironic Inspector 检查网络的默认网关:

ironic_dnsmasq_default_gateway: 192.168.5.1

在同一个文件中,为 Ironic Inspector 指定 PXE 引导加载程序文件。该文件相对于 /tftpboot 目录。默认值为 pxelinux.0,对于 x86 系统应该是正确的。其他平台可能需要不同的值,例如 Debian 上的 aarch64 需要 debian-installer/arm64/bootnetaa64.efi。

ironic_dnsmasq_boot_file: pxelinux.0

Ironic 检查器还需要将部署内核和 ramdisk 放置在 /etc/kolla/config/ironic/ 中。以下示例使用常用于 Ironic 部署的 coreos,但可以使用任何兼容的内核/ramdisk:

# curl https://tarballs.openstack.org/ironic-python-agent/dib/files/ipa-centos8-master.kernel -o /etc/kolla/config/ironic/ironic-agent.kernel

# curl https://tarballs.openstack.org/ironic-python-agent/dib/files/ipa-centos8-master.initramfs -o /etc/kolla/config/ironic/ironic-agent.initramfs

可以选择使用以下命令将额外的内核参数传递给检查内核:/etc/kolla/globals.yml。

ironic_inspector_kernel_cmdline_extras: ['ipa-lldp-timeout=90.0', 'ipa-collect-lldp=1']

添加ironic配置文件/etc/kolla/config/ironic.conf

[DEFAULT]
enabled_drivers = pxe_ipmitool_socat,pxe_ipmitool
enabled_hardware_types = ipmi
enabled_network_interfaces=noop,flat
enabled_power_interfaces = ipmitool
enabled_management_interfaces = ipmitool,noop
enabled_console_interfaces = ipmitool-socat,ipmitool-shellinabox,no-console
enabled_vendor_interfaces = ipmitool,no-vendor

[conductor]
sync_power_state_interval = 10
power_state_sync_max_retries = 20
#power_state_change_timeout = 30
deploy_callback_timeout = 900
force_power_state_during_sync = true

[pxe]
uefi_pxe_bootfile_name = bootx64.efi
#After deploy the OpenStack, Update the tftp_server
#tftp_server =
#pxe_append_params = coreos.autologin rd.auto=1 nofb nomodeset vga=normal console=ttyS0,115200n8
pxe_append_params = coreos.autologin rd.auto=1 nofb nomodeset vga=normal console=tty0 console=ttyS0,115200n8 sshkey="ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDFhz9WKBnFGJSwcX+L7kGqDC4icr/zq3dmVfgMgEwBPAHl9AJkZjYFstei8FBB2RcnhOGytFwOnUqlEovy4pzJhekNKATbCI7wnA1SPHI9lSOzYtfMFydL+xLkNsjQ4PzIHwhi/d1Vz3+9IjRZP8w2I2idjCulWsdsosSlrLI5+fBeuIuAMMOzCCMjsUlRmtWgYjs2tGpqnfAeiTa7TIi27P74Vix+Usc5k6SOO/1b7YyhlhPR7kJ8HhvJx+fg/9rQjIxknrHPmyCQ2uEvksvjeQwJHo4qHpUD1IXqrhONBi2g+2iDvPSWbzR30qOZWabP0oUf91JNIveA6CBPu2qnktlmMs3JaHDVIM9lR75Ph5P/r2CoqdsPKfbyiS4Zj0I2zuRXqmdEiZUX2NcHQfZjGckGiBU6PVwoznmq5JNtwf7N8XdGHZYjuB1l9UW+74pKn4/C4s9P9feWL4z08f586rvyO7/qreZNSSKrsqIjDPA7YBD1BEnofCz0rmkxnLM="

[disk_utils]
#default interval is 1 second
iscsi_verify_attempts = 30



2.启用 iPXE 启动(可选)

您可以选择通过在 /etc/kolla/globals.yml 中将 enable_ironic_ipxe 设置为 true 来启用通过 iPXE 启动:

enable_ironic_ipxe: "yes"

这将启用名为 ironic_ipxe 的 docker 容器的部署,运行 iPXE 用于获取其启动映像的 Web 服务器。

用于 iPXE 网络服务器的端口是通过 /etc/kolla/globals.yml 中的 ironic_ipxe_port 控制的:

ironic_ipxe_port: "8089"

如果启用 iPXE 引导,将发生以下更改:

Ironic 将使用 ipxe_enabled 配置选项设置为 true

检查 ramdisk 和内核将通过 iPXE 加载

DHCP 服务器将配置为从现有 PXE 环境链式加载 iPXE。 也可以通过其他方式直接引导到 iPXE,例如通过将其刻录到以太网卡的选项 rom。



3.部署

kolla-ansible deploy



4.部署后配置

Ironic部署过程需要有两套镜像:

一个是deploy image

  • 必须包含ironic python agent
  • 作用是dd user image 到裸机的硬盘上。

一个是user image ,有2种:

  • partition image

        也叫做half imge,只是一个root partition , 在写到磁盘之后,裸机启动有2种方式:

        从pxe启动,使用这个user image的kernel 和 ramdisk。

        从硬盘启动,这个需要配置ironic node的local boot特性。

  • whole image

        包括分区表和bootloader
        在whole image写到磁盘之后,ironic就不管裸机的启动了,默认是从硬盘启动。

Ironic 文档描述了如何创建部署内核和 ramdisk 并将它们注册到 Glance。 在这个例子中,我们重用了为 Inspector 获取的相同图像:

# 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

为裸机创建 Nova 风格。 例如:

# openstack flavor create --ram 512 --disk 1 --vcpus 1 my-baremetal-flavor
# openstack flavor set my-baremetal-flavor --property \
  resources:CUSTOM_BAREMETAL_RESOURCE_CLASS=1 \
  resources:VCPU=0 \
  resources:MEMORY_MB=0 \
  resources:DISK_GB=0

注册裸机节点和端口,确保为裸机节点的内核、虚拟磁盘和 MAC 地址替换正确的值。

# openstack baremetal node create --driver ipmi --name baremetal-node \
  --driver-info ipmi_port=623 \
  --driver-info ipmi_username=admin \
  --driver-info ipmi_password=password \
  --driver-info ipmi_address=192.168.5.1 \
  --resource-class baremetal-resource-class \
  --property cpus=1 \
  --property memory_mb=512 \
  --property local_gb=1 \
  --property cpu_arch=x86_64 \
  --driver-info deploy_kernel=15f3c95f-d778-43ad-8e3e-9357be09ca3d \
  --driver-info deploy_ramdisk=9b1e1ced-d84d-440a-b681-39c216f24121

# openstack baremetal port create 52:54:00:ff:15:55 \
  --node 57aa574a-5fea-4468-afcf-e2551d464412 \
  --physical-network physnet1

使裸机节点可用于 nova:

# openstack baremetal node manage 57aa574a-5fea-4468-afcf-e2551d464412
# openstack baremetal node provide 57aa574a-5fea-4468-afcf-e2551d464412

节点可能需要一些时间才能在 nova 中进行调度。 使用以下命令等待资源变为可用:

# openstack hypervisor stats show
# openstack hypervisor show 57aa574a-5fea-4468-afcf-e2551d464412



5.引导裸机

现在可以使用以下示例命令来引导裸机实例:

# openstack server create --image cirros --flavor my-baremetal-flavor --key-name mykey --network public1 demo1



6.调试DHCP

以下 tcpdump 命令在调试 dhcp 请求可能没有命中进程的各个部分时很有用:

# tcpdump -i <interface> port 67 or port 68 or port 69 -e -n



7.配置 Web 控制台

基于上游节点 Web 控制台的配置。

串行速度必须与 BIOS 设置中的串行配置相同。 默认值:115200bps,8bit,非奇偶校验。如果你有不同的串口速度。

在 /etc/kolla/globals.yml 中设置 ironic_console_serial_speed:

# ironic_console_serial_speed: 9600n8



七、添加https证书



方式一:

1. 生成openstack证书

将apache证书control.os.crt,  control.os.key, root_bundle.crt合成相应证书backend-cert.pem,backend-key.pem,haproxy.pem,haproxy-internal.pem;

查看control.os.crt证书信息

# openssl x509 -noout -text -in control.os.crt

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            09:ae:4d:75:e5:f0:0c:aa:4f:bf:cd:b5:50:66:0d:7c
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, O = DigiCert Inc, CN = RapidSSL TLS DV RSA Mixed SHA256 2020 CA-1

通过浏览器(firefox)或者Windows操作系统获取“RapidSSL TLS DV RSA Mixed SHA256 2020 CA-1”中间认证的证书链“control-os-chain.pem",将control-os-chain.pem复制到/etc/kolla/certificates/ca/。

# cp control-os-chain.pem /etc/kolla/certificates/ca/ca.crt

生成backend证书

# cat control.os.crt root_bundle.crt >> /etc/kolla/certificates/backend-cert.pem
# cp control.os.key /etc/kolla/certificates/backend-key.pem

生成haproxy证书

# cat control.os.crt root_bundle.crt control.os.key >> /etc/kolla/certificates/hapraoxy.pem
# cp /etc/kolla/certificates/hapraoxy.pem /etc/kolla/certificates/hapraoxy-internal.pem

2. 修改/etc/kolla/globals.yml,开启TLS

kolla_internal_vip_address: "10.200.200.253"

kolla_internal_fqdn: "control.os"

kolla_external_vip_address: "{{ kolla_internal_vip_address }}"

kolla_external_fqdn: "control.os"

kolla_enable_tls_internal: "yes"
kolla_enable_tls_external: "{{ kolla_enable_tls_internal if kolla_same_external_internal_vip | bool else 'no' }}"
kolla_certificates_dir: "{{ node_config }}/certificates"
kolla_external_fqdn_cert: "{{ kolla_certificates_dir }}/haproxy.pem"
kolla_internal_fqdn_cert: "{{ kolla_certificates_dir }}/haproxy-internal.pem"
kolla_admin_openrc_cacert: "/etc/ssl/certs/ca-bundle.crt"
kolla_copy_ca_into_containers: "yes"

kolla_enable_tls_backend: "yes"
kolla_verify_tls_backend: "no"
kolla_tls_backend_cert: "{{ kolla_certificates_dir }}/backend-cert.pem"
kolla_tls_backend_key: "{{ kolla_certificates_dir }}/backend-key.pem"

重新配置openstack集群

# kolla-ansible -i /root/multinode reconfigure



方式二:

如果部署前期没有绑定域名并启用TLS 或者后期更换域名,重新配置域名或更换域名会比较麻烦,因此通过 nginx 服务器代|理实现https服务。

1. 安装配置nginx服务器

分别在三个控制节点上安装nginx服务,将control.os域名指向10.200.200.253;或者另准备一台服务器安装nginx,将域名指定此服务器的IP。

nignx服务配置如下:

upstream control {
      server 10.200.200.253:80 max_fails=1 fail_timeout=600s;
      server 10.200.200.2:80 max_fails=1 fail_timeout=600s;
      server 10.200.200.3:80 max_fails=1 fail_timeout=600s;
      server 10.200.200.4:80 max_fails=1 fail_timeout=600s;
      keepalive 16;
  }
  server {
      listen       443 ssl default_server;
      server_name  control.os;

      ssl                on;
      ssl_certificate_key /etc/nginx/certs/control.os.key;
      ssl_certificate     /etc/nginx/certs/control.os.crt;
      ssl_session_cache shared:SSL:1m;
      ssl_session_timeout  10m;
      ssl_prefer_server_ciphers on;
      ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
      ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-RC4-SHA:ECDHE-RSA-AES256-SHA:HIGH:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!CBC:!EDH:!kEDH:!PSK:!SRP:!kECDH;

      location / {
          proxy_pass_header Server;
          proxy_set_header Host $http_host;
          proxy_redirect off;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Scheme $scheme;
          proxy_pass http://control;
          proxy_connect_timeout 200s;
          proxy_read_timeout 200s;
          proxy_send_timeout 200s;
          client_max_body_size 2000m;
      }

      location /log {
          alias /usr/share/nginx/html;
          index index.html;
      }
  }

将第三方权威的https证书放到/etc/nginx/certs目录,启动nginx服务

# systemctl start nginx

2. 修改haproxy配置

通过nginx提供的https服务访问openstack的dashboard管理后台时,因openstack集群内部通信还是http协议,因些访问实例的控制台时会看不到控制台界面,只有点击“点击此处只显示控制台” ,会跳转到http://control.os:6080这个地址看到实例控制台。

为了将实例的控制台也支持https协议,需要修改haproxy服务中nova-novncproxy.cfg的配置。

先将control.os.crt与control.os.key这两个证书文件合并在一个文件“haproxy.pem",存放到/etc/kolla/haproxy/目录,然后修改nova-novncproxy.cfg,在“bind"一行添加“ssl crt /etc/haproxy/haproxy.pem”

frontend nova_novncproxy_front
    mode http
    http-request del-header X-Forwarded-Proto
    option httplog
    option forwardfor
    http-request set-header X-Forwarded-Proto https if { ssl_fc }
    bind 10.200.200.253:6080 ssl crt /etc/haproxy/haproxy.pem
    default_backend nova_novncproxy_back

backend nova_novncproxy_back
    mode http
    timeout tunnel 1h
    server controller01 10.200.200.2:6080 check inter 2000 rise 2 fall 5 
    server controller02 10.200.200.3:6080 check inter 2000 rise 2 fall 5
    server controller03 10.200.200.4:6080 check inter 2000 rise 2 fall 5

重启haproxy容器。

3. 修改nova节点nova_compute的配置

将所有nova节点上的nova_compute的配置nova.conf中的novncproxy_base_url的地址中的 http 修改成 https

novncproxy_base_url = https://control.os:6080/vnc_auto.html

重启nova_compute容器。



Note:

kolla-ansible

openstack

10.2.0

ussuri

11.0.0

victoria

12.0.0

wallaby

ARM架构镜像

fluentd镜像

FROM kolla/centos-binary-base:10.4.0

LABEL maintainer="Kolla Project (https://launchpad.net/kolla)" name="fluentd" build-date="20220607"

LABEL fluentd_version="0.14" fluentd_binary="td-agent"

### td.repo
### http://packages.treasuredata.com/4/redhat/$releasever/$basearch

COPY td.repo /etc/yum.repos.d/td.repo
RUN usermod --append --home /var/lib/fluentd --groups kolla fluentd \
    && usermod --append --groups mysql fluentd \
    && mkdir -p /var/lib/fluentd \
    && chown -R 42474:42474 /var/lib/fluentd \
    && rpm --import https://packages.treasuredata.com/GPG-KEY-td-agent \
    && dnf -y install gcc-c++ make td-agent \
    && export PATH=/opt/td-agent/bin:$PATH \
    && gem install fluent-plugin-grep fluent-plugin-parser fluent-plugin-grok-parser fluent-plugin-td-monitoring \
    && dnf clean all \
    && rm -rf /var/cache/dnf/*
    
COPY fluentd_sudoers /etc/sudoers.d/kolla_fluentd_sudoers
RUN chmod 440 /etc/sudoers.d/kolla_fluentd_sudoers

COPY extend_start.sh /usr/local/bin/kolla_extend_start
RUN chmod 755 /usr/local/bin/kolla_extend_start

USER root



八、支持UEFI启动

8.1 上传uefi启动方式的镜像

# openstack image create --file centos_efi.img  centos-efi

8.2 修改镜像属性

# openstack image set --property hw_firmware_type='uefi' --property hw_machine_type='pc-q35-rhel8.5.0' centos-efi

注: 这里必须添加属性hw_machine_type,且值必须为“pc-q35-rhel8.5.0”.



九、启动vTPM

要开启vTPM功能,计算主机都需要以下需求:

  • 安装密钥管理器服务(如barbican),且配置为存储用于加密静止的虚拟设备文件的机密。
  • libvirt.virt_type只能为kvm或qemu
  • 安装swtpm二进制和相关的库
  • libvirt.swtpm_enabled配置选项设置为True。这将启用对TPM 1.2版和2.0版的支持。

9.1 安装密钥管理器服务(如barbican)

开启barbican服务, 编辑/etc/kolla/globals.yml

enable_barbican: "yes"

9.2 配置支持swtpm

编辑/etc/kolla/config/nova/nova-compute.conf,添加swtm支持

[libvirt]
virt_type = kvm
swtpm_enabled = true
swtpm_user = tss
swtpm_group = tss

9.3 部署服务

# kolla-ansible -i /root/multinode deploy

9.4 上传windows 11镜像,且开启tpm特性

# openstack image create --file windows11.img windows-11
# openstack image set --property hw_firmware_type='uefi' --property hw_machine_type='pc-q35-rhel8.5.0' --property hw_tpm_version=2.0 --property hw_tpm_model=tpm-crb --property os_secure_boot=required windows-11

或者在实例类型中添加tpm特性

# openstack flavor set --property hw:firmware_type='uefi' --property hw:machine_type='pc-q35-rhel8.5.0' --property hw:tpm_version=2.0 --property hw:tpm_model=tpm-crb --property os:secure_boot=required c4-m8-d100