Ö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ç 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-get
ve 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:
Azure portalSanal makine ölçek kümeleri için arama yapın ve seçin.
Ölçek kümesi örnekleri listesinde, kullanmakta olduğunuz örneği seçin.
Ölçek kümesi örneğinizin menü bölmesinde öğesini seçin
Networking
.
Ölçek kümesi örneğinin Ağ 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.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin