Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save jova/2c664318bb9bb5a23f3a8cf98831ed08 to your computer and use it in GitHub Desktop.
Save jova/2c664318bb9bb5a23f3a8cf98831ed08 to your computer and use it in GitHub Desktop.

Neutron-LBaaS Servisi için DevStack Yapılandırması ve Yük Dağıtımı

Adım 1: Ön Hazırlık

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.

Adım 2: Kurulum

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          |
+--------------------------------------+--------------------+----------------+-------+----------------+---------------------------+

Adım 3: Yük Dağıtmadan Önce

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.

Adım 4: Yük Dağıtımı (Load Balancing)

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment