Kuruluma başlamadan önce DevStack kurulumunun yapılmış olması ve Heat servisinin aktif olması gerekmektedir. Eğer hali hazırda bir kurulumunuz yoksa bu ve bu dökümandan yararlanabilirsiniz.
Neutron-LBaaS servisini kurmamız için local.conf dosyamıza aşağıdaki satırı eklemeliyiz.
enable_service q-lbaas
enable_plugin neutron-lbaas https://opendev.org/openstack/neutron-lbaas liberty-eol
Eğer bir önceki dökümantasyondan takip ediyorsanız local.conf dosyası aşağıdaki gibi olmalıdır.
[[local|localrc]]
ADMIN_PASSWORD=secret
DATABASE_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD
SERVICE_TOKEN=$ADMIN_PASSWORD
HOST_IP=127.0.0.1
SERVICE_HOST=$HOST_IP
MYSQL_HOST=$HOST_IP
RABBIT_HOST=$HOST_IP
GLANCE_HOSTPORT=$HOST_IP:9292
FORCE=yes
disable_service n-net
enable_service q-svc, q-agt, q-dhcp, q-l3, q-meta, neutron, h-eng, h-api, h-api-cfn, h-api-cw, q-lbaas
enable_plugin ceilometer https://opendev.org/openstack/ceilometer liberty-eol
enable_plugin murano https://opendev.org/openstack/murano liberty-eol
enable_plugin neutron-lbaas https://opendev.org/openstack/neutron-lbaas liberty-eol
Ardından ./stack.sh yaparak DevStack’ı başlatmalıyız.
NOT: Daha önce DevStack çalıştırdıysanız lütfen ./unstack.sh yaparak sonlandırınız.
$ source /opt/stack/devstack/openrc
$ openstack service list
+----------------------------------+-------------+---------------------+
| ID | Name | Type |
+----------------------------------+-------------+---------------------+
| 28ad3cc5dbf2415b91b70c36b2b21ca9 | nova_legacy | compute_legacy |
| 297f628ea0db4992a7b611f1a209d6c8 | cinderv2 | volumev2 |
| 30c9824725234e7ea145fa7d4fe314e6 | keystone | identity |
| 33598d57d0294237a13bde9377840962 | ceilometer | metering |
| 5305c4a4013e42928241ea834a938dd2 | heat | orchestration |
| 5cd51845c37147d7bb5f5118c3ccec88 | neutron | network |
| a77373b2b9bc402ab131ca76cbc6e430 | heat-cfn | cloudformation |
| c746ec687af541fcae5d2c9e2a63eebd | nova | compute |
| d375d124eec4411f9bf65b17c9eab930 | cinder | volume |
| ed99d8aacef341bbb3884b5781fab808 | glance | image |
| fcceae7169ef48388a3f3ad6f850a530 | ec2 | ec2 |
| fcf142fae33c46be8b02bac94d97b72b | murano | application_catalog |
+----------------------------------+-------------+---------------------+
$ neutron agent-list
+--------------------------------------+--------------------+----------------+-------+----------------+---------------------------+
| id | agent_type | host | alive | admin_state_up | binary |
+--------------------------------------+--------------------+----------------+-------+----------------+---------------------------+
| 1feaa893-4023-4d91-958c-067524fa3578 | DHCP agent | openstack-test | :-) | True | neutron-dhcp-agent |
| 44901ff3-204e-4fd7-b9bb-d2f7e2f6e673 | Metadata agent | openstack-test | :-) | True | neutron-metadata-agent |
| a7754993-97b4-4888-9e6c-36c656e8bff1 | Loadbalancer agent | openstack-test | :-) | True | neutron-lbaas-agent |
| d8e1c627-c456-4244-be19-be63d6aec633 | Open vSwitch agent | openstack-test | :-) | True | neutron-openvswitch-agent |
| daa5c55f-b294-4d72-bdbd-b838c07aef43 | L3 agent | openstack-test | :-) | True | neutron-l3-agent |
+--------------------------------------+--------------------+----------------+-------+----------------+---------------------------+
Yük dağıtımından önce ölçeklendirmeyi düşündüğümüz imajı Glance servisimize tanıtmalı, oluşacak örneğe bağlanabilmek için bir ssh-keypair oluşturmalı ve ssh portuna (22) izin vermeliyiz. Bu işlemleri buradan yararlanarak yaptığınızı varsayıp 80 portuna izin vermeli, bir havuz (load balancer pool) oluşturmalı, havuzumuza bir izleyici (health monitor) ve VIP adresi ataması yapmalıyız.
$ openstack security group rule create default --proto tcp --dst-port 80:80
+-----------------+--------------------------------------+
| Field | Value |
+-----------------+--------------------------------------+
| group | {} |
| id | 72a5y8q2-vtes-6351-7331-273j223e43y8 |
| ip_protocol | tcp |
| ip_range | 0.0.0.0/0 |
| parent_group_id | d10575a4-c1e6-4432-b140-ffd4237d732a |
| port_range | 80:80 |
+-----------------+--------------------------------------+
$ neutron subnet-list
+--------------------------------------+---------------------+---------------------+-------------------------------------------------------------------------------+
| id | name | cidr | allocation_pools |
+--------------------------------------+---------------------+---------------------+-------------------------------------------------------------------------------+
| 78c4c118-7fe5-48ae-b43b-ec230f137dca | ipv6-public-subnet | 2001:db8::/64 | {"start": "2001:db8::1", "end": "2001:db8::1"} |
| | | | {"start": "2001:db8::3", "end": "2001:db8::ffff:ffff:ffff:ffff"} |
| 69b0bb16-f607-4e38-a87f-c8faf22308b4 | ipv6-private-subnet | fd1c:b67b:e08d::/64 | {"start": "fd1c:b67b:e08d::2", "end": "fd1c:b67b:e08d:0:ffff:ffff:ffff:ffff"} |
| 90e76808-bedb-4e4f-8cb1-bfbc17ffddb9 | public-subnet | 172.24.4.0/24 | {"start": "172.24.4.2", "end": "172.24.4.254"} |
| 1e79d4aa-2da3-49b0-a790-d574a6726194 | private-subnet | 10.0.0.0/24 | {"start": "10.0.0.2", "end": "10.0.0.254"} |
+--------------------------------------+---------------------+---------------------+-------------------------------------------------------------------------------+
$ neutron lb-pool-create --name lbpool --subnet-id 1e79d4aa-2da3-49b0-a790-d574a6726194 --protocol HTTP --lb-method ROUND_ROBIN
+------------------------+--------------------------------------+
| Field | Value |
+------------------------+--------------------------------------+
| admin_state_up | True |
| description | |
| health_monitors | |
| health_monitors_status | |
| id | 96706076-a01c-46ff-8204-e399be10bf0a |
| lb_method | ROUND_ROBIN |
| members | |
| name | lbpool |
| protocol | HTTP |
| provider | haproxy |
| status | PENDING_CREATE |
| status_description | |
| subnet_id | 1e79d4aa-2da3-49b0-a790-d574a6726194 |
| tenant_id | 9d1b17cbcd4b406e8be71e169f503506 |
| vip_id | |
+------------------------+--------------------------------------+
$ neutron lb-healthmonitor-create --delay 3 --max-retries 3 --timeout 3 --type HTTP
+----------------+--------------------------------------+
| Field | Value |
+----------------+--------------------------------------+
| admin_state_up | True |
| delay | 3 |
| expected_codes | 200 |
| http_method | GET |
| id | 9d34f365-92ee-4d3c-ba13-c57fb96fa006 |
| max_retries | 3 |
| pools | |
| tenant_id | 9d1b17cbcd4b406e8be71e169f503506 |
| timeout | 3 |
| type | HTTP |
| url_path | / |
+----------------+--------------------------------------+
$ neutron lb-healthmonitor-associate 9d34f365-92ee-4d3c-ba13-c57fb96fa006 lbpool
Associated health monitor 9d34f365-92ee-4d3c-ba13-c57fb96fa006
$ neutron lb-vip-create --name lbvip --protocol-port 80 --protocol HTTP --subnet-id 1e79d4aa-2da3-49b0-a790-d574a6726194 lbpool
+---------------------+--------------------------------------+
| Field | Value |
+---------------------+--------------------------------------+
| address | 10.0.0.27 |
| admin_state_up | True |
| connection_limit | -1 |
| description | |
| id | 65d16d29-5c61-43fb-b37b-7e01a1cc9cc7 |
| name | lbvip |
| pool_id | 96706076-a01c-46ff-8204-e399be10bf0a |
| port_id | 1bc93413-c869-4094-9f4a-7465281d2422 |
| protocol | HTTP |
| protocol_port | 80 |
| session_persistence | |
| status | PENDING_CREATE |
| status_description | |
| subnet_id | 1e79d4aa-2da3-49b0-a790-d574a6726194 |
| tenant_id | 9d1b17cbcd4b406e8be71e169f503506 |
+---------------------+--------------------------------------+
Artık yük dağıtımı için hazırız.
Bu adımda Heat ve Neutron-LBaaS servislerinden yararlanarak yük dağıtımı yapacağız. Amacımız CPU için yüzdesel olarak belirteceğimiz eşik değerleri aşıldığında Heat servisinin otomatik olarak reaksiyon alıp yeni bir örnek başlatması, bu örneğin yük dağıtıcımıza eklenmesi ve yükün eşit olarak dağıtılması.
ubuntu.yaml ve scaler.yaml adında iki dosya oluşturmalı ve aşağıdaki satırları oluşturduğumuz dosyalara yapıştırmalıyız. Bu işlemin ardından elimizde bulunan iki config dosyasını aynı dizine taşımalıyız.
ubuntu.yaml
heat_template_version: 2015-10-15
description: Ubuntu-14.04 server
parameters:
lbpool_id:
type: string
resources:
server:
type: OS::Nova::Server
properties:
image: Ubuntu-14.04
key_name: sshKey
flavor: m1.small
networks:
- port: { get_resource: port }
user_data_format: RAW
user_data:
str_replace:
template: |
#!/bin/bash
sudo -i
echo "nameserver 8.8.8.8" | tee -a /etc/resolv.conf
apt-get -y install apache2
iptables -I INPUT 1 -p tcp -m tcp --dport 80 -j ACCEPT -m comment --comment "Apache server access on HTTP port 80"
ifconfig eth0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1 > /var/www/html/index.html
params:
empty_param: empty
port:
type: OS::Neutron::Port
properties:
network: private
security_groups:
- default
floating_ip:
type: OS::Neutron::FloatingIP
properties:
floating_network: public
floating_ip_assoc:
type: OS::Neutron::FloatingIPAssociation
properties:
floatingip_id: { get_resource: floating_ip }
port_id: { get_resource: port }
pool_member:
type: OS::Neutron::PoolMember
properties:
address: { get_attr: [server, networks, private, 1] }
pool_id: { get_param: lbpool_id }
protocol_port: 80
NOT: ubuntu.yaml dosyasında otomatik olarak oluşacak örneklerin özellikleri yer almaktadır.
scaler.yaml
heat_template_version: 2015-10-15
description: Auto scaling
parameters:
pool_id:
type: string
resources:
server_group:
type: OS::Heat::AutoScalingGroup
properties:
cooldown: 60
desired_capacity: 1
max_size: 3
min_size: 1
resource:
type: ubuntu.yaml
properties:
lbpool_id: { get_param: pool_id }
scaleup_policy:
type: OS::Heat::ScalingPolicy
properties:
adjustment_type: change_in_capacity
auto_scaling_group_id: { get_resource: server_group }
cooldown: 60
scaling_adjustment: 1
scaledown_policy:
type: OS::Heat::ScalingPolicy
properties:
adjustment_type: change_in_capacity
auto_scaling_group_id: { get_resource: server_group }
cooldown: 60
scaling_adjustment: -1
cpu_alarm_high:
type: OS::Ceilometer::Alarm
properties:
meter_name: cpu_util
statistic: avg
period: 120
evaluation_periods: 1
threshold: 50
alarm_actions:
- {get_attr: [scaleup_policy, alarm_url]}
comparison_operator: gt
cpu_alarm_low:
type: OS::Ceilometer::Alarm
properties:
meter_name: cpu_util
statistic: avg
period: 180
evaluation_periods: 1
threshold: 10
alarm_actions:
- {get_attr: [scaledown_policy, alarm_url]}
comparison_operator: lt
NOT: scaler.yaml dosyası auto scaling için config dosyasıdır.
$ mkdir scaling
$ mv ubuntu.yaml ./scaling/ubuntu.yaml
$ mv scaler.yaml ./scaling/scaler.yaml
YAML dosyalarının ilk versiyonlarını otomatik ölçeklendirme yaparken oluşturmuştuk. Buradaki fark ise otomatik ölçeklendirme yapılırken oluşan yeni örneğin (instance) yük dağıtımı havuzuna eklenmesi ve otomatik olarak Apache'nin kurulmasıdır. Böylece uygulamamıza gelen yük artık yeni örneğe de gönderilecektir.
Heat servisimizi başlatacağız ve yük dağılımımızı inceleyeceğiz.
NOT: Ceilometer servisi hali hazırda yapılandırılmış kabul edilecektir. Lütfen bu dökümandaki yapılandırmaya sahip olduğunuzdan emin olun.
$ heat stack-create scaler -f ./scaler.yaml -P pool_id=96706076-a01c-46ff-8204-e399be10bf0a
+--------------------------------------+------------+--------------------+---------------------+--------------+
| id | stack_name | stack_status | creation_time | updated_time |
+--------------------------------------+------------+--------------------+---------------------+--------------+
| a622a3af-b070-4324-be3c-d87ade291c5c | scaler | CREATE_IN_PROGRESS | 2019-08-09T13:02:08 | None |
+--------------------------------------+------------+--------------------+---------------------+--------------+
$ openstack server list
+--------------------------------------+-------------------------------------------------------+--------+----------------------------------------------------------------------+
| ID | Name | Status | Networks |
+--------------------------------------+-------------------------------------------------------+--------+----------------------------------------------------------------------+
| 9989ed73-d261-488e-bdbc-379631cf559b | sc-tsjl-6by2pjh7cjtq-4eofa45aizxd-server-jde2cs4iyfqa | BUILD | private=fd1c:b67b:e08d:0:f816:3eff:fe30:946e, 10.0.0.28, 172.24.4.22 |
+--------------------------------------+-------------------------------------------------------+--------+----------------------------------------------------------------------+
$ neutron lb-member-list
+--------------------------------------+-----------+---------------+--------+----------------+----------------+
| id | address | protocol_port | weight | admin_state_up | status |
+--------------------------------------+-----------+---------------+--------+----------------+----------------+
| cd027e28-0db7-41c8-894d-9427e54d5284 | 10.0.0.28 | 80 | 1 | True | PENDING_CREATE |
+--------------------------------------+-----------+---------------+--------+----------------+----------------+
Yaklaşık 20 dakikanın ardından ilk örneğimiz tamamen aktif olduğunda örneğimize ssh ile bağlanıp yük bindirmeliyiz. Ardından ikinci örneğimiz için de belirli bir süre (ortalama 20 dakika) bekledikten sonra yük dağıtıcımızda iki üyemiz bulunması gerekiyor.
NOT: Yük bindirme adımı bu dökümanda anlatıldığı için yeniden değinilmemiştir.
$ openstack server list
+--------------------------------------+-------------------------------------------------------+--------+----------------------------------------------------------------------+
| ID | Name | Status | Networks |
+--------------------------------------+-------------------------------------------------------+--------+----------------------------------------------------------------------+
| 03b17d8f-e4bd-4679-8503-aa98b17bfc80 | sc-tsjl-lomot6yswfmn-mijvlbvf5xcj-server-jflbdabcds6a | ACTIVE | private=fd1c:b67b:e08d:0:f816:3eff:fe82:142d, 10.0.0.29, 172.24.4.23 |
| 9989ed73-d261-488e-bdbc-379631cf559b | sc-tsjl-6by2pjh7cjtq-4eofa45aizxd-server-jde2cs4iyfqa | ACTIVE | private=fd1c:b67b:e08d:0:f816:3eff:fe30:946e, 10.0.0.28, 172.24.4.22 |
+--------------------------------------+-------------------------------------------------------+--------+----------------------------------------------------------------------+
$ neutron lb-member-list
+--------------------------------------+-----------+---------------+--------+----------------+----------+
| id | address | protocol_port | weight | admin_state_up | status |
+--------------------------------------+-----------+---------------+--------+----------------+----------+
| cd027e28-0db7-41c8-894d-9427e54d5284 | 10.0.0.28 | 80 | 1 | True | ACTIVE |
| d2766a0b-46d7-4f66-8533-85ae36e74675 | 10.0.0.29 | 80 | 1 | True | ACTIVE |
+--------------------------------------+-----------+---------------+--------+----------------+----------+
Her şey hazır. Son olarak yük dağıtıcımızın vip adresine istek göndermeliyiz.
$ curl 10.0.0.27
10.0.0.28
$ curl 10.0.0.27
10.0.0.29
$ curl 10.0.0.27
10.0.0.28
$ curl 10.0.0.27
10.0.0.29
Görüldüğü gibi yük dağıtıcımıza gelen istekler sırasıyla iki örneğimize dağıtılmaktadır.
Bu dökümanda otomatik ölçeklendirme yaparak oluşan örneklerimizi yük dağıtımı için kullandık. Fakat bu kullanımı DevStack Liberty için önermemekteyim. Sebebi için DevStack Liberty versiyonu hakkındaki son dökümanımı inceleyebilirsiniz.