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

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

Bu codelab hakkında

subjectSon güncelleme Mar 18, 2025
account_circleYazan: Sahana P, Babi Seal

1. Giriş

Ağırlıklı yük dengeleme kullanarak bir HTTP sağlık durumu kontrolü tarafından bildirilen ağırlıklara göre trafiği yük dengeleyicinin arka uç örnekleri arasında dağıtmak için bir ağ yük dengeleyici 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 dengeleme politikasını (localityLbPolicy) WEIGHTED_MAGLEV olarak ayarlamanız gerekir.
  • Arka uç hizmetini HTTP/HTTP2/HTTPS durum denetimi ile yapılandırmanız gerekir. HTTP durum denetimi yanıtları, her arka uç örneği için ağırlıkları ondalık gösterimde 0 ile 1.000 arasında tam sayı değerleriyle belirtmek üzere özel bir HTTP yanıtı üst bilgisi alanı olan X-Load-Balancing-Endpoint-Weight içermelidir.

Ağırlıklı yük dengeleme kullanan birden fazla arka uç hizmetine dayalı ağ yük dengeleyicisi için aynı örnek grubunu arka uç olarak kullanıyorsanı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 sağlık kontrolleri için başarı ölçütleri başlıklı makaleyi inceleyin.

Durum denetimlerinin başarılı olması ve arka uç örneğinin iyi durumda kabul edilmesi için HTTP durum denetimi, HTTP 200 (OK) yanıtı döndürmelidir. Tüm arka uç örneklerinin durum denetimlerini geçtiği ve X-Load-Balancing-Endpoint-Weight'i sıfır ağırlıkla döndürdüğü durumlarda yük dengeleyici, yeni bağlantıları iyi durumda olan arka uçlar arasında eşit ağırlıkta olacak şekilde dağıtır. Yük dengeleyici, yeni bağlantıları sağlıksız arka uçlar arasında 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 başlıklı makaleyi inceleyin.

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 aktif kalırsa arka uç yük dağıtımı eşit olmayabilir. Yüksek yüke sahip bir örnek, örnek başına daha düşük ağırlık sinyali vererek mevcut bağlantılara hizmet vermeye devam ederken yeni bağlantılardan aldığı payı azaltabilir.
  • Bir arka uç aşırı yüklenmişse ve daha fazla bağlantı atamak mevcut bağlantıları bozabilirse bu tür arka uçlar kendisine sıfır ağırlık atar. Arka uç örneği, sıfır ağırlık sinyali vererek yeni bağlantılara hizmet vermeyi durdurur ancak mevcut bağlantılara hizmet vermeye devam eder.
  • Bir arka uç, bakımdan önce mevcut bağlantıları boşaltıyorsa kendisine sıfır ağırlık atar. Arka uç örneği, sıfır ağırlık sinyali vererek yeni bağlantılara hizmet vermeyi durdurur ancak mevcut bağlantılara hizmet vermeye devam eder.

Neler öğreneceksiniz?

  • Ağırlıklı yük dengeleme kullanarak trafiği yük dengeleyicinin arka uç örnekleri arasında bir HTTP durum denetimi tarafından bildirilen ağırlıklara göre dağıtmak için ağ yük dengeleyiciyi yapılandırma.

Kendi hızınızda ortam kurulumu

  1. Google Cloud Console'da oturum açın ve yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Henüz bir Gmail veya Google Workspace hesabınız yoksa 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. Dilediğiniz zaman bunu güncelleyebilirsiniz.
  • Proje kimliği, tüm Google Cloud projelerinde benzersizdir ve sabittir (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dizeyi otomatik olarak oluşturur. Genellikle bu dizenin ne olduğuyla ilgilenmezsiniz. Çoğu codelab'de proje kimliğine (genellikle PROJECT_ID olarak tanımlanır) başvurmanız gerekir. Oluşturulan kimliği beğenmezseniz başka bir rastgele kimlik oluşturabilirsiniz. Alternatif olarak, kendi adınızı deneyip kullanılabilir olup olmadığını görebilirsiniz. Bu adım tamamlandıktan sonra değiştirilemez ve proje süresince geçerli kalır.
  • Bazı API'lerin kullandığı üçüncü bir değer olan Proje Numarası da vardır. Bu üç değer hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i tamamlamak neredeyse hiç maliyetli değildir. Bu eğitimin ötesinde faturalandırmaya tabi olmamak için kaynakları kapatmak üzere oluşturduğunuz kaynakları veya projenin tamamını silebilirsiniz. Google Cloud'un yeni kullanıcıları 300 ABD doları değerinde ücretsiz deneme programından yararlanabilir.

Cloud Shell'i başlatma

Google Cloud, dizüstü bilgisayarınızdan uzaktan çalıştırılabilir. Ancak 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 Cloud Shell simgesini tıklayın:

55efc1aaa7a4d3ad.png

Ortamın sağlanması ve bağlantının kurulması yalnızca birkaç saniye sürer. İşlem tamamlandığında aşağıdakine benzer bir sonuç görürsünüz:

7ffe5cbb04455448.png

Bu sanal makine, ihtiyaç duyacağınız tüm geliştirme araçlarını içerir. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud üzerinde çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde iyileştirilir. Bu codelab'deki tüm çalışmalarınızı tarayıcıda yapabilirsiniz. Herhangi bir şey yüklemeniz gerekmez.

2. Yapılandırmayı başlatma

Codelab için tek bir proje gerekir.

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

Başlamadan önce

gcloud services enable compute.googleapis.com

Not: Yerellik yük dengeleme politikasını yapılandırmak ve sanal makine örneklerine ağırlık atamak için Google Cloud Console'u kullanamazsınız. Bunun yerine Google Cloud CLI'yı kullanın.

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

Yük dengeleyicinizin arka uç VM'lerine bağlantılara izin vermek için bir VPC ağı, alt ağ ve girişe izin veren güvenlik duvarı kuralları oluşturun.

  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'dır.

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. Hedef TCP bağlantı noktaları 80 ve 443'e gönderilen paketlerin arka uç sanal makinelerine teslim edilmesine izin vermek için bir giriş izin güvenlik duvarı kuralı oluşturun. Bu örnekte, güvenlik duvarı kuralı herhangi bir kaynak IP adresinden gelen bağlantılara izin veriyor. 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 kısmını, 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. Üç arka uç sanal makine örneğini, ağırlıkları HTTP yanıtlarıyla birlikte X-Load-Balancing-Endpoint-Weight başlığında döndürecek şekilde yapılandırın. Bu eğitimde, bir arka uç örneğini sıfır ağırlık bildirecek, ikinci bir arka uç örneğini 100 ağırlık bildirecek 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ğitimde, üç sanal makine örneğini de içeren yönetilmeyen bir örnek grubu oluşturma talimatları veriyorsunuz(instance-0, instance-100, and instance-900).

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 yerine oluşturulacak örnek grubun adını girin.

HTTP durum denetimi oluşturma

Bu eğitimde, arka uç VM'sinin ağırlığını içeren HTTP yanıtını okumak için HTTP durum denetimi oluşturma talimatları veriyorsunuz."

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

HTTP_HEALTH_CHECK_NAME yerine oluşturulacak HTTP durum denetiminin adını girin.

Arka uç hizmeti oluşturma

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

  1. HTTP durum denetimiyle bir arka uç hizmeti oluşturun ve yerellik 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 yerine oluşturulacak arka uç hizmetinin adını girin.
  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 yerine oluşturulacak IP adresinin adını girin. 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 adresi "IP_ADDRESS" kullanarak bir yönlendirme kuralı oluşturun. Yönlendirme 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
  • Aşağıdakileri değiştirin: FORWARDING_RULE: Oluşturulacak yönlendirme kuralının adı. IP_ADDRESS: Örneğe atanacak IP adresi. Adres adı yerine ayrılmış statik harici IP adresini kullanın.

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

Arka uç ağırlıklarının HTTP durum denetimine doğru şekilde bildirildiğini doğrulayın.

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

Çıkış şu şekilde 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