Kolla-ansible部署OpenStack集群

慈云数据 2024-04-19 技术支持 58 0

0. OpenStack 部署

系统要求

单机部署最低配置:

Kolla-ansible部署OpenStack集群
(图片来源网络,侵删)
  • 2张网卡
  • 8G内存
  • 40G硬盘空间

    主机系统:

    • CentOS Stream 9
    • Debian Bullseye (11)
    • openEuler 22.03 LTS
    • Rocky Linux 9- Ubuntu Jammy (22.04)

      官方不再支持CentOS 7作为主机系统,我这里使用的是Rocky Linux 9.2(最小化安装)

      Kolla-ansible部署OpenStack集群
      (图片来源网络,侵删)

      如果这些主机中,有网卡名称不一致的问题,则可以通过team来使网卡名称一致

      关闭所有节点的防火墙和selinux

      systemctl disable --now firewalld

      setenforce 0;sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/g’ /etc/selinux/config

      1. deploy节点安装依赖

      1.1 安装基础依赖

      dnf install git python3-devel libffi-devel gcc openssl-devel python3-libselinux
      

      1.2 安装Ansible额外需要的包

      官方文档中没有说明,实际部署过程中,没有这两个包会无法使用pip安装的ansible

      dnf install python3-resolvelib sshpass
      

      1.3 设置Python-venv虚拟环境

      为了防止与系统的python环境冲突,这里使用虚拟环境安装ansible与kolla-ansible /path/to/venv是虚拟环境的目录,可以自己指定

      创建虚拟环境

      python3 -m venv /path/to/venv
      

      进入虚拟环境

      source /path/to/venv/bin/activate
      

      在虚拟环境中输入deactivate命令,即可退出虚拟环境

      更换pip国内源,更新pip

      pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
      pip install -U pip
      

      1.4 安装Ansible

      Kolla-ansible需要ansible-core2.13~2.14的版本,这里需要指定版本安装

      pip install ansible==7.7.0 ansible-core==2.14.11
      

      1.5 所有节点安装docker

      控制节点、网络节点、存储节点和计算节点

      2. deploy节点安装Kolla-ansible

      2.1 安装本体

      pip install git+https://opendev.org/openstack/kolla-ansible@stable/2023.1
      

      2.2 获取Kolla配置文件

      创建配置文件夹

      mkdir /etc/kolla
      

      复制global.yml与password.yml到配置文件夹

      cp -r /path/to/venv/share/kolla-ansible/etc_examples/kolla/* /etc/kolla
      

      2.3 获取Ansible清单文件

      复制all-in-one与multinode两个清单文件,分别对应了单机部署与多节点部署

      cp /path/to/venv/share/kolla-ansible/ansible/inventory/* /etc/kolla
      

      3. 安装Ansible Galaxy依赖

      kolla-ansible install-deps    #可能偶现ERROR,多尝试
      

      4. 配置Ansible

      单机部署时,可以跳过这一步

      编辑/etc/ansible/ansible.cfg,如果没有则需要先创建,将下面的内容添加到配置文件中

      [defaults]
      host_key_checking=False
      pipelining=True
      forks=100
      

      5. 准备初始化配置 deploy

      5.1 修改hosts

      单机部署时,可以跳过这一步

      在部署机的hosts中添加需要部署的主机的主机名,后续会自动同步到所有节点 编辑/etc/hosts文件,我这里准备部署3台控制节点与3台计算节点 (共用)

      还需要配置deploy节点到这几个节点的 SSH互信

      10.0.0.10 control01.openstack.instack.cloud control01
      10.0.0.20 control02.openstack.instack.cloud control02
      10.0.0.21 control03.openstack.instack.cloud control03
      

      5.2 准备清单文件

      • 单机部署时,使用all-in-one清单文件- 多节点部署时,使用multinode清单文件

        单机部署时,可以不用修改all-in-one清单文件

        下面是我的multinode清单文件的开头部分,供参考

        [all]
        control01
        control02
        control03
        [control]
        # 指定root密码、管理网卡
        control01 # ansible_ssh_pass="root"  network_interface="ens192"
        control02 # ansible_ssh_pass="root"  network_interface="ens192"
        control03 # ansible_ssh_pass="root"  network_interface="ens192"
        [network:children]
        # 可在组名后添加:children来对组进行嵌套
        control
        [compute]
        # 指定root密码、管理网卡、外部网卡
        control 
        [monitoring:children]
        control
        [deployment]
        localhost       ansible_connection=local
        

        详细的配置规则见 Ansible文档(opens new window)

        配置完成后,使用下面的命令测试Ansible的连通性

        ansible -i multinode all -m ping
        

        5.3 生成密码

        kolla-genpwd
        

        密码存储在/etc/kolla/passwords.yml中

        推荐自己修改一下某些密码,比如keystone_admin_password

        5.4 配置 global.yml

        镜像选择

        Kolla可以选择多种镜像版本:

        • CentOS Stream (centos)- Debian (debian)- Rocky (rocky)- Ubuntu (ubuntu) 官方推荐新安装的使用rocky或ubuntu,这里使用和主机相同的rocky发行版

          提示

          默认不用修改

          kolla_base_distro: "rocky"
          

          镜像仓库

          国内可能访问quay.io比较慢,可以指定国内的quay.io源

          docker_registry: "quay.nju.edu.cn"
          

          自建仓库

          docker_registry: "hub.huahuayun.cloud"
          

          登录

          docker_registry_insecure: "yes"
          docker_registry_username: "admin"
          # docker_registry_password在password.yml中配置
          #docker_registry: "quay.nju.edu.cn"
          docker_registry: "hub.huahuayun.cloud"
          

          网络

          管理网络的网卡,也用于主机之间的通信,若非所有主机网卡名都是一致的,可以使用bond或team技术

          network_interface: "bond0"
          

          连接外部网络的网卡,需要一个开启的,没有配置IP的网卡

          neutron_external_interface: "bond1"
          

          用于管理的浮动IP,由keepalived提供高可用性,必须是管理网络中没有被使用的地址

          kolla_internal_vip_address: "10.0.0.250"
          kolla_external_vip_address: "192.168.110.110"
          kolla_external_vip_interface: "bond2"
          

          监控

          enable_prometheus
          

          虚拟机高可用

          enable_hacluster
          

          中心日志

          enable_central_logging: "yes"
          enable_venus: "yes"
          

          global.yml中所有的选项,都可以在清单文件中为每个主机单独配置。上面的multinode文件中,指定了每台主机的管理网卡与外部网卡。

          [root@huahuadeploy kolla]# cat globals.yml | grep -v '^#' | grep -v '^$'
          ---
          workaround_ansible_issue_8743: yes
          kolla_internal_vip_address: "10.20.10.110" # 内部管理网络VIP,internal endpoint使用
          kolla_external_vip_address: "192.168.110.110" # (可选)外部管理网络VIP, public endpoint使用
          docker_registry: "hub.huahuayun.cloud" # 本地Harbor仓库,或使用quay.io或使用quay.nju.edu.cn
          docker_registry_insecure: "yes"
          docker_registry_username: "admin"
          network_interface: "bond0"  # 内部管理网络网卡名称,使用bond可以统一不同节点的网卡名称或者提供网络高可用
          kolla_external_vip_interface: "bond2" # (可选)有外部管理网VIP时填写
          neutron_external_interface: "bond1" # 提供者网络,一般用于公网IP和弹性IP
          Keepalived_virtual_router_id: "110" # 同一网络下有多个集群时需要不同的router_id,类型为uint8
          openstack_region_name: "ChengDuTest"
          enable_hacluster: "yes" # 是否启用实例高可用,节点故障时迁移
          enable_barbican: "yes"
          enable_ceilometer: "yes"
          enable_ceilometer_ipmi: "yes"
          enable_central_logging: "yes"
          enable_cinder: "yes"
          enable_cinder_backup: "yes"
          enable_fluentd: "yes"
          enable_gnocchi: "yes"
          enable_gnocchi_statsd: "yes"
          enable_grafana: "yes"
          enable_ironic: "yes" # 是否需要包括裸金属服务
          enable_mariabackup: "yes"
          enable_neutron_dvr: "yes"
          enable_neutron_qos: "yes"
          enable_prometheus: "yes"
          enable_redis: "yes" # 是否使用redis提供缓存和gnocchi的incoming存储
          enable_skyline: "yes"
          enable_venus: "yes"
          enable_ironic_ipxe: "no"
          ironic_dnsmasq_serve_ipxe: false
          ceph_glance_keyring: "ceph.client.glance1.keyring"  # ceph相关的默认就行,这里用户和池名称均添加了数字1
          ceph_glance_user: "glance1"
          ceph_glance_pool_name: "images1"
          ceph_cinder_keyring: "ceph.client.cinder1.keyring"
          ceph_cinder_user: "cinder1"
          ceph_cinder_pool_name: "volumes1"
          ceph_cinder_backup_keyring: "ceph.client.cinder-backup1.keyring"
          ceph_cinder_backup_user: "cinder-backup1"
          ceph_cinder_backup_pool_name: "backups1"
          ceph_nova_keyring: "{{ ceph_cinder_keyring }}"
          ceph_nova_user: "cinder1" # 重点
          ceph_nova_pool_name: "vms1" # 重点
          ceph_gnocchi_keyring: "ceph.client.gnocchi1.keyring"
          ceph_gnocchi_user: "gnocchi1"
          ceph_gnocchi_pool_name: "gnocchi1"
          glance_backend_ceph: "yes"
          gnocchi_backend_storage: "ceph"
          cinder_backend_ceph: "yes"
          nova_backend_ceph: "yes"
          ironic_dnsmasq_interface: "bond0" # 裸金属dnsmasq默认使用内部管理网
          ironic_dnsmasq_dhcp_ranges:
            - range: "10.20.10.241,10.20.10.250"
              routers: "10.20.10.254"
          ironic_inspector_kernel_cmdline_extras: ['ipa-lldp-timeout=90.0', 'ipa-collect-lldp=1']
          prometheus_cmdline_extras: "--web.enable-lifecycle"
          

          6. 配置ceph

          我们需要提前部署一个ceph集群,要求ceph的public network和计算节点网络相通

          存储池的名称和用户名可以在/etc/kolla/globals.yml中找到并修改

          nova_backend_ceph, cinder_backend_ceph, glance_backend_ceph, ceph_cinder_backup_pool_name

          ceph_nova_user, ceph_cinder_user, ceph_glance_user, cinder-backup

          # Glance
          ceph_glance_keyring: "ceph.client.glance1.keyring"
          ceph_glance_user: "glance1"
          ceph_glance_pool_name: "images1"
          # Cinder
          ceph_cinder_keyring: "ceph.client.cinder1.keyring"
          ceph_cinder_user: "cinder1"
          ceph_cinder_pool_name: "volumes1"
          ceph_cinder_backup_keyring: "ceph.client.cinder-backup1.keyring"
          ceph_cinder_backup_user: "cinder-backup1"
          ceph_cinder_backup_pool_name: "backups1"
          # Nova  # 重点是cinder1不是nova1
          ceph_nova_keyring: "{{ ceph_cinder_keyring }}"
          ceph_nova_user: "cinder1"
          ceph_nova_pool_name: "vms1"
          # Gnocchi
          ceph_gnocchi_keyring: "ceph.client.gnocchi1.keyring"
          ceph_gnocchi_user: "gnocchi1"
          ceph_gnocchi_pool_name: "gnocchi1"
          

          以下均在cephadm节点执行

          6.1 创建存储池

          ceph osd pool create volumes1
          ceph osd pool create images1
          ceph osd pool create backups1
          ceph osd pool create vms1
          ceph osd pool create gnocchi1
          rbd pool init volumes1
          rbd pool init images1
          rbd pool init backups1
          rbd pool init vms1
          ceph osd pool application enable gnocchi1 rgw # 在页面上去设置也可,pools>gnocchi>edit>application>rgw
          # optional
          ceph osd pool create cephfs_data 64 64
          ceph osd pool create cephfs_metadata 64 64
          ceph osd pool application enable cephfs_data cephfs
          ceph osd pool application enable cephfs_metadata cephfs
          ceph fs new myfs cephfs_metadata cephfs_data
          

          6.2 创建glance cinder cinder-backup账户

          ceph auth get-or-create client.glance1 mon 'profile rbd' osd 'profile rbd pool=images1' mgr 'profile rbd pool=images1'
          ceph auth get-or-create client.cinder1 mon 'profile rbd' osd 'profile rbd pool=volumes1, profile rbd pool=vms1, profile rbd-read-only pool=images1' mgr 'profile rbd pool=volumes1, profile rbd pool=vms1'
          ceph auth get-or-create client.cinder-backup1 mon 'profile rbd' osd 'profile rbd pool=backups1' mgr 'profile rbd pool=backups1'
          ceph auth get-or-create client.gnocchi1 mon "allow r" osd "allow rwx pool=gnocchi1"
          

          6.3 复制keyring

          ceph auth get-or-create client.glance1 > /etc/ceph/ceph.client.glance1.keyring
          ceph auth get-or-create client.cinder1 > /etc/ceph/ceph.client.cinder1.keyring
          ceph auth get-or-create client.cinder-backup1 > /etc/ceph/ceph.client.cinder-backup1.keyring
          ceph auth get-or-create client.gnocchi1 > /etc/ceph/ceph.client.gnocchi1.keyring
          

          将上述文件copy到deploy节点的/etc/kolla/config下

          .
          ├── cinder
          │   ├── cinder-backup
          │   │   ├── ceph.client.cinder-backup.keyring
          │   │   ├── ceph.client.cinder.keyring
          │   │   └── ceph.conf -> /etc/kolla/config/custom/ceph.conf
          │   └── cinder-volume
          │       ├── ceph.client.cinder.keyring
          │       └── ceph.conf -> /etc/kolla/config/custom/ceph.conf
          ├── custom
          │   └── ceph.conf
          ├── glance
          │   ├── ceph.client.glance.keyring
          │   └── ceph.conf -> /etc/kolla/config/custom/ceph.conf
          ├── gnocchi
          │   ├── ceph.client.gnocchi1.keyring
          │   └── ceph.conf -> /etc/kolla/config/custom/ceph.conf
          ├── haproxy
          ├── ironic
          │   ├── ironic-agent.initramfs
          │   ├── ironic-agent.kernel
          │   └── pxelinux.0
          ├── nova
          │   ├── ceph.client.cinder.keyring
          │   └── ceph.conf -> /etc/kolla/config/custom/ceph.conf
          └── nova.conf
          

          nova.conf

          [DEFAULT]
          block_device_allocate_retries = 6000
          block_device_allocate_retries_interval = 30
          # config drive 能够在 instance 启动时将网络配置信息动态注入到操作系统中
          flat_injected = true
          [libvirt]
          inject_password = true
          [filter_scheduler]
          enabled_filters = SimpleCIDRAffinityFilter,DifferentHostFilter,JsonFilter,SameHostFilter
          

          7. 配置Ironic(可选)

          vim /etc/kolla/globals.yml

          enable_ironic: "yes"
          enable_ironic_neutron_agent: "{{ enable_neutron | bool and enable_ironic | bool }}"
          ironic_dnsmasq_interface: "{{ network_interface }}"
          ironic_cleaning_network: "ext_net_test"
          ironic_dnsmasq_dhcp_ranges:
            - range: "192.168.131.10,192.168.131.50"
              routers: "192.168.2.1"
          ironic_dnsmasq_boot_file: "pxelinux.0"
          ironic_inspector_kernel_cmdline_extras: ['ipa-lldp-timeout=90.0', 'ipa-collect-lldp=1']
          

          下载镜像 (我们自己有——virt-custom制作的initramfs,允许root登录)

          $ curl https://tarballs.opendev.org/openstack/ironic-python-agent/dib/files/ipa-centos9-stable-2023.1.kernel \
            -o /etc/kolla/config/ironic/ironic-agent.kernel
          $ curl https://tarballs.opendev.org/openstack/ironic-python-agent/dib/files/ipa-centos9-stable-2023.1.initramfs \
            -o /etc/kolla/config/ironic/ironic-agent.initramfs
          

          8. 部署

          我这里采用多节点部署,使用的是multinode清单文件,单机部署请使用all-in-one清单文件

          引导服务器

          kolla-ansible -i ./multinode bootstrap-servers  # 检查是否干净,关闭防火墙,安装一些包,这是需要联网的
          

          部署前检查

          kolla-ansible -i ./multinode prechecks
          

          开始部署 莫慌,先去掉所有节点外网IP

          kolla-ansible -i ./multinode deploy
          

          9. 使用OpenStack

          9.1 命令行(OpenStack CLI)

          安装CLI客户端

          pip install python-openstackclient -c https://releases.openstack.org/constraints/upper/2023.1
          pip install python-ironicclient
          pip install python-ironic-inspector-client
          

          生成openrc文件

          kolla-ansible post-deploy
          

          使用openrc文件

          . /etc/kolla/admin-openrc.sh
          

          接下来就可以使用OpenStack CLI了

          9.2 网页(Horizon)

          浏览器中访问kolla_internal_vip_address or kolla_external_vip_address

          skyline默认端口 9999

          horizon默认端口80

          输入账号密码即可

          账号密码可在password.yml中找到

          10 另外

          若需要多个flat网络,可以通过neutron_bridge_name这个配置选项来配置网卡名称,globals.yaml中不提供此配置,需要自己写,请先跟踪一下ansible脚本

微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon