Azure Kubernetes Service'te birden çok yük dengeleyici kullanma (önizleme)

Azure Kubernetes Service (AKS), normalde bir kümedeki tüm LoadBalancer Hizmetler için bir Standart Yük Dengeleyici (SLB) sağlar. Her düğüm NIC'si 300 gelen yük dengeleme kuralı ve 8 özel bağlantı hizmetiyle sınırlı olduğundan, büyük kümeler veya bağlantı noktası ağır iş yükleri bu sınırları hızla tüketebilir.

Birden çok SLB önizlemesi, aynı küme içinde birkaç SLB oluşturmanıza ve düğümleri ve Hizmetleri bunlar arasında paylaşmanıza olanak sağlayarak bu tıkanıklığı ortadan kaldırır. Her biri birincil aracı havuzuna ve isteğe bağlı ad alanı, etiket veya düğüm seçicilerine bağlı yük dengeleyici yapılandırmaları tanımlarsınız ve AKS, düğümleri ve Hizmetleri otomatik olarak uygun SLB'ye yerleştirir. Eğer outboundTypeloadBalancer ise, giden SNAT davranışı değişmez. Giden trafik hala ilk SLB üzerinden akıyor.

Bu özelliği kullanarak:

  • Küme eklemeden 300 gelen kuralın ötesine ölçeklendirin.
  • Ayrılmış bir SLB'yi kendi aracı havuzuna bağlayarak kiracıyı veya iş yükü trafiğini yalıtın.
  • SLB başına sınıra yaklaştığınızda özel bağlantı hizmetlerini birden çok SLB arasında dağıtın.

Önkoşullar

  • aks-preview uzantı 18.0.0b1 veya üzeri.
  • Abonelik özelliği bayrağı Microsoft.ContainerService/MultipleStandardLoadBalancersPreview kaydedildi.
  • Kubernetes sürüm 1.28 veya üzeri.
  • --load-balancer-backend-pool-type nodeIP ile bir küme oluşturun veya az aks update kullanarak mevcut bir kümeyi güncelleştirin.

aks-preview Azure CLI uzantısını yükleme

Önemli

AKS önizleme özellikleri self servis ve kabul temelinde kullanılabilir. Önizlemeler "olduğu gibi" ve "mevcut olduğu şekilde" sağlanmakta olup, hizmet seviyesi anlaşmalarına ve sınırlı garantilere dahil edilmemektedir. AKS önizlemeleri, müşteri desteği ekibi tarafından maksimum çaba gösterilerek kısmen ele alınmaktadır. Bu nedenle, bu özellikler üretim kullanımı için tasarlanmamıştır. Daha fazla bilgi için aşağıdaki destek makalelerine bakın:

  • komutunu kullanarak aks-preview uzantısını az extension add yükleyin.

    az extension add --name aks-preview
    
  • komutunu kullanarak yayımlanan uzantının en son sürümüne güncelleştirin az extension update .

    az extension update --name aks-preview
    

Özellik bayrağını MultipleStandardLoadBalancersPreview kaydetme

  1. MultipleStandardLoadBalancersPreview özellik bayrağını az feature register komutunu kullanarak kaydedin.

    az feature register --namespace "Microsoft.ContainerService" --name "MultipleStandardLoadBalancersPreview"
    

    Durumun Kayıtlı olarak gösterilmesi birkaç dakika sürer.

  2. komutunu kullanarak az feature show kayıt durumunu doğrulayın:

    az feature show --namespace "Microsoft.ContainerService" --name "MultipleStandardLoadBalancersPreview"
    
  3. Durum Kayıtlı olarak yansıtıldığında komutunu kullanarak az provider register kaynak sağlayıcısının kaydını yenileyin.

    az provider register --namespace Microsoft.ContainerService
    

AKS yük dengeleyiciyi nasıl seçer (düğüm ve Hizmet yerleşimi)

AKS, düğümlerin nereye yerleştirileceğini ve LoadBalancer Hizmetlerinin kullanıma sunulduğu yeri belirlemek için birden çok giriş kullanır. Bu girişler her yük dengeleyici yapılandırmasında tanımlanır ve her kaynak için hangi SLB'nin seçildiğini etkiler.

Giriş türü Şunlar için geçerlidir: Açıklama
Birincil etken havuzu
--primary-agent-pool-name
Nodes Gerekli. Bu havuzdaki tüm düğümler hep SLB'nin arka uç havuzuna eklenir. Her SLB'nin en az bir sağlam düğüme sahip olduğundan emin olur.
Düğüm seçici
--node-selector
Nodes Opsiyonel. Birincil havuza ek olarak, eşleşen etiketlere sahip tüm düğümleri SLB'ye ekler.
Hizmet ad alanı seçicisi
--service-namespace-selector
Hizmetler Opsiyonel. Bu SLB için yalnızca eşleşen etiketlere sahip ad alanları içindeki hizmetler dikkate alınır.
Hizmet etiketi seçicisi
--service-label-selector
Hizmetler Opsiyonel. Yalnızca etiketleri eşleşen hizmetler bu SLB için uygundur.
Hizmet ek açıklaması
service.beta.kubernetes.io/azure-load-balancer-configurations
Hizmetler Opsiyonel. Yerleştirmeyi bir veya daha fazla açıkça adlandırılmış SLB yapılandırmasıyla sınırlar. Bu olmadan, eşleşen tüm yapılandırmalar uygun olur.

Uyarı

Seçiciler uygunluğu tanımlar. Ek açıklama (kullanılıyorsa), denetleyiciyi belirli bir SLB alt kümesiyle kısıtlar.

AKS bu girişleri nasıl kullanır?

AKS denetim düzlemi, yukarıdaki kuralları kullanarak düğüm ve Hizmet durumunu sürekli olarak senkronize eder.

Düğüm yerleşimi

Bir düğüm eklendiğinde veya güncelleştirildiğinde AKS, birincil havuza ve düğüm seçiciye göre hangi SLA'lara uygun olduğunu denetler.

  • Birden çok SLB eşleşirse, denetleyici en az geçerli düğüme sahip olanı seçer.
  • Düğüm, bu SLB'nin arka uç havuzuna eklenir.

Hizmet yerleşimi

LoadBalancer Hizmeti oluşturulduğunda veya güncelleştirildiğinde:

  1. AKS, ad alanı ve etiket seçicileri Hizmetle eşleşen SLB'leri bulur.
  2. Servis ek açıklaması mevcutsa, adlandırılan SLB'ler yalnızca dikkate alınır.
  3. allowServicePlacement=false içeren veya Azure sınırlarını (300 kural veya 8 özel bağlantı hizmeti) aşacak SLB'ler hariç tutulur.
  4. Geçerli seçenekler arasında en az kurala sahip SLB seçilir.

externalTrafficPolicy (ETP) davranışı

AKS, externalTrafficPolicy değerine bağlı olarak Hizmetleri işler farklı şekilde.

Modül Yük dengeleyici seçimi nasıl çalışır? Arka uç havuzu üyeliği nasıl oluşturulur? Notes
Küme (varsayılan) Denetleyici, yukarıda açıklanan standart yerleştirme kurallarına uyar. Tek bir yük dengeleme kuralı, seçilen SLB'de paylaşılan kubernetes arka uç havuzunu hedefler. SLB'nin kubernetes havuzundaki tüm düğümler sağlıklı hedeflerdir. Eşleşen Pod'lara sahip olmayan düğümler sağlık denetimleri tarafından otomatik olarak kaldırılır. Tekli SLB kümelerinde bugünküyle aynı davranış.
Yerel Denetleyici SLB seçmek için seçici tabanlı algoritmayı kullanmaya devam eder, ancak paylaşılan havuzu kullanmak yerine Hizmet başına ayrılmış bir arka uç havuzu oluşturur . Üyelik, Hizmetin EndpointSlice nesnelerinden gelen bilgilerle eşitlenir, bu nedenle yalnızca hazır Pod'ları barındıran düğümler eklenir. Sağlık tarayıcıları, iyi durumda olmayan düğümleri bırakmak için healthCheckNodePort kullanmaya devam eder. İstemci IP'lerinin korunmasını garanti eder ve düğümler birden fazla SLB'ye dağıtıldığında dahi, pod içermeyen düğümler üzerinden yapılan yönlendirmeleri önler.

NEDEN ETP Local için ayrılmış havuz?
Çoklu SLB modunda, belirli bir Hizmet için Pod'ları barındıran düğümler, istemciye yönelik VIP'den farklı SLB'lerde bulunabilir. Paylaşılan arka uç havuzu genellikle uygun düğüm içermediğinden trafiği kesiyor. Hizmet başına havuzu ayırıp içinden EndpointSliceeşitleyerek AKS, Hizmetin SLB'sinin her zaman doğru düğümleri işaret etmesini sağlar.

Kotalar üzerindeki etkisi

  • Her ETP Yerel Hizmeti, SLB'sine bir arka uç havuzu ve bir yük dengeleme kuralı ekler.
  • Bunlar 300 kural sınırına doğru sayılır, bu nedenle çok sayıda ETP Yerel Hizmetiniz olduğunda kural kullanımını izleyin.

Giden trafikte değişiklik yok

Giden SNAT, ETP ayarlarından bağımsız olarak, aksOutboundBackendPooloutboundType olduğunda ilk SLB'nin loadBalancer üzerinden akmaya devam eder.

İsteğe bağlı: Yeniden Dengeleme

Düğüm dağıtımını daha sonra az aks loadbalancer rebalance kullanarak manuel olarak yeniden dengeleyebilirsiniz.

Bu tasarım hem altyapı hem de iş yükleri için esnek, etiket temelli yönlendirme tanımlamanıza olanak tanırken AKS, dengeyi korumak ve kota sorunlarını önlemek için yerleştirmeyi otomatik olarak işler.

İlk yük dengeleyici yapılandırmasını ekleme

adlı kubernetes bir yapılandırma ekleyin ve her zaman en az bir düğümü olan bir birincil aracı havuzuna bağlayın. Her yapılandırmanın kaldırılması kümeyi tek SLB moduna geri geçirir.

Önemli

Birden çok SLB modunu etkinleştirmek için adlı bir yük dengeleyici yapılandırması eklemeniz ve bunu her zaman en az bir hazır düğümü olan kubernetes aracı havuzuna eklemeniz gerekir.
Bu yapılandırmanın varlığı çoklu SLB desteğini değiştirir; hizmet seçiminde özel önceliğe sahip değildir ve diğer yük dengeleyici yapılandırmaları gibi değerlendirilir.
Her yük dengeleyici yapılandırmasını silerseniz, küme otomatik olarak tek SLB moduna geri döner ve bu da hizmet yönlendirmesini veya SNAT akışlarını kısa bir süre kesintiye uğratabilir.

  1. Bu öğretici boyunca kullanılacak ortam değişkenlerini ayarlayın. DEFAULT_LB_NAME olarak kalması gereken dışında kubernetes tüm yer tutucu değerlerini kendi yer tutucunuzla değiştirebilirsiniz.

    RESOURCE_GROUP="rg-aks-multislb"
    CLUSTER_NAME="aks-multi-slb"
    LOCATION="westus"
    DEFAULT_LB_NAME="kubernetes"
    PRIMARY_POOL="nodepool1"
    
  2. komutunu kullanarak az group create kaynak grubu oluşturun.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  3. komutunu kullanarak az aks create AKS kümesi oluşturun.\

    az aks create --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME \
      --load-balancer-backend-pool-type nodeIP \
      --node-count 3
    
  4. komutunu kullanarak az aks loadbalancer add varsayılan bir yük dengeleyici ekleyin.

    az aks loadbalancer add --resource-group $RESOURCE_GROUP --cluster-name $CLUSTER_NAME \
      --name $DEFAULT_LB_NAME \
      --primary-agent-pool-name $PRIMARY_POOL \
      --allow-service-placement true
    

Ek yük dengeleyiciler ekleme

Farklı bir birincil havuzun yanı sıra isteğe bağlı ad alanı, etiket veya düğüm seçicileri belirterek kiracıya özgü yapılandırmalar oluşturun.

  1. Takım 1 kendi iş yüklerini ayrı bir düğüm havuzunda çalıştırır. İş yüklerinin seçiciler kullanılarak zamanlanması için bir tenant=team1 etiket atayın:

    TEAM1_POOL="team1pool"
    TEAM1_LB_NAME="team1-lb"
    
  2. komutunu kullanarak az aks nodepool add takım 1 için ikinci bir düğüm havuzu oluşturun.

    az aks nodepool add --resource-group $RESOURCE_GROUP --cluster-name $CLUSTER_NAME \
      --name $TEAM1_POOL \
      --labels tenant=team1 \
      --node-count 2
    
  3. komutunu kullanarak az aks loadbalancer add takım 1 için bir yük dengeleyici oluşturun.

    az aks loadbalancer add --resource-group $RESOURCE_GROUP --cluster-name $CLUSTER_NAME \
      --name $TEAM1_LB_NAME \
      --primary-agent-pool-name $TEAM1_POOL \
      --service-namespace-selector "tenant=team1" \
      --node-selector "tenant=team1"
    
  4. hedef ad alanını (örneğin, team1-apps) komutunu kullanarak seçiciyle eşleşecek şekilde etiketleyin az aks command invoke .

    az aks command invoke \
      --resource-group $RESOURCE_GROUP \
      --name $CLUSTER_NAME \
      --command "
    kubectl create namespace team1-apps --dry-run=client -o yaml | kubectl apply -f -
    kubectl label namespace team1-apps tenant=team1 --overwrite
    "
    
  5. Artık komutunu kullanarak az aks loadbalancer list birden çok yapılandırmayı görmek için kümedeki yük dengeleyicileri listeleyebilirsiniz.

    az aks loadbalancer list --resource-group $RESOURCE_GROUP --cluster-name $CLUSTER_NAME --output table
    

    Örnek çıkış:

    AllowServicePlacement    ETag     Name        PrimaryAgentPoolName    ProvisioningState    ResourceGroup
    -----------------------  -------  ----------  ----------------------  -------------------  ---------------
    True                     <ETAG>   kubernetes  nodepool1               Succeeded            rg-aks-multislb
    True                     <ETAG>   team1-lb    team1pool               Succeeded            rg-aks-multislb
    

Hizmeti belirli bir yük dengeleyiciye dağıtma

Ek açıklamayı service.beta.kubernetes.io/azure-load-balancer-configurations ekleyin ve yapılandırma adlarının virgülle ayrılmış bir listesini kullanın. Eğer annotasyon atlanırsa, denetleyici otomatik olarak seçer.

az aks command invoke \
  --resource-group $RESOURCE_GROUP \
  --name $CLUSTER_NAME \
  --command "
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
  name: lb-svc-1
  namespace: team1-apps
  labels:
    app: nginx-test
  annotations:
    service.beta.kubernetes.io/azure-load-balancer-configurations: \"team1-lb\"
    # service.beta.kubernetes.io/azure-load-balancer-internal: "true" # If you want to create an internal load balancer. 
spec:
  selector:
    app: nginx-test
  ports:
  - name: port1
    port: 80
    targetPort: 80
    protocol: TCP
  type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-test
  namespace: team1-apps
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-test
  template:
    metadata:
      labels:
        app: nginx-test
    spec:
      containers:
      - image: nginx
        imagePullPolicy: Always
        name: nginx
        ports:
        - containerPort: 80
          protocol: TCP
        resources:
          limits:
            cpu: \"150m\"
            memory: \"300Mi\"
EOF
"

Düğümleri yeniden dengeleme (isteğe bağlı)

Komutunu kullanarak az aks loadbalancer rebalance kural sayıları dengesiz hale gelirse ölçeklendirmeden sonra yeniden dengeleme işlemi çalıştırın. Bu komut etkin akışları kesintiye uğratır, bu nedenle bir bakım penceresi sırasında zamanlayın.

az aks loadbalancer rebalance --resource-group $RESOURCE_GROUP --cluster-name $CLUSTER_NAME

İzleme ve sorun giderme

  • Hizmetlerin mutabık olduğunu onaylamak için denetleyici olaylarını (kubectl get events …) izleyin.
  • Dış bağlantı engellenirse bir düğüm kabuğu açın ve kube-proxy yönlendirmesini onaylamak için Hizmet VIP'sini kıvırın.

Sınırlamalar ve bilinen sorunlar

Sınırlama Ayrıntılar
Giden SNAT Her zaman ilk SLB'yi kullanır; giden trafikler parçalara ayrılmaz.
Arka plan havuz türü Var olan bir kümeyi nodeIP arka uç havuzlarını kullanacak şekilde oluşturun veya güncelleyin.
Otomatik Ölçekleyici Sıfırlama Birincil aracı havuzu 0 düğüme ölçeklendirilemez.
ETP local Kural Büyümesi Her bir ETP local Hizmeti, kendi kuralını ve arka uç havuzunu kullanır, bu nedenle kural sayıları mode cluster moduna göre daha hızlı artabilir.
Yeniden dengeleme kesintisi Bir düğümün arka uç havuzundan kaldırılması, aktif bağlantıları düşürür. Bakım pencerelerini planlayın.
Yapılandırma yeniden yükleme zamanlaması çalıştırıldıktan az aks loadbalancersonra, değişiklikler hemen geçerli olmayabilir. AKS işlemi hızlı bir şekilde tamamlanabilir, ancak bulut denetleyicisi-yöneticisinin güncelleştirmeleri uygulaması daha uzun sürebilir. Değişikliklerin etkin olduğunu onaylamak için EnsuredLoadBalancer olayını bekleyin.

Kaynakları temizle

komutunu kullanarak az group delete kümeyi ve yük dengeleyicileri kaldırmayı bitirdiğinizde kaynak grubunu silin.

az group delete --name $RESOURCE_GROUP --yes --no-wait

Sonraki Adımlar

Birden çok SLB özelliği, Azure tarafından yönetilen yapılandırma aracılığıyla basitliği korurken ağ katmanındaki iş yüklerinin ölçeklendirilmesine ve yalıtılmasına yardımcı olur. Daha fazla bilgi için aşağıdaki kaynaklara bakın: