메뉴 닫기

Openstack + Ansible = ?

Openstack-Ansible

 

안녕하세요. 이번에는 Openstack에서 Ansible의 장점을 취합하여 구성하는 Openstack-Ansible 에 대해서 알아보고 구성에서 중요한 openstack_user_config YAML 파일을 뜯어보고자 합니다.

 

1. Openstack

Openstack logo

 Openstack은 가상자원을 사용하는 IaaS 형태의 클라우드 컴퓨팅 오픈소스 플랫폼입니다.
 특징으로 Private / Public 클라우드를 구축하고 관리하는데 용이하며 컴퓨팅, 네트워킹, 스토리지, 인증 등의 각종 서비스들이 모듈화되어 구성이 가능합니다.
 가장 큰 장점으로 프라이빗 클라우드를 추가 비용없이 구축하는데 매우 용이한 점을 들 수있고, 모듈의 추가/삭제/변경을 지원하여 최적화하기 좋다는 점 또한 무시할 수 없습니다.
 허나, 6개월의 짧은 수명 주기를 가지고 있는 점과 방대한 개별 벤더의 모듈을 적용하기까지 어려우며 노드별로 확장될 경우 상대적으로 안정성이 떨어진다는 단점을 가지고 있습니다.

 

2. Ansible

Ansible logo

 

 Ansible은 IaC 기반의 네트워크 장비를 포함한 인프라 관리 소프트웨어 도구로, 소프트웨어 프로비저닝, 자동화된 설정 관리, 애플리케이션 배포가 가능한 오픈소스 프로젝트입니다.
 특징으로 멱등성, 지속적인 배포, 보안 및 신뢰성에 크게 중점을 두고 있고 사용자 친화적으로 분산 구조 설계가 가능합니다.
 장점으로 역시 YAML 언어로 구성이 가능해 쉽고 단순한 구조로 접근성, 가독성이 높으며 변수 기능으로 재사용성을 크게 끌어올릴 수 있다는 점입니다.
 그에 따른 단점은 다른 인프라 관리 도구에 비해 덜 강력하다는 점, DSL로 로직을 수행하기 때문에 수시로 문서 확인을 하며 점검해야하는 점, 변수를 사용하나 확인이 어려워 복잡성이 증가되는 점, 개별 파일마다 형식의 일관성이 없는 점, 위 문제들의 복합적인 문제로 성능 속도가 저하되는 점 등이 있습니다.

3. Openstack-Ansible

 따라서 Openstack의 개별 노드마다 사용자가 직접 설정함으로 일관성을 해칠 가능성을 배제하며 구축의 난이도를 낮추기 위한 방안으로 Ansible와 결합된 Openstack-Ansible 프로젝트가 Openstack Mitaka (Ver. 13)부터 시작되었습니다.

 장점으로는 인프라, 벤더 별로 나누어진 모듈들에 대한 일관성을 상대적으로 높일 수 있고 동일 구성 노드에 대한 추가, 삭제가 매우 용이하다는 점입니다. 또한, 상대적으로 강력한 Openstack으로 인해 Ansible의 단점인 약한 퍼포먼스가 보완됩니다. 빠른 검증을 위한 AIO(All-in One) 툴을 제공하는 것도 특징입니다.

 역시 단점 또한 존재하는데, Openstack의 구축 난이도가 상당히 낮춰졌으나 YAML 파일 작성법 등 사용이 어느정도 숙지되어야 하는 점이 있으며, 전반적으로 구성을 사전에 계획적으로 진행해야 합니다. 그에 따라 사용중인 모듈에 대한 추가, 삭제에 어려움이 있을 수 있으며 구성 변경 시 고려해야 하는 사항이 기존에 비해 많습니다.

 상기한 단점을 감안하더라도 Openstack-Ansible은 매력적인 도구로 생각되며, 다양한 활용 방안을 생각해 볼 수 있을 것 같습니다.

4. 구성 요소

Openstack-Ansible의 구성 요소는 다음과 같습니다.

필수

 – Deployment Host

 – Infrastructure Control Plane Host

선택

 – Log Server

 – Compute Host

 – NAS

"</p

 

권장 구성은 위의 그림과 같으며 상황에 맞추어 변동이 있을 수 있습니다.

이 중 가장 기반이 되는 Deployment Host 는 최소 사양이 다음과 같습니다.

 

HW 요구 사항

 – 8 CPU

 – 16 GB Memory

 – 80GB 이상의 디스크 용량

 

SW 요구 사항 (Openstack Bobcat / 2023.05 Release 기준)

 – SSH

 – Python 3.8.x / Python 3.10.x

 – locale en.US_UTF8

 

테스트는 상기 요구 사항을 준수하여 진행되었으나 이번 게시글에서는 별도의 구축 테스트는 설명하지 않으니 참고 부탁드리겠습니다.

동일한 내용은 https://docs.openstack.org/openstack/openstack-ansible  에서 확인 가능합니다.

 

AIO  설치과정

Openstack-Ansible Installation Flow

그림과 같이 Deployment host와 Target hosts를 먼저 준비하고 deployment 설정을 진행한 후

Ansible playbook을 실행하여 Openstack operation 검증하는 과정을 거쳐 Openstack을 사용할 수 있게 합니다.

지원하는 OS는 SUSE, Rocky 8/9(구  CentOS), Ubuntu 20/22.04 를 각각 지원합니다.

개인적으로 테스트를 진행은 Rocky 9을 Deployment Host의 OS로 사용하였으나, 하단에 기술될 YAML 파일에서는 어느 OS를 사용하여도 무방합니다.

 

5. openstack_user_config

구축 과정 중 필수로 준비되어야 하는 openstack_user_config.yml YAML 파일에 대해 알아보겠습니다.

이 파일에서는 Openstack를 구성하는 모듈에 대해서 구술된 YAML 파일로 최초 Openstack-ansible 설치 시 example 파일로 확인할 수 있습니다.

설명은 구간별로 진행됩니다.

 


 

(1) Networks

 

cidr_networks: 
    container: 172.29.236.0/22
    tunnel: 172.29.240.0/22
    used_ips: 172.29.244.0/22
    snet: 172.29.248.0/22

used_ips:
  - 172.29.236.1
  - "172.29.236.100,172.29.236.200"
  - "172.29.240.100,172.29.240.200"
  - "172.29.244.100,172.29.244.200"
provider_networks:
  - network:
    group_binds:
      - all_containers
      - hosts
    type: "raw"
    container_bridge: "br-mgmt"
    container_interface: "eth1"
    container_type: "veth"
    ip_from_q: "management"
    is_management_address: true
  - network:
    group_binds:
      - glance_api
      - cinder_api
      - cinder_volume
      - nova_compute
    type: "raw"
    container_bridge: "br-storage"
    container_type: "veth"
    container_interface: "eth2"
    container_mtu: "9000"
    ip_from_q: "storage"
  - network:
    group_binds:
      - neutron_linuxbridge_agent
    container_bridge: "br-vxlan"
    container_type: "veth"
    container_interface: "eth10"
    container_mtu: "9000"
    ip_from_q: "tunnel"
    type: "vxlan"
    range: "1:1000"
    net_name: "vxlan"
  - network:
    group_binds:
      - neutron_linuxbridge_agent
    container_bridge: "br-vlan"
    container_type: "veth"
    container_interface: "eth11"
    type: "vlan"
    range: "101:200,301:400"
    net_name: "vlan"
  - network:
    group_binds:
      - neutron_linuxbridge_agent
    container_bridge: "br-vlan"
    cont ainer_type: "veth"
    container_interface: "eth12"
    host_bind_override: "eth12"
    type: "flat"
    net_name: "flat"

 

nova, neutron의 네트워크 관련 설정으로 

각각 사용 용도에 맞추어 Deployment용 네트워크, Storage용 네트워크, 클라우드용 네트워크로 구분되었습니다.

group_bind 항목으로 모듈에 대한 관리가 이루어짐을 확인할 수 있습니다.

 

(2) Infrastructure

 

shared-infra_hosts:4
  infra1:
    ip: 172.29.236.101
  infra2:
    ip: 172.29.236.102
  infra3:
    ip: 172.29.236.103

repo-infra_hosts:
  infra1:
    ip: 172.29.236.101
  infra2:
    ip: 172.29.236.102
  infra3:
    ip: 172.29.236.103


coordination_hosts:
  infra1:
    ip: 172.29.236.101
  infra2:
    ip: 172.29.236.102
  infra3:
    ip: 172.29.236.103

os-infra_hosts:
  infra1:
    ip: 172.29.236.101
  infra2:
    ip: 172.29.236.102
  infra3:
    ip: 172.29.236.103

identity_hosts:
  infra1:
    ip: 172.29.236.101
  infra2:
    ip: 172.29.236.102
  infra3:
    ip: 172.29.236.103
 
network_hosts:
  infra1:
    ip: 172.29.236.101
  infra2:
    ip: 172.29.236.102
  infra3:
    ip: 172.29.236.103


network-infra_hosts:
  infra1:
    ip: 172.29.236.101
  infra2:
    ip: 172.29.236.102
  infra3:
    ip: 172.29.236.103

network-agent_hosts:
  net1:
    ip: 172.29.236.201
  net2:
    ip: 172.29.236.202
  net3:
    ip: 172.29.236.203

compute_hosts:
  compute1:
    ip: 172.29.236.121

storage-infra_hosts:
  infra1:
    ip: 172.29.236.101
  infra2:
    ip: 172.29.236.102
  infra3:
    ip: 172.29.236.103

storage_hosts:
  lvm-storage1:
    ip: 172.29.236.131

host의 IP 설정 구간입니다. 각각 101~103까지 Infra host에 할당하고 모듈마다 묶어주었습니다.

Deployment host는 별도로 분리하여 작성된 점 확인할 수 있습니다.

 

(3) Storage

container_vars:
  cinder_storage_availability_zone: cinderAZ_1
  cinder_default_availability_zone: cinderAZ_1
  cinder_backends:
    lvm:
      volume_backend_name: LVM_iSCSI
      volume_driver: cinder.volume.drivers.lvm.LVMVolumeDriver
      volume_group: cinder-volumes
      iscsi_ip_address: "{{ cinder_storage_address }}"
      limit_container_types: cinder_volume

container_vars:
  cinder_storage_availability_zone: cinderAZ_2
  cinder_default_availability_zone: cinderAZ_1
  cinder_backends:
    netapp:
      volume_backend_name: NETAPP_iSCSI
      volume_driver: cinder.volume.drivers.netapp.common.NetAppDriver
      netapp_storage_family: ontap_7mode
      netapp_storage_protocol: iscsi
      netapp_server_hostname: hostname
      netapp_server_port: 443
      netapp_login: username
      netapp_password: password

container_vars:
  cinder_storage_availability_zone: cinderAZ_2
  cinder_default_availability_zone: cinderAZ_1
  cinder_backends:
  limit_container_types: cinder_volume
    qnap:
      volume_backend_name: "QNAP 1 VOLUME"
      volume_driver: cinder.volume.drivers.qnap.QnapISCSIDriver
      qnap_management_url : http://10.10.10.5:8080
      qnap_poolname: "Storage Pool 1"
      qnap_storage_protocol: iscsi
      qnap_server_port: 8080
      iscsi_ip_address: 172.29.244.5
      san_login: username
      san_password: password
      san_thin_provision: True

container_vars:
  cinder_storage_availability_zone: cinderAZ_3
  cinder_default_availability_zone: cinderAZ_1
  cinder_backends:
  limit_container_types: cinder_volume
    volumes_hdd:
      volume_driver: cinder.volume.drivers.rbd.RBDDriver
      rbd_pool: volumes_hdd
      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
      volume_backend_name: volumes_hdd
      rbd_user: "{{ cinder_ceph_client }}"
      rbd_secret_uuid: "{{ cinder_ceph_client_uuid }}"
  

container_vars:
  manila_default_share_type: cephfs1
  manila_backends:
    cephfs1:
      driver_handles_share_servers: False
      share_backend_name: CEPHFS1
      share_driver: manila.share.drivers.cephfs.driver.CephFSDriver
      cephfs_conf_path: /etc/ceph/ceph.conf
      cephfs_auth_id: manila
      cephfs_cluster_name: ceph
      cephfs_enable_snapshots: False
      filter_function: "share.size >= 0"
      goodness_function: "share.size >= 0"

container_vars:
  manila_default_share_type: cephfsnfs1
  manila_backends:
    cephfsnfs1:
      driver_handles_share_servers: False
      share_backend_name: CEPHFSNFS1
      share_driver: manila.share.drivers.cephfs.driver.CephFSDriver
      cephfs_ganesha_server_ip: 172.16.24.200
      cephfs_protocol_helper_type: NFS
      cephfs_conf_path: /etc/ceph/ceph.conf
      cephfs_auth_id: manila
      filter_function: "share.size >= 0"
      goodness_function: "share.size >= 0"

container_vars:
  manila_default_share_type: nfs-share1
  manila_backends:
    nfs-share1:
      share_backend_name: NFS_SHARE1
      share_driver: manila.share.drivers.lvm.LVMShareDriver
      driver_handles_share_servers: False
      lvm_share_volume_group: manila-shares
      lvm_share_export_ips: 10.1.1.1
      filter_function: "share.size >= 0"
      goodness_function: "share.size >= 0"
  
container_vars:
  manila_default_share_type: generic
  manila_backends:
    generic:
      share_backend_name: GENERIC
      share_driver: manila.share.drivers.generic.GenericShareDriver
      driver_handles_share_servers: True
      service_instance_flavor_id: 100
      service_image_name: manila-service-image
      service_instance_user: manila
      service_instance_password: manila
      interface_driver: manila.network.linux.interface.BridgeInterfaceDriver
      filter_function: "share.size >= 0"
      goodness_function: "share.size >= 0"

Storage는 가용 가능한 모듈들이 전부 작성되어 있으며, 크게 iscsi , ceph, manila로 구성 가능한 점 확인할 수 있습니다.

이런 스토리지 플랫폼을 cinder와 연동하여 구성하도록 작성되어 있으며, 별도의 가용영역을 구별하여 동시에 선택할 수 있는 점이 눈에 띕니다.

 

 

(4) HA Proxy

haproxy_hosts:
  lb1:
    ip: 172.29.236.100
  lb2:
    ip: 172.29.236.101

in ``user_variables.yml``:
  haproxy_keepalived_external_vip_cidr: 192.168.0.4/25
  haproxy_keepalived_internal_vip_cidr: 172.29.236.54/16
  haproxy_keepalived_external_interface: br-flat
  haproxy_keepalived_internal_interface: br-mgmt

추가로 이중화 구성을 위해 HA Proxy, Keepalived가 기본 구성으로 포함되어 있습니다.

nat 구성에 따라 별도의 interface를 할당 또한 지원합니다.

 

6. 정리

Ansible의 장점인 다양한 Inventory로 인한 모듈 제공 및 사용성 , Openstack의 높은 호환성과 구현력이 합쳐져 시너지를 낼 수 있게 도와주는 어플리케이션이라고 보여집니다.  

  물론 Puppet, Chef 등의 다른 관리 시스템 사용, 혹은 100%의 Application Container로 Openstack을 배포하고자 하는 경우, deb나 rpm으로 서비스 배포를 시도하는 경우에는 적합하지 않을 수 있다고 Openstack-Ansible 가이드 문서에서도 명시가 되어 있는 사항임으로 반드시 선택 전 고려를 해야합니다.

 허나 LXC Container를 이용하여 상대적으로 적은 코드로 Openstack의 배포를 하고자 하는 경우 Openstack-Ansible은 좋은 선택이 될 수 있을듯 합니다.

 다음 글에서는 상기 작성된 YAML 파일을 포함하여 구축 방법에 대해 상세히 알아보고 운영 방법, 활용법에 대해 알아보겠습니다.

 

감사합니다.

 

 

 

 

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x