Aracılığıyla paylaş


Azure Kubernetes Service'te (AKS) UDP paket bırakmalarını tanılama ve çözme

Kullanıcı Veri Birimi Protokolü (UDP), yönetilen AKS kümelerinde kullanılan bağlantısız bir protokoldür. UDP paketleri, veri aktarımından önce bağlantı kurmadıkları için herhangi bir teslim, güvenilirlik veya sipariş garantisi olmadan gönderilir. Bu, UDP paketlerinin birden çok nedenden dolayı kaybolabileceği, çoğaltılabildiği veya hedefe ulaşabileceği anlamına gelir.

Bu makalede, yüksek ağ trafiğine sahip olduğunuz durumlarda taşabilen küçük bir okuma arabelleğinden kaynaklanan UDP paket bırakma sorunlarını tanılama ve çözme işlemleri açıklanmaktadır.

Önkoşullar

  • UDP tabanlı bir uygulama çalıştıran en az bir düğüm havuzu ve bir pod içeren bir AKS kümesi.
  • Azure CLI yüklü ve yapılandırılmış. Daha fazla bilgi için bkz . Azure CLI'yi yükleme.
  • Kubectl, AKS kümenize bağlanacak şekilde yüklendi ve yapılandırıldı. Daha fazla bilgi için bkz . Kubectl yükleme.
  • AKS kümenize UDP paketleri gönderip alabilen bir istemci makinesi.

Sorun: UDP bağlantılarının paket bırakma oranı yüksek

UDP paket kaybının olası nedenlerinden biri, UDP arabellek boyutunun gelen trafiği işleyemeyecek kadar küçük olmasıdır. UDP arabellek boyutu, uygulama tarafından işlenmeden önce çekirdekte ne kadar veri depolanabileceğini belirler. Arabellek boyutu yetersizse, çekirdek arabellek kapasitesini aşan paketleri bırakabilir. Bu ayar düğümleriniz için sanal makine (VM) düzeyinde yönetilir ve varsayılan değer 1048576 bayt veya 1 MB olarak ayarlanır.

Not

20.04, 22.04 ve 24.04 hariç 24.10'un önceki Ubuntu sürümlerinde varsayılan UDP arabellek kapasitesi 212992 bayt veya 0,2 MB olarak ayarlanmıştır.

VM düzeyinde arabellek boyutlarına uygulanan iki farklı değişken vardır:

  • net.core.rmem_max = 1048576 bytes: Yuva sahibinin açıkça ayarlayabildiği en büyük arabellek değeri.
  • net.core.rmem_default = 1048576 bytes: Bir değer açıkça ayarlanmazsa rmem_max sistemin arabelleği büyütebileceği üst sınır.

Arabelleğin yüksek trafik artışlarına hizmet verecek şekilde büyümesine izin vermek için arabellek boyutu değerlerini güncelleştirmemiz gerekir.

Not

Bu makalede Ubuntu Linux çekirdek arabellek boyutlarına odaklanılmaktadır. Linux ve Windows için diğer yapılandırmaları görmek istiyorsanız bkz . AKS düğüm havuzları için düğüm yapılandırmasını özelleştirme.

Tanılama

Geçerli UDP arabellek ayarlarını denetleyin

  1. komutunu kullanarak kubectl get nodes düğümlerinizin listesini alın ve arabellek ayarlarını denetlemek istediğiniz düğümü seçin.

    kubectl get nodes
    
  2. komutunu kullanarak seçtiğiniz düğümde bir hata ayıklama podunu kubectl debug ayarlayın. değerini, hata ayıklamak istediğiniz düğümün adıyla değiştirin <node-name> .

    kubectl debug -it node/<node-name> --image=ubuntu --share-processes -- bash
    
  3. Aşağıdaki sysctl komutu kullanarak ve net.core.rmem_default değişkenlerinin net.core.rmem_max değerini alın:

    sysctl net.core.rmem_max net.core.rmem_default
    

Gelen UDP trafiğini ölçme

Arabelleğinizin uygulamanız için çok küçük olup olmadığını denetlemek ve paketleri bırakmak için podlarınızda gerçekçi ağ trafiğinin benzetimini yaparak ve gelen trafiği izlemek için bir hata ayıklama pod'unu ayarlayarak başlayın. Ardından, gelen UDP trafiğini ölçmek için aşağıdaki komutları kullanabilirsiniz.

  1. Aşağıdaki cat komutu kullanarak test çalışırken UDP dosyasını denetleyin:

    cat /proc/net/udp
    

    Bu dosya, sütun altındaki geçerli açık bağlantıların istatistiklerini rx_queue gösterir. Geçmiş verileri göstermez.

  2. Snmp dosyasını denetleyin ve aşağıdaki cat komutu kullanarak test öncesi ve sonrası değerini karşılaştırınRcvbufErrors:

    cat /proc/net/snmp
    

    Bu dosya, udp paketlerinin tarihe kadar olan ömrünü gösterir ve sütuna RcvbufErrors kaç paket bırakıldığını gösterir.

veya değerindeki arabellek boyutunun rx_queue ötesinde bir RcvbufErrors artış fark ederseniz, arabellek boyutunuzu artırmanız gerekir.

Not

Uygulamanız gelen paket hızına ayak uyduramıyorsa sistem arabelleği boyutunu artırmak etkili olmayabilir. Bu durumda sistem arabelleği boyutunun artırılması yalnızca paket bırakma işlemini geciktirdi. Bu gibi durumlarda UDP paketlerini nasıl işlediğine ilişkin uygulamanızı incelemeyi ve geliştirmeyi göz önünde bulundurmalısınız. Daha büyük bir arabellek boyutu yalnızca bazen arabelleği dolduran ani trafik artışları olduğunda kullanışlıdır, bu da çekirdeğe isteklerdeki artışla başa çıkmak için daha fazla zaman/kaynak sağlar.

Azaltmak

Not

Çekirdek, paketler geldiğinde her yuva için okuma arabelleklerini önceden ayırmak yerine dinamik olarak ayırır. rmem_default ve rmem_max ayarları, paket kaybı gerçekleşmeden önce her yuva için çekirdek arabellek sınırlarını belirtir.

Düğüm havuzu oluşturma işlemi sırasında düğüm havuzu düzeyinde arabellek boyutu değerlerini değiştirebilirsiniz. Bu bölümdeki adımlar, Linux işletim sisteminizi yapılandırmayı ve değişiklikleri düğüm havuzundaki tüm düğümlere uygulamayı gösterir. Bu ayarı mevcut düğüm havuzuna ekleyemezsiniz.

  1. Yerel makinenizde aşağıdaki içeriklere sahip bir linuxosconfig.json dosya oluşturun. Değerleri uygulama gereksinimlerinize ve düğüm SKU'nuza göre değiştirebilirsiniz. En düşük değer 212992 bayt ve en büyük değer 134217728 bayttır.

    {
        "sysctls": {
            "netCoreRmemMax": 1572864,
            "netCoreRmemDefault": 1572864
        }
    }
    
  2. Dosyayla aynı dizinde olduğunuzdan linuxosconfig.json emin olun ve komutunu kullanarak az aks nodepool add arabellek boyutu yapılandırmasıyla yeni bir düğüm havuzu oluşturun.

    az aks nodepool add --resource-group $RESOURCE_GROUP --cluster-name $CLUSTER_NAME --name $NODE_POOL_NAME --linux-os-config ./linuxosconfig.json
    

    Bu komut, düğümdeki her yuva için maksimum UDP arabellek boyutunu 8 MB olarak ayarlar. Bu değerleri dosyada linuxosconfig.json uygulama gereksinimlerinize göre ayarlayabilirsiniz.

Doğrulama

Yeni değerleri uyguladıktan sonra, yeni değerlerin varsayılan olarak ayarlandığından emin olmak için VM'nize erişebilirsiniz.

  1. komutunu kullanarak kubectl get nodes düğümlerinizin listesini alın ve arabellek ayarlarını denetlemek istediğiniz düğümü seçin.

    kubectl get nodes
    
  2. komutunu kullanarak seçtiğiniz düğümde bir hata ayıklama podunu kubectl debug ayarlayın. değerini, hata ayıklamak istediğiniz düğümün adıyla değiştirin <node-name> .

    kubectl debug -it node/<node-name> --image=ubuntu --share-processes -- bash
    
  3. Aşağıdaki sysctl komutu kullanarak değişkenin net.core.rmem_max değerini alın:

    sysctl net.core.rmem_max net.core.rmem_default
    

    Değerleriniz artık içinde linuxosconfig.jsonana hatlarıyla belirtilen değerlere ayarlanmalıdır.

Özgün değerlere geri dön

Arabellek boyutunu varsayılan 1 MB değerine geri yüklemek istiyorsanız, dosyayı aşağıdaki değerlerle güncelleştirebilirsinizlinuxosconfig.json:

{
    "sysctls": {
        "netCoreRmemMax": 1048576,
        "netCoreRmemDefault": 1048576
    }
}

Sonraki adımlar

Bu makalede, Azure Kubernetes Service'te (AKS) UDP paket bırakmalarını tanılamayı ve çözmeyi öğrendiniz. AKS'deki sorunları giderme hakkında daha fazla bilgi için Azure Kubernetes Service sorun giderme belgelerine bakın.