Openstack All-in-one met Ceph als storage

Openstack All-in-one met Ceph als storage

Binnen OpenStack-Ansible zijn er nog geen Ansible modules beschikbaar om een Ceph cluster uit te rollen. We kunnen hiervoor gebruik maken van Ceph-Ansible en hierna de OpenStack-Ansible Ceph client role gebruiken.


Deploy Ceph

In dit voorbeeld wordt een Ceph storage cluster aangemaakt via Ceph-Ansible. We gebruiken hiervoor 3 lxc containers voor de Ceph monitors binnen de OpenStack-Ansible AIO. De storage nodes worden aangemaakt op 3 losse VMtjes op dezelfde KVM hypervisor host. We gebruiken hiervoor Ubuntu versie 16.04.

Binnen OpenStack-Ansible hebben we de volgende netwerken beschikbaar:

/etc/network/interfaces.d/osa_interfaces.cfg
br-mgmt        172.29.236.100/22
br-vxlan    172.29.240.100/22
br-storage    172.29.244.100/22
br-vlan        172.29.248.100/22 veth peer name eth12
Flat network default gateway    172.29.248.1

Pas de osa_interfaces.cfg file aan om het br-mgmt en br-storage netwerk ook voor de osd VMtjes bereikbaar te maken. Voor Neutron gebruiken we voor public het Flat network met eth12 en ens3 is de interface naar internet.

auto br-mgmt
iface br-mgmt inet static
    bridge_stp off
    bridge_waitport 0
    bridge_ports ens9
    bridge_fd 0
    # Notice the bridge port is the vlan tagged interface
#    bridge_ports none
    address 172.29.236.100
    netmask 255.255.252.0
    offload-sg off

auto br-storage
iface br-storage inet static
    bridge_stp off
    bridge_waitport 0
    bridge_ports ens10
    bridge_fd 0
#    bridge_ports none
    address 172.29.244.100
    netmask 255.255.252.0
    offload-sg off

auto br-vxlan
    up /sbin/iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
    down /sbin/iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE

Als de lxc netwerken niet goed opkomen kun je eventueel een rebuild doen:

/usr/lcocal/bin/lxc-system-manage dnsmasq-restart

of

/usr/local/bin/lxc-system-manage system-rebuild

Voor de Ceph MON en OSD gaan we de volgende IP adressen gebruiken:

ceph hosts mon
mgmt 172.29.236.11, 12, 13
str  172.29.244.11, 12, 13

osd
mgmt 172.29.236.21, 22, 23
str  172.29.244.21, 22, 23

Pas de dynamische inventory file openstack_inventory.json file aan om de extra lxc mon containers aan te maken.
/etc/openstack_deploy/openstack_inventory.json

"aio1_ceph_mon_container-mon1": {
                "ansible_host": "172.29.236.11",
                "ansible_ssh_host": "172.29.236.11",
                "component": "ceph_mon",
                "container_address": "172.29.236.11",
                "container_name": "aio1_ceph_mon_container-mon1",
                "container_networks": {
                    "container_address": {
                        "address": "172.29.236.11",
                        "bridge": "br-mgmt",
                        "interface": "eth1",
                        "netmask": "255.255.252.0",
                        "type": "veth"
                    },
                    "storage_address": {
                        "address": "172.29.244.11",
                        "bridge": "br-storage",
                        "interface": "eth2",
                        "netmask": "255.255.252.0",
                        "type": "veth"
                    }
                },
                "physical_host": "aio1",
                "physical_host_group": "storage-infra_hosts",
                "properties": {
                    "service_name": "ceph-mon"
                }
            },

Voeg toe aan de containers group:

"aio1-host_containers": {
        "hosts": [
            "aio1_nova_conductor_container-9eac63f0",
            "aio1_aodh_container-4ce29abb",

            "aio1_ceph_mon_container-mon1",
            "aio1_ceph_mon_container-mon2",
            "aio1_ceph_mon_container-mon3"
         ]
},

"ceph-mon_container": {
        "hosts": [
            "aio1_ceph_mon_container-mon1",
            "aio1_ceph_mon_container-mon2",
            "aio1_ceph_mon_container-mon3"
        ]
    },

Voeg de mon hosts toe aan de /etc/hosts van de AIO host.

172.29.236.11 aio1-ceph-mon-container-mon1.openstack.local aio1_ceph_mon_container-mon1
172.29.236.12 aio1-ceph_mon-container-mon2.openstack.local aio1_ceph_mon_container-mon2
172.29.236.13 aio1-ceph_mon-container-mon3.openstack.local aio1_ceph_mon_container-mon3

Voer het Ansible playbook voor het aanmaken van de lxc containers uit. Het kan zijn dat je eerst ook de cache facts from physical host moet updaten door een playbook uit te voeren voor host aio1.

openstack-ansible lxc-containers-create.yml --limit aio1

openstack-ansible lxc-containers-create.yml --limit ceph-mon_container

PLAY RECAP *********************************************************************
aio1_ceph_mon_container-mon1 : ok=31   changed=22   unreachable=0    failed=0   
aio1_ceph_mon_container-mon2 : ok=31   changed=22   unreachable=0    failed=0   
aio1_ceph_mon_container-mon3 : ok=31   changed=22   unreachable=0    failed=0  

Installeer nu Ceph via Ceph-Ansible:

Pas het volgende aan in group_vars/all.yml:

ceph_origin: 'upstream' # or 'distro' or 'local'
ceph_stable: true # use ceph stable branch
ceph_stable_release: jewel # ceph stable release
monitor_interface: eth2
public_network: 172.29.244.0/22
cluster_network: "{{ public_network }}"

Pas het volgende aan in group_vars/osds.yml:

osd_auto_discovery: true
journal_collocation: true

Voor OpenStack glance, cinder en nova moeten we eerst de clients aanmaken met de juiste pools. Dit kun je aangeven in group_vars/mons.yml:

#############
# OPENSTACK #
#############

openstack_config: true
openstack_glance_pool:
  name: images
  pg_num: "{{ pool_default_pg_num }}"
openstack_cinder_pool:
  name: volumes
  pg_num: "{{ pool_default_pg_num }}"
openstack_nova_pool:
  name: vms
  pg_num: "{{ pool_default_pg_num }}"
#openstack_cinder_backup_pool:
#  name: backups
#  pg_num: "{{ pool_default_pg_num }}"

openstack_pools:
  - "{{ openstack_glance_pool }}"
  - "{{ openstack_cinder_pool }}"
  - "{{ openstack_nova_pool }}"
#  - "{{ openstack_cinder_backup_pool }}"

openstack_keys:
  - { name: client.glance, value: "mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool={{ openstack_glance_pool.name }}'" }
  - { name: client.cinder, value: "mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool={{ openstack_cinder_pool.name }}, allow rwx pool={{ openstack_nova_pool.name }}, allow rx pool={{ openstack_glance_pool.name }}'"  }
#  - { name: client.cinder-backup, value: "mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool={{ openstack_cinder_backup_pool.name }}'" }

Voeg een host file toe met de VMtjes (voorbeeld ceph-nodes):

[mons]
172.29.236.11
172.29.236.12
172.29.236.13

[osds]
172.29.236.21
172.29.236.22
172.29.236.23

[mons:vars]
ansible_python_interpreter=/usr/bin/python2.7

[osds:vars]
ansible_python_interpreter=/usr/bin/python2.7

Run ansible-ceph playbook:

ansible-playbook ceph-ansible/site.yml -i ceph-nodes

En na een paar minuten is het CEPH storage cluster klaar voor gebruik.

root@aio1-ceph-mon-container-mon1:~# ceph -s
    cluster aaf133a3-5959-43dc-a9a8-4696c926d95f
     health HEALTH_OK
     monmap e1: 3 mons at {aio1-ceph-mon-container-mon1=172.29.244.11:6789/0,
            aio1-ceph-mon-container-mon2=172.29.244.12:6789/0,aio1-ceph-mon-container-mon3=172.29.244.13:6789/0}
            election epoch 4, quorum 0,1,2 aio1-ceph-mon-container-mon1,aio1-ceph-mon-container-mon2,aio1-ceph-mon-container-mon3
     osdmap e31: 6 osds: 6 up, 6 in
            flags sortbitwise,require_jewel_osds
      pgmap v74: 448 pgs, 4 pools, 0 bytes data, 0 objects
            202 MB used, 149 GB / 149 GB avail
                  448 active+clean

root@aio1-ceph-mon-container-mon1:~# ceph osd tree
ID WEIGHT  TYPE NAME            UP/DOWN REWEIGHT PRIMARY-AFFINITY
-1 0.14639 root default                                           
-2 0.04880     host ubu1604osd1                                   
 0 0.02440         osd.0             up  1.00000          1.00000
 5 0.02440         osd.5             up  1.00000          1.00000
-3 0.04880     host ubu1604osd2                                   
 1 0.02440         osd.1             up  1.00000          1.00000
 4 0.02440         osd.4             up  1.00000          1.00000
-4 0.04880     host ubu1604osd3                                   
 2 0.02440         osd.2             up  1.00000          1.00000
 3 0.02440         osd.3             up  1.00000          1.00000 

En de OpenStack clients en pools zijn aangemaakt:

aio1-ceph-mon-container-mon1:~# ceph osd lspools
0 rbd,1 images,2 volumes,3 vms,

Nu kunnen we ansible-openstack configureren. Pas de volgende files aan in /etc/openstack_deploy.

ubu1604oc1:/etc/openstack_deploy# vi user_variables.yml
glance_default_store: rbd
glance_rbd_store_pool: images
nova_libvirt_images_rbd_pool: vms
ceph_mons:
  - 172.29.244.11
  - 172.29.244.12
  - 172.29.244.13

ubu1604oc1:/etc/openstack_deploy# vi openstack_user_config.yml

storage_hosts:
 aio1:
  ip: 172.29.236.100
  container_vars:
   cinder_backends:
     limit_container_types: cinder_volume
     rbd:
       volume_group: cinder-volumes
       volume_driver: cinder.volume.drivers.rbd.RBDDriver
       volume_backend_name: rbd
       rbd_pool: volumes
       rbd_ceph_conf: /etc/ceph/ceph.conf
       rbd_user: cinder

Voer nu het Ansible playbook voor de OpenStack configuratie weer uit.

cd /opt/openstack-ansible/playbooks

openstack-ansible setup-openstack.yml

OpenStack AIO is nu klaar om CEPH rbd storage pools te gebruiken voor glance, cinder en nova. Zie hiervoor: OpenStack deploy Instances op CEPH.