安装环境:
操作系统: 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