Aracılığıyla paylaş


Özel ağ güvenlik grubu trafiği engelliyor

Azure Kubernetes Service (AKS) kümesinde barındırılan bir uygulamaya eriştiğiniz zaman "Zaman aşımına uğradı" hata iletisi alırsınız. Uygulama çalışıyor olsa ve yapılandırmanın geri kalanı doğru gibi görünse bile bu hata oluşabilir.

Önkoşullar

  • Kümeye bağlanmak için Kubernetes kubectl aracı veya benzer bir araç. Azure CLI kullanarak kubectl yüklemek için az aks install-cli komutunu çalıştırın.

  • İstemci URL'si (cURL) aracı veya benzer bir komut satırı aracı.

  • Paketleri işlemek için apt-get komut satırı aracı.

Belirtiler

Aşağıdaki kubectl get ve cURL komutlarını çalıştırırsanız, aşağıdaki konsol çıkışına benzer "Zaman aşımına uğradı" hatalarıyla karşılaşırsınız:

$ kubectl get pods
NAME                             READY   STATUS    RESTARTS   AGE
my-deployment-66648877fc-v78jm   1/1     Running   0          5m53s

$ kubectl get service
NAME                      TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)        AGE
my-loadbalancer-service   LoadBalancer   10.0.107.79   10.81.x.x   80:31048/TCP   4m14s

$ curl -Iv http://10.81.124.39  # Use an IP address that fits the "EXTERNAL-IP" pattern.
*   Trying 10.81.x.x:80...
* connect to 10.81.x.x port 80 failed: Timed out
* Failed to connect to 10.81.x.x port 80 after 21033 ms: Timed out
* Closing connection 0
curl: (28) Failed to connect to 10.81.x.x port 80 after 21033 ms: Timed out

Neden

Her seferinde aynı "Zaman aşımına uğradı" hatasıyla karşılaşırsanız, bu genellikle bir ağ bileşeninin trafiği engellediğini gösterir.

Bu sorunu gidermek için pod erişimini denetleyerek başlayabilir ve ardından içe bir yaklaşımla istemciye geçebilirsiniz.

Pod'u denetlemek için aşağıdaki kubectl get ve kubectl describe komutlarını çalıştırın:

$ kubectl get pods -o wide
NAME                             READY   STATUS    RESTARTS   AGE   IP            NODE                               
my-deployment-66648877fc-v78jm   1/1     Running   0          53s   172.25.0.93   aks-agentpool-42617579-vmss000000

$ kubectl describe pod my-deployment-66648877fc-v78jm  # Specify the pod name from the previous command.
...
...
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  117s  default-scheduler  Successfully assigned default/my-deployment-66648877fc-v78jm to aks-agentpool-42617579-vmss000000
  Normal  Pulling    116s  kubelet            Pulling image "httpd"
  Normal  Pulled     116s  kubelet            Successfully pulled image "httpd" in 183.532816ms
  Normal  Created    116s  kubelet            Created container webserver
  Normal  Started    116s  kubelet            Started container webserver

Bu çıkışa bağlı olarak, pod hiçbir yeniden başlatma olmadan düzgün çalışıyor gibi görünüyor.

Uygulama podunun erişimini denetlemek için bir test pod'unu açın. Aşağıdaki kubectl get, kubectl run, apt-getve cURL komutlarını çalıştırın:

$ kubectl get pods -o wide  # Get the pod IP address.
NAME                             READY   STATUS    RESTARTS   AGE     IP            NODE                                
my-deployment-66648877fc-v78jm   1/1     Running   0          7m45s   172.25.0.93   aks-agentpool-42617579-vmss000000  

$ kubectl run -it --rm aks-ssh --image=debian:stable  # Launch the test pod.
If you don't see a command prompt, try pressing enter.
$ root@aks-ssh:

$ # Install packages inside the test pod.
$ root@aks-ssh: apt-get update -y && apt-get install dnsutils -y && apt-get install curl -y
Get:1 http://deb.debian.org/debian bullseye InRelease [116 kB]
Get:2 http://deb.debian.org/debian bullseye-updates InRelease [39.4 kB]
...
...
Running hooks in /etc/ca-certificates/update.d...
done.

$ # Try to check access to the pod using the pod IP address from the "kubectl get" output.
$ curl -Iv http://172.25.0.93
*   Trying 172.25.0.93:80...
* Connected to 172.25.0.93 (172.25.0.93) port 80 (#0)
...
...
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
...
...
* Connection #0 to host 172.25.0.93 left intact

Pod'a doğrudan erişilebilir. Bu nedenle, uygulama çalışıyor.

Tanımlanan hizmet bir LoadBalancer türdür. Bu, son istemciden poda istek akışının aşağıdaki gibi olacağı anlamına gelir:

İstemci >> Yük dengeleyici >> AKS düğümü >> Uygulama podu

Bu istek akışında trafiği aşağıdaki bileşenler aracılığıyla engelleyebiliriz:

  • Kümedeki ağ ilkeleri
  • AKS alt ağı ve AKS düğümü için ağ güvenlik grubu (NSG)

Ağ ilkesini denetlemek için aşağıdaki kubectl get komutu çalıştırın:

$ kubectl get networkpolicy --all-namespaces
NAMESPACE     NAME                 POD-SELECTOR             AGE
kube-system   konnectivity-agent   app=konnectivity-agent   3h8m

Yalnızca AKS varsayılan ilkesi vardır. Bu nedenle, ağ ilkesi trafiği engelliyor gibi görünmüyor.

AKS kullanarak NSG'leri ve bunların ilişkili kurallarını denetlemek için şu adımları izleyin:

  1. Azure portalSanal makine ölçek kümeleri için arama yapın ve seçin.

  2. Ölçek kümesi örnekleri listesinde, kullanmakta olduğunuz örneği seçin.

  3. Ölçek kümesi örneğinizin menü bölmesinde öğesini seçin Networking.

Ölçek kümesi örneğinin sayfası görüntülenir. Gelen bağlantı noktası kuralları sekmesinde, ölçek kümesi örneğinde işlem gösteren iki NSG'yi temel alan iki kural kümesi görüntülenir:

  • İlk küme, alt ağ düzeyinde NSG kurallarından oluşur. Bu kurallar aşağıdaki not başlığı altında görüntülenir:

    my-aks-nsg> ağ güvenlik grubu< (alt ağa bağlı: <my-aks-subnet>)

    AKS kümesi için özel bir sanal ağ ve özel alt ağ kullanıldığında bu düzenleme yaygındır. Alt ağ düzeyindeki kural kümesi aşağıdaki tabloya benzeyebilir.

    Öncelik Name Bağlantı noktası Protokol Kaynak Hedef Eylem
    65000 AllowVnetInBound Herhangi biri Herhangi biri VirtualNetwork VirtualNetwork İzin ver
    65001 AllowAzureLoadBalancerInBound Herhangi biri Herhangi biri AzureLoadBalancer Herhangi biri İzin ver
    65500 DenyAllInBound Herhangi biri Herhangi biri Herhangi biri Herhangi biri Inkar
  • İkinci küme, ağ bağdaştırıcısı düzeyinde NSG kurallarından oluşur. Bu kurallar aşağıdaki not başlığı altında görüntülenir:

    Aks-agentpool-agentpool-number-nsg<> ağ güvenlik grubu (ağ arabirimine bağlı: aks-agentpool-vm-scale-set-number-vmss<>)

    Bu NSG AKS kümesi tarafından uygulanır ve AKS tarafından yönetilir. İlgili kural kümesi aşağıdaki tabloya benzeyebilir.

    Öncelik Name Bağlantı noktası Protokol Kaynak Hedef Eylem
    500 <guid-TCP-80-Internet> 80 TCP Internet 10.81.x.X İzin ver
    65000 AllowVnetInBound Herhangi biri Herhangi biri VirtualNetwork VirtualNetwork İzin ver
    65001 AllowAzureLoadBalancerInBound Herhangi biri Herhangi biri AzureLoadBalancer Herhangi biri İzin ver
    65500 DenyAllInBound Herhangi biri Herhangi biri Herhangi biri Herhangi biri Inkar

Ağ bağdaştırıcısı düzeyinde, 10.81 IP adresinde TCP için bir NSG gelen kuralı vardır. x. 80 numaralı bağlantı noktasında x (tabloda vurgulanır). Ancak, alt ağ düzeyinde NSG kurallarında eşdeğer bir kural eksiktir.

AKS kuralı neden özel NSG'ye uygulamadı? AKS alt ağına NSG uygulamadığından ve bu alt ağ ile ilişkili NSG'lerden hiçbirini değiştirmez. AKS NSG'leri yalnızca ağ bağdaştırıcısı düzeyinde değiştirir. Daha fazla bilgi için bkz. AKS ile NSG'leri yapılandırabilir miyim?.

Çözüm

Uygulama belirli bir bağlantı noktasında erişim için etkinleştirildiyse, özel NSG'nin bu bağlantı noktasına kural Inbound olarak izin verdiğinden emin olmanız gerekir. Alt ağ düzeyinde özel NSG'ye uygun kural eklendikten sonra uygulamaya erişilebilir.

$ curl -Iv http://10.81.x.x
*   Trying 10.81.x.x:80...
* Connected to 10.81.x.x (10.81.x.x) port 80 (#0)
...
...
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
...
...
* Connection #0 to host 10.81.x.x left intact

Yardım için bize ulaşın

Sorularınız veya yardıma ihtiyacınız varsa bir destek isteği oluşturun veya Azure topluluk desteği isteyin. Ürün geri bildirimini Azure geri bildirim topluluğuna da gönderebilirsiniz.