Örnek Başına Ağırlıklı Ağ Yükü Dengeleme

1. Giriş

Ağ yük dengeleyiciyi, ağırlıklı yük dengeleme kullanılarak yapılan HTTP durum denetimi tarafından bildirilen ağırlıklara göre yük dengeleyicinin arka uç örnekleri genelinde dağıtacak şekilde yapılandırabilirsiniz.

Ağırlıklı yük dengeleme için aşağıdakilerin ikisini de yapılandırmanız gerekir:

  • Arka uç hizmetinin yerel yük dengeleyici politikasını (localityLbPolicy) WEIGHTED_MAGLEV olarak ayarlamanız gerekir.
  • Arka uç hizmetini HTTP/HTTP2/HTTPS durum denetimiyle yapılandırmanız gerekir. Ağırlıkları, her arka uç örneği için ondalık gösterimde 0 ile 1000 arasında tam sayı değerlerine sahip tam sayı değerleriyle belirtmek üzere HTTP durum denetimi yanıtları özel bir HTTP yanıt başlığı alanı X-Load-Balancing-Endpoint-weight içermelidir.

Ağırlıklı yük dengeleme kullanan birden fazla arka uç hizmeti tabanlı ağ yük dengeleyicisi için arka uç olarak aynı örnek grubunu kullanırsanız arka uç hizmetinin her durum denetimi için benzersiz bir istek yolu kullanmanız önerilir. Daha fazla bilgi için HTTP, HTTPS ve HTTP/2 durum denetimleri için başarı ölçütleri başlıklı makaleye bakın.

HTTP durum denetimi, durum denetimlerinin başarılı olması ve arka uç örneğinin iyi durumda olarak kabul edilmesi için HTTP 200 (Tamam) yanıtı döndürmelidir. Tüm arka uç örneklerinin durum denetimlerini geçip X-Load-Balancing-Uç Nokta-Ağırlıkını sıfır ağırlıkla döndürdüğü durumlarda, yük dengeleyici iyi durumdaki arka uçlar arasında yeni bağlantılar dağıtarak bunları eşit ağırlıkla ele alır. Yük dengeleyici, durumu iyi olmayan arka uçlar arasında yeni bağlantılar da dağıtabilir. Daha fazla bilgi için Trafik dağıtımı başlıklı makaleyi inceleyin.

Ağırlıklı yük dengeleme örnekleri için Arka uç seçimi ve bağlantı izleme bölümüne bakın.

Ağırlıklı yük dengeleme aşağıdaki senaryolarda kullanılabilir:

  • Bazı bağlantılar diğerlerinden daha fazla veri işlerse veya bazı bağlantılar diğerlerinden daha uzun süre yaşıyorsa arka uç yükü dağılımı eşit olmayabilir. Yüksek yüke sahip bir örnek, daha düşük bir örnek başına ağırlığın sinyalini vererek mevcut bağlantılara hizmet vermeye devam ederken yeni bağlantı payını azaltabilir.
  • Bir arka uç aşırı yükleniyorsa ve daha fazla bağlantı atamak mevcut bağlantıları bozabilir. Bu tür arka uçlar kendisine sıfır ağırlık atar. Bir arka uç örneği, sıfır ağırlığın sinyalini vererek yeni bağlantılara hizmet vermeyi durdurur ancak mevcut bağlantılara hizmet vermeye devam eder.
  • Bir arka uç, bakım öncesinde mevcut bağlantıları boşaltıyorsa kendisine sıfır ağırlık atar. Arka uç örneği, sıfır ağırlığın sinyalini vererek yeni bağlantılara hizmet vermeyi durdurur ancak mevcut bağlantılara hizmet vermeye devam eder.

Neler öğreneceksiniz?

  • Ağ yük dengeleyiciyi, ağırlıklı yük dengeleme kullanılarak HTTP durum denetimi tarafından bildirilen ağırlıklara göre yük dengeleyicinin arka uç örnekleri genelinde dağıtacak şekilde yapılandırma.

Kendi hızınızda ortam kurulumu

  1. Google Cloud Console'da oturum açıp yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Proje adı, bu projenin katılımcıları için görünen addır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. İstediğiniz zaman güncelleyebilirsiniz.
  • Proje Kimliği, tüm Google Cloud projelerinde benzersizdir ve değiştirilemez (belirlendikten sonra değiştirilemez). Cloud Console, otomatik olarak benzersiz bir dize oluşturur. bunun ne olduğunu umursamıyorsunuz. Çoğu codelab'de proje kimliğini (genellikle PROJECT_ID olarak tanımlanır) referans almanız gerekir. Oluşturulan kimliği beğenmezseniz rastgele bir kimlik daha oluşturabilirsiniz. Alternatif olarak, kendi ölçümünüzü deneyip mevcut olup olmadığına bakabilirsiniz. Bu adımdan sonra değiştirilemez ve proje süresince kalır.
  • Bilginiz için bazı API'lerin kullandığı üçüncü bir değer, yani Proje Numarası daha vardır. Bu değerlerin üçü hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Sonraki adımda, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i çalıştırmanın maliyeti, yüksek değildir. Bu eğitim dışında faturalandırma yapılmaması için kaynakları kapatmak isterseniz oluşturduğunuz kaynakları silebilir veya projenin tamamını silebilirsiniz. Yeni Google Cloud kullanıcıları, 300 ABD doları değerindeki ücretsiz denemeden yararlanabilir.

Cloud Shell'i başlatma

Google Cloud dizüstü bilgisayarınızdan uzaktan çalıştırılabilse de bu codelab'de, Cloud'da çalışan bir komut satırı ortamı olan Google Cloud Shell'i kullanacaksınız.

Google Cloud Console'da, sağ üstteki araç çubuğunda bulunan Cloud Shell simgesini tıklayın:

55efc1aaa7a4d3ad.png

Ortamı sağlamak ve bağlamak yalnızca birkaç dakika sürer. Tamamlandığında şuna benzer bir sonuç görmeniz gerekir:

7ffe5cbb04455448

İhtiyacınız olan tüm geliştirme araçlarını bu sanal makinede bulabilirsiniz. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud üzerinde çalışarak ağ performansını ve kimlik doğrulamasını büyük ölçüde iyileştirir. Bu codelab'deki tüm çalışmalarınız tarayıcıda yapılabilir. Herhangi bir şey yüklemeniz gerekmez.

2. Yapılandırmayı Başlat

Codelab'e tek bir proje gerekir.

Bu eğiticide, üç sanal makine örneğiyle bir örnek grubu oluşturacak ve her örnek için ağırlık atayacaksınız. Arka uç örneği ağırlıklarını raporlamak için bir HTTP durum denetimi oluşturursunuz. Ağırlıklı ağ yük dengeleyici, arka uç hizmetinde WEIGHTED_MAGLEV olarak yerel yük dengeleyici politikası ile etkinleştirilir.

Başlamadan önce

gcloud services enable compute.googleapis.com

Not: Yerel yük dengeleyici politikasını yapılandırmak ve sanal makine örneklerine ağırlık atamak için Google Cloud konsolunu kullanamazsınız. Bunun yerine Google Cloud KSA'yı kullanın.

VPC ağı, alt ağlar ve güvenlik duvarı kuralları oluşturma

VPC ağı, alt ağ oluşturun ve giriş, yük dengeleyicinizin arka uç sanal makinelerine yapılan bağlantılara izin vermek için güvenlik duvarı kurallarına izin verir.

  1. VPC ağı ve alt ağ oluşturun. a. VPC ağını oluşturmak için gcloud compute networks create komutunu: çalıştırın
gcloud compute networks create NETWORK_NAME --subnet-mode custom

b. Bu örnekte, alt ağın birincil IPv4 adres aralığı 10.10.0.0/24 şeklindedir.

Alt ağı oluşturmak için gcloud compute networks subnets create komutunu çalıştırın:

gcloud compute networks subnets create SUBNET_NAME \
  --network=NETWORK_NAME \
  --range=10.10.0.0/24 \
  --region=us-central1

Aşağıdakini değiştirin:

  • NETWORK_NAME: oluşturulacak VPC ağının adı.
  • SUBNET_NAME: Oluşturulacak alt ağın adı.
  1. 80 ve 443 numaralı hedef TCP bağlantı noktalarına gönderilen paketlerin arka uç sanal makinelerine teslim edilmesine izin vermek için bir giriş güvenlik duvarı kuralı oluşturun. Bu örnekte, güvenlik duvarı kuralı herhangi bir kaynak IP adresinden gelen bağlantılara izin verir. Güvenlik duvarı kuralı, network-lb-tag ağ etiketine sahip sanal makineler için geçerlidir. Güvenlik duvarı kuralını oluşturmak için gcloud compute firewall-rules create komutunu çalıştırın:
gcloud compute firewall-rules create FIREWALL_RULE_NAME \
   --direction=INGRESS \
   --priority=1000 \
   --network=NETWORK_NAME \
   --action=ALLOW \
   --rules=tcp:80,tcp:443 \
   --source-ranges=0.0.0.0/0 \
   --target-tags=network-lb-tag

FIREWALL_RULE_NAME değerini, oluşturulacak güvenlik duvarı kuralının adıyla değiştirin.

Sanal makine örnekleri oluşturma ve ağırlık atama

Üç sanal makine örneği oluşturun ve ağırlık atayın:

  1. X-Load-Balancing-Endpoint-weight başlığındaki ağırlıkları HTTP yanıtlarıyla döndürecek üç arka uç sanal makine örneği yapılandırın. Bu eğitim için bir arka uç örneğini sıfır ağırlık bildirecek şekilde, ikinci bir arka uç örneğini 100 ağırlığı bildirecek şekilde ve üçüncü bir arka uç örneğini 900 ağırlık bildirecek şekilde yapılandıracaksınız. Örnekleri oluşturmak için gcloud compute instances create komutunu çalıştırın:
gcloud compute instances create instance-0 \
  --zone=us-central1-a \
  --tags=network-lb-tag \
  --image-family=debian-10 \
  --image-project=debian-cloud \
  --subnet=
SUBNET_NAME
\
  --metadata=load-balancing-weight=0,startup-script='#! /bin/bash
  apt-get update
  apt-get install apache2 -y
  ln -sr /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load
  vm_hostname="$(curl -H "Metadata-Flavor:Google" \
  http://169.254.169.254/computeMetadata/v1/instance/name)"
  echo "Page served from: $vm_hostname" | \
  tee /var/www/html/index.html
  lb_weight="$(curl -H "Metadata-Flavor:Google" \
  http://169.254.169.254/computeMetadata/v1/instance/attributes/load-balancing-weight)"
  echo "Header set X-Load-Balancing-Endpoint-Weight \"$lb_weight\"" | \
  tee /etc/apache2/conf-enabled/headers.conf
  systemctl restart apache2'
gcloud compute instances create instance-100 \
  --zone=us-central1-a \
  --tags=network-lb-tag \
  --image-family=debian-10 \
  --image-project=debian-cloud \
  --subnet=SUBNET_NAME \
  --metadata=load-balancing-weight=100,startup-script='#! /bin/bash
  apt-get update
  apt-get install apache2 -y
  ln -sr /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load
  vm_hostname="$(curl -H "Metadata-Flavor:Google" \
  http://169.254.169.254/computeMetadata/v1/instance/name)"
  echo "Page served from: $vm_hostname" | \
  tee /var/www/html/index.html
  lb_weight="$(curl -H "Metadata-Flavor:Google" \
  http://169.254.169.254/computeMetadata/v1/instance/attributes/load-balancing-weight)"
  echo "Header set X-Load-Balancing-Endpoint-Weight \"$lb_weight\"" | \
  tee /etc/apache2/conf-enabled/headers.conf
  systemctl restart apache2'
gcloud compute instances create instance-900 \
  --zone=us-central1-a \
  --tags=network-lb-tag \
  --image-family=debian-10 \
  --image-project=debian-cloud \
  --subnet=
SUBNET_NAME
\
  --metadata=load-balancing-weight=900,startup-script='#! /bin/bash
    apt-get update
    apt-get install apache2 -y
    ln -sr /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load
    vm_hostname="$(curl -H "Metadata-Flavor:Google" \
    http://169.254.169.254/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    lb_weight="$(curl -H "Metadata-Flavor:Google" \
    http://169.254.169.254/computeMetadata/v1/instance/attributes/load-balancing-weight)"
    echo "Header set X-Load-Balancing-Endpoint-Weight \"$lb_weight\"" | \
    tee /etc/apache2/conf-enabled/headers.conf
    systemctl restart apache2'

Örnek grubu oluşturma

Bu eğiticide, üç sanal makine örneğinin tümünü(instance-0, instance-100, and instance-900) içeren yönetilmeyen bir örnek grubu oluşturma talimatlarını sağlıyorsunuz.

gcloud compute instance-groups unmanaged create
INSTANCE_GROUP --zone=us-central1-a
gcloud compute instance-groups unmanaged add-instances INSTANCE_GROUP \
  --zone=us-central1-a \
  --instances=instance-0,instance-100,instance-900

INSTANCE_GROUP değerini, oluşturulacak örnek grubunun adıyla değiştirin.

HTTP durum denetimi oluşturma

Bu eğiticide, arka uç sanal makinesinin ağırlığını içeren HTTP yanıtını okumak için HTTP durum denetimi oluşturma talimatlarını göreceksiniz.

gcloud compute health-checks create http HTTP_HEALTH_CHECK_NAME \
  --region=us-central1

HTTP_HEALTH_CHECK_NAME değerini, oluşturulacak HTTP durum denetiminin adıyla değiştirin.

Arka uç hizmeti oluşturma

Aşağıdaki örnekte, ağırlıklı yük dengeleme kullanacak şekilde yapılandırılmış bir bölgesel harici arka uç hizmeti oluşturma talimatları sağlanmaktadır.

  1. HTTP durum denetimiyle bir arka uç hizmeti oluşturun ve yerel yük dengeleyici politikasını WEIGHTED_MAGLEV olarak ayarlayın.
gcloud compute backend-services create BACKEND_SERVICE_NAME \
  --load-balancing-scheme=external \
  --protocol=tcp \
  --region=us-central1 \
  --health-checks=HTTP_HEALTH_CHECK_NAME \
  --health-checks-region=us-central1 \
  --locality-lb-policy=WEIGHTED_MAGLEV
  • BACKEND_SERVICE_NAME değerini, oluşturulacak arka uç hizmetinin adıyla değiştirin.
  1. Örnek grubunu arka uç hizmetine ekleyin.
gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
  --instance-group=INSTANCE_GROUP \
  --instance-group-zone=us-central1-a \
  --region=us-central1
  1. Yük dengeleyici için bölgesel bir harici IP adresi ayırın.
gcloud compute addresses create ADDRESS_NAME \
 --region us-central1

ADDRESS_NAME kısmını, oluşturulacak IP adresinin adıyla değiştirin. Sonucu görüntülemek için compute addresses describe komutunu kullanın. Ayrılmış statik harici IP adresini ("IP_ADDRESS') not edin.

gcloud compute addresses describe ADDRESS_NAME
  1. Ayrılmış bölgesel harici IP adresini ("IP_ADDRESS") kullanarak bir iletim kuralı oluşturun. İletim kuralını arka uç hizmetine bağlayın.
gcloud compute forwarding-rules create FORWARDING_RULE \
  --region=us-central1 \
  --ports=80 \
  --address=IP_ADDRESS \
  --backend-service=BACKEND_SERVICE_NAME
  • Şunları değiştirin: FORWARDING_RULE: oluşturulacak iletim kuralının adı. IP_ADDRESS:: Örneğe atanacak IP adresi. Adres adını değil, ayrılmış statik harici IP adresini kullanın.

Arka uç hizmet API'sini kullanarak arka uç ağırlıklarını doğrulama

Arka uç ağırlıklarının HTTP durum denetimine gerektiği gibi raporlandığını doğrulayın.

gcloud compute backend-services get-health HTTP_HEALTH_CHECK_NAME \
  --region=us-central1

Çıkış şuna benzer olmalıdır:

backend: https://www.googleapis.com/compute/projects/project-name/{project}/zones/us-central1-a/instanceGroups/{instance-group-name}
status:
  healthStatus:
  - forwardingRule: https://www.googleapis.com/compute/projects/{project}/regions/us-central1/forwardingRules/{firewall-rule-name}
    forwardingRuleIp: 34.135.46.66
    healthState: HEALTHY
    instance: https://www.googleapis.com/compute/projects/{project}/zones/us-central1-a/instances/instance-0
    ipAddress: 10.10.0.5
    port: 80
    weight: '0'
  - forwardingRule: https://www.googleapis.com/compute/projects/{project}/regions/us-central1/forwardingRules/{firewall-rule-name}
    forwardingRuleIp: 34.135.46.66
    healthState: HEALTHY
    instance: https://www.googleapis.com/compute/projects/{project}/zones/us-central1-a/instances/instance-100
    ipAddress: 10.10.0.6
    port: 80
    weight: '100'
  - forwardingRule: https://www.googleapis.com/compute/projects/{project}/regions/us-central1/forwardingRules/{firewall-rule-name}
    forwardingRuleIp: 34.135.46.66
    healthState: HEALTHY
    instance: https://www.googleapis.com/compute/projects/{project}/zones/us-central1-a/instances/instance-900
    ipAddress: 10.10.0.7
    port: 80
    weight: '900'
  kind: compute#backendServiceGroupHealth