본문 바로가기
Openstack

오픈스택: octavia

by 왈레 2023. 4. 10.

컨트롤러 노드에서 진행

옥타비아 설치 이후 검증은 바빠서 못했습니다...

참고용도로만 사용해주세요.

 

$ mysql
> CREATE DATABASE octavia;
> GRANT ALL PRIVILEGES ON octavia.* TO 'octavia'@'localhost' IDENTIFIED BY 'a';
> GRANT ALL PRIVILEGES ON octavia.* TO 'octavia'@'%' IDENTIFIED BY 'a';
> exit

# 유저 생성 및 도메인 연결 및 admin 권한부여
$ openstack user create --domain default --password-prompt octavia # a 비밀번호
$ openstack role add --project service --user octavia admin

# 서비스 추가
$ openstack service create --name octavia --description "OpenStack Octavia" load-balancer

# API 엔드포인트 추가 (주의: 전부 managment IP인 10점대 영역으로 ip를 설정)
$ openstack endpoint create --region RegionOne load-balancer admin 
$ openstack endpoint create --region RegionOne load-balancer internal 
$ openstack endpoint create --region RegionOne load-balancer public 

# octavia-openrc 파일 생성
$ vi /etc/keystone/octavia-openrc
export OS_PROJECT_DOMAIN_NAME=Default
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_NAME=service
export OS_USERNAME=octavia
export OS_PASSWORD=a
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
export OS_VOLUME_API_VERSION=3

# 암포라 이미지 만들기
참고 : <https://www.server-world.info/en/note?os=Ubuntu_22.04&p=openstack_zed4&f=3>

$ snap install octavia-diskimage-retrofit --beta --devmode
$ cd /var/snap/octavia-diskimage-retrofit/common/tmp
$ wget <https://cloud-images.ubuntu.com/minimal/releases/focal/release/ubuntu-20.04-minimal-cloudimg-amd64.img>
$ octavia-diskimage-retrofit ubuntu-20.04-minimal-cloudimg-amd64.img ubuntu-amphora-haproxy-amd64.qcow2

octavia-diskimage-retrofit란?
"octavia-diskimage-retrofit"은 가상머신 디스크 이미지 변환 도구인 "diskimage-retrofit"을
사용하여 OpenStack Octavia 로드밸런서를 위해 디스크 이미지를 수정하는 것을 자동화하는 Python
스크립트입니다. 이 도구는 OpenStack 환경에서 Octavia의 새로운 버전을 배포하거나 이미지를
업그레이드 할 때 사용될 수 있습니다.

# octavia 계정으로 변경
$ . /etc/keystone/octavia-openrc

# 암포라 이미지 업로드
$ openstack image create \\
  --disk-format qcow2 \\
  --container-format bare \\
  --tag amphora \\
  --file ubuntu-amphora-haproxy-amd64.qcow2 \\
  --private \\
  --project service \\
  amphora-x64-haproxy

# 암포라 Flaovr 생성
$ openstack flavor create \\
  --id 200 \\
  --vcpus 1 \\
  --ram 1024 \\
  --disk 5 \\
  --private \\
  --project service \\
  amphora

# 패키지 설치
$ apt install octavia-api octavia-health-manager octavia-housekeeping \\
  octavia-worker python3-octavia python3-octaviaclient

# LoadBalancer 인스턴스와 Octavia 서비스 간에 사용되는 인증서 생성
$ cd
$ git clone <https://opendev.org/openstack/octavia.git> -b stable/zed
$ cd octavia/bin/
$ source create_dual_intermediate_CA.sh
$ sudo mkdir -p /etc/octavia/certs/private
$ sudo chmod 755 /etc/octavia -R
$ sudo cp -p etc/octavia/certs/server_ca.cert.pem /etc/octavia/certs
$ sudo cp -p etc/octavia/certs/server_ca-chain.cert.pem /etc/octavia/certs
$ sudo cp -p etc/octavia/certs/server_ca.key.pem /etc/octavia/certs/private
$ sudo cp -p etc/octavia/certs/client_ca.cert.pem /etc/octavia/certs
$ sudo cp -p etc/octavia/certs/client.cert-and-key.pem /etc/octavia/certs/private

# 키페어 생성
$ ssh-keygen
$ openstack keypair create --public-key ~/.ssh/id_rsa.pub mykey

# 보안 그룹 및 보안 규칙 생성
$ openstack security group create lb-mgmt-sec-grp
$ openstack security group rule create --protocol icmp --ingress lb-mgmt-sec-grp
$ openstack security group rule create --protocol tcp --dst-port 22 lb-mgmt-sec-grp
$ openstack security group rule create --protocol tcp --dst-port 80 lb-mgmt-sec-grp
$ openstack security group rule create --protocol tcp --dst-port 443 lb-mgmt-sec-grp
$ openstack security group rule create --protocol tcp --dst-port 9443 lb-mgmt-sec-grp

$ openstack security group create lb-health-mgr-sec-grp
$ openstack security group rule create --protocol udp --dst-port 5555 lb-health-mgr-sec-grp

# dhclient용 dhclient.conf 파일 생성
$ sudo mkdir -m755 -p /etc/dhcp/octavia
$ sudo cp octavia/etc/dhcp/dhclient.conf /etc/dhcp/octavia

# Octavia 전용 네트워크 만들기
$ OCTAVIA_MGMT_SUBNET=10.0.6.0/24
$ OCTAVIA_MGMT_SUBNET_START=10.0.6.10
$ OCTAVIA_MGMT_SUBNET_END=10.0.6.254
$ OCTAVIA_MGMT_PORT_IP=10.0.6.2 # octavia.conf [health_manager]섹션의 bind_ip

$ openstack network create lb-mgmt-net
$ openstack subnet create --subnet-range $OCTAVIA_MGMT_SUBNET --allocation-pool \\
  start=$OCTAVIA_MGMT_SUBNET_START,end=$OCTAVIA_MGMT_SUBNET_END \\
  --network lb-mgmt-net lb-mgmt-subnet

$ SUBNET_ID=$(openstack subnet show lb-mgmt-subnet -f value -c id)
$ PORT_FIXED_IP="--fixed-ip subnet=$SUBNET_ID,ip-address=$OCTAVIA_MGMT_PORT_IP"

$ MGMT_PORT_ID=$(openstack port create --security-group \\
  lb-health-mgr-sec-grp --device-owner Octavia:health-mgr \\
  --host=$(hostname) -c id -f value --network lb-mgmt-net \\
  $PORT_FIXED_IP octavia-health-manager-listen-port)

$ MGMT_PORT_MAC=$(openstack port show -c mac_address -f value $MGMT_PORT_ID)

$ sudo ip link add o-hm0 type veth peer name o-bhm0
$ NETID=$(openstack network show lb-mgmt-net -c id -f value)
$ BRNAME=brq$(echo $NETID|cut -c 1-11)
$ sudo brctl addif $BRNAME o-bhm0
$ sudo ip link set o-bhm0 up

$ sudo ip link set dev o-hm0 address $MGMT_PORT_MAC
$ sudo iptables -I INPUT -i o-hm0 -p udp --dport 5555 -j ACCEPT
$ sudo dhclient -v o-hm0 -cf /etc/dhcp/octavia

# host가 reboot 된 후에도 veth pair를 생성하기 위한 설정
veth pair는 가상 이더넷 인터페이스(virtual Ethernet interface)의 한 유형으로,물리적인 두 개의
네트워크 인터페이스처럼 동작하는 쌍을 이루는 가상 인터페이스입니다. veth pair는 두 개의 가상 
인터페이스 중 하나를 호스트 운영 체제의 네트워크 스택과 연결하고, 다른 하나는 가상 머신, 
컨테이너 또는 네트워크 네임스페이스와 연결하여 가상 네트워크를 구성하는 데 사용됩니다.

veth pair는 일반적으로 가상 머신이나 컨테이너와 호스트 운영 체제 간의 통신에 사용되며,
veth pair를 사용하여 가상 머신이나 컨테이너와 호스트 운영 체제 간에 패킷을 전달할 수 있습니다.
이러한 방식으로, veth pair를 사용하여 가상 머신이나 컨테이너를 호스트 운영 체제의 네트워크 
인터페이스와 연결하면, 가상 머신이나 컨테이너가 물리적인 네트워크 인터페이스를 사용하는 것과 
동일한 방식으로 네트워크에 연결될 수 있습니다.

$ vi /etc/systemd/network/o-hm0.network
[Match]
Name=o-hm0

[Network]
DHCP=yes

$ vi /etc/systemd/system/octavia-interface.service
[Unit]
Description=Octavia Interface Creator
Requires=neutron-linuxbridge-agent.service
After=neutron-linuxbridge-agent.service

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/opt/octavia-interface.sh start
ExecStop=/opt/octavia-interface.sh stop

[Install]
WantedBy=multi-user.target

$ vi /opt/octavia-interface.sh
#!/bin/bash

set -ex

MAC=$MGMT_PORT_MAC
BRNAME=$BRNAME

if [ "$1" == "start" ]; then
  ip link add o-hm0 type veth peer name o-bhm0
  brctl addif $BRNAME o-bhm0
  ip link set o-bhm0 up
  ip link set dev o-hm0 address $MAC
  ip link set o-hm0 up
  iptables -I INPUT -i o-hm0 -p udp --dport 5555 -j ACCEPT
elif [ "$1" == "stop" ]; then
  ip link del o-hm0
else
  brctl show $BRNAME
  ip a s dev o-hm0
fi

# config 파일 설정
$ cp /etc/octavia/octavia.conf /etc/octavia/octavia.conf.org
$ grep -E '^[^#].' /etc/octavia/octavia.conf.org > /etc/octavia/octavia.conf
$ vi /etc/octavia/octavia.conf
[DEFAULT]
transport_url = rabbit://openstack:a@controller

[database]
connection = mysql+pymysql://octavia:a@controller/octavia

[oslo_messaging]
topic = octavia_prov

[api_settings]
bind_host = 172.0.0.4
bind_port = 9876
auth_strategy = keystone              
api_base_uri =  

[keystone_authtoken]
www_authenticate_uri = 
auth_url = 
memcached_servers = controller:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = octavia
password = a

[service_auth]
auth_url = 
memcached_servers = controller:11211
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = octavia
password = a

[certificates]
server_certs_key_passphrase = insecure-key-do-not-use-this-key
ca_private_key_passphrase = not-secure-passphrase
ca_private_key = /etc/octavia/certs/private/server_ca.key.pem
ca_certificate = /etc/octavia/certs/server_ca.cert.pem

[haproxy_amphora]
server_ca = /etc/octavia/certs/server_ca-chain.cert.pem
client_cert = /etc/octavia/certs/private/client.cert-and-key.pem

[health_manager]
bind_ip = 10.0.6.2 # OCTAVIA_MGMT_PORT_IP
bind_port = 5555
controller_ip_port_list = 10.0.6.2:5555

[controller_worker]
# amp_ssh_key_name = mykey
# amp_image_owner_id =  # openstack image show amphora-x64-haproxy // owner id 확인
amp_image_tag = amphora # openstack image show amphora-x64-haproxy // tags 확인
amp_secgroup_list = , # openstack security group list
amp_boot_network_list =  # openstack network list
amp_flavor_id = 200 # openstack flavor list

network_driver = allowed_address_pairs_driver
compute_driver = compute_nova_driver
amphora_driver = amphora_haproxy_rest_driver

client_ca = /etc/octavia/certs/client_ca.cert.pem

# 정책 설정(policy.yaml) 및 octavia.conf, policy.yaml 권한 설정
$ vi /etc/octavia/policy.yaml
"context_is_admin": "role:admin or role:load-balancer_admin"
"admin_or_owner": "is_admin:True or project_id:%(project_id)s"
"load-balancer:read": "rule:admin_or_owner"
"load-balancer:read-global": "is_admin:True"
"load-balancer:write": "rule:admin_or_owner"
"load-balancer:read-quota": "rule:admin_or_owner"
"load-balancer:read-quota-global": "is_admin:True"
"load-balancer:write-quota": "is_admin:True"
$ chmod 640 /etc/octavia/octavia.conf /etc/octavia/policy.yaml
$ chgrp octavia /etc/octavia/octavia.conf /etc/octavia/policy.yaml

# DB insert
$ octavia-db-manage --config-file /etc/octavia/octavia.conf upgrade head

# restart 
$ systemctl restart octavia-api octavia-health-manager octavia-housekeeping octavia-worker

$ systemctl status octavia-api
$ systemctl status octavia-health-manager
$ systemctl status octavia-housekeeping
$ systemctl status octavia-worker

 

 

호라이즌에 Octavia UI 추가

$ apt install python3-octavia-dashboard
$ vi /etc/openstack-dashboard/local_settings.py
ENABLE_OCTAVIA_UI = True

$ service apache2 restart
 

'Openstack' 카테고리의 다른 글

오픈스택: magnum  (0) 2023.04.10
오픈스택: heat  (0) 2023.04.10
9. 오픈스택: compute 추가  (0) 2023.04.06
8. 오픈스택: cinder(블록 스토리지) 설치(2)  (0) 2023.04.06
7. 오픈스택: cinder(블록 스토리지) 설치(1)  (0) 2023.04.06

댓글