AKS kümesinde barındırılan bir uygulamaya bağlantı sorunlarını giderme
Microsoft Azure Kubernetes Service (AKS) kümesine bağlantı sorunları farklı anlamlara gelebilir. Bazı durumlarda, API sunucusuna bağlantının etkilendiği anlamına gelebilir (örneğin, kubectl kullanılarak). Diğer durumlarda, yaygın bağlantı sorunlarının AKS kümesinde barındırılan bir uygulamayı etkilediği anlamına gelebilir. Bu makalede AKS kümesi bağlantı sorunlarının nasıl giderılacağı açıklanır.
Not
AKS API sunucusuna bağlanmaya çalıştığınızda sık karşılaşılan sorunları gidermek için bkz. API sunucusuyla ilgili küme bağlantısı sorunlarının temel sorunlarını giderme.
Önkoşullar
İstemci URL'si (cURL) aracı veya benzer bir komut satırı aracı.
Paketleri işlemek için apt-get komut satırı aracı.
Kubernetes kubectl aracı veya kümeye bağlanmak için benzer bir araç. Azure CLI kullanarak kubectl yüklemek için az aks install-cli komutunu çalıştırın.
Dikkate alınması gereken faktörler
Bu bölüm, AKS kümesinde barındırılan uygulamaya bağlanmaya çalışırken sorun yaşıyorsanız atılması gereken sorun giderme adımlarını kapsar.
Herhangi bir ağ senaryosunda, yöneticiler sorun giderme sırasında aşağıdaki önemli faktörleri dikkate almalıdır:
İsteğin kaynağı ve hedefi nedir?
Kaynak ile hedef arasındaki atlamalar nelerdir?
İstek-yanıt akışı nedir?
Hangi atlamaların en üstünde aşağıdaki öğeler gibi ek güvenlik katmanları vardır:
- Güvenlik duvarı
- Ağ güvenlik grubu (NSG)
- Ağ ilkesi
Her bileşeni denetlediğinizde HTTP yanıt kodlarını alın ve analiz edin. Bu kodlar sorunun niteliğini tanımlamak için yararlıdır ve özellikle uygulamanın HTTP isteklerine yanıt verdiği senaryolarda yararlıdır.
Diğer sorun giderme adımları kesin sonuç sağlamazsa istemciden ve sunucudan paket yakalamaları alın. Paket yakalamaları, istemci ile sunucu arasında HTTP olmayan trafik söz konusu olduğunda da yararlıdır. AKS ortamı için paket yakalamaları toplama hakkında daha fazla bilgi için veri toplama kılavuzundaki aşağıdaki makalelere bakın:
HTTP yanıt kodlarını almayı ve paket yakalamalarını almayı bilmek, ağ bağlantısı sorununu gidermeyi kolaylaştırır.
AKS'de uygulamalar için temel ağ akışı
Genel olarak, AKS kümesinde barındırılan uygulamalara erişmek için istek akışı aşağıdaki gibidir:
İstemci >> DNS adı >> AKS yük dengeleyici IP adresi >> AKS düğümleri >> Podları
Ek bileşenlerin dahil olabileceği başka olası durumlar da vardır. Örneğin:
- Uygulama ağ geçidi, Azure Load Balancer yerine Application Gateway Giriş Denetleyicisi (AGIC) aracılığıyla kullanılır.
- Yük dengeleyicinin üzerinde Azure Front Door ve API Management kullanılabilir.
- İşlem bir iç yük dengeleyici kullanır.
- Bağlantı podda ve istenen URL'de bitmeyebilir. Bu, pod'un veritabanı veya aynı kümedeki başka bir hizmet gibi başka bir varlığa bağlanıp bağlanamadığına bağlı olabilir.
Uygulamanın istek akışını anlamak önemlidir.
AKS kümesindeki uygulamalara yönelik temel bir istek akışı, aşağıdaki diyagramda gösterilen akışa benzer.
İçten dışa sorun giderme
Bağlantı sorunlarını giderme işlemi birçok denetim içerebilir, ancak iç yaklaşım sorunun kaynağını bulmanıza ve performans sorununu belirlemenize yardımcı olabilir. Bu yaklaşımda, uygulamanın pod'un IP adresinde yanıt verip vermediğini denetleyarak poddan başlarsınız. Ardından, son istemciye kadar her bileşeni sırayla denetleyin.
1. Adım: Pod'un çalışıp çalışmadığını ve pod içindeki uygulamanın veya kapsayıcının doğru yanıt verip vermediğini denetleyin
Podun çalışıp çalışmadığını belirlemek için aşağıdaki kubectl get komutlarından birini çalıştırın:
# List pods in the specified namespace.
kubectl get pods -n <namespace-name>
# List pods in all namespaces.
kubectl get pods -A
Pod çalışmıyorsa ne olur? Bu durumda kubectl describe komutunu kullanarak pod olaylarını denetleyin:
kubectl describe pod <pod-name> -n <namespace-name>
Pod bir Ready
veya Running
durumunda değilse veya birçok kez yeniden başlatıldıysa çıkışı denetleyin kubectl describe
. Olaylar, podu başlatmanızı engelleyen sorunları ortaya çıkaracaktır. Veya pod başlatıldıysa pod içindeki uygulama başarısız olmuş ve pod yeniden başlatılmasına neden olmuş olabilir. Uygun bir durumda olduğundan emin olmak için pod sorunlarını uygun şekilde giderin.
Pod çalışıyorsa, podların günlüklerini ve içindeki kapsayıcıları denetlemek de yararlı olabilir. Aşağıdaki kubectl günlükleri komutlarını çalıştırın:
kubectl logs <pod-name> -n <namespace-name>
# Check logs for an individual container in a multicontainer pod.
kubectl logs <pod-name> -n <namespace-name> -c <container-name>
# Dump pod logs (stdout) for a previous container instance.
kubectl logs <pod-name> --previous
# Dump pod container logs (stdout, multicontainer case) for a previous container instance.
kubectl logs <pod-name> -c <container-name> --previous
Pod çalışıyor mu? Bu durumda, kümede bir test podu başlatarak bağlantıyı test edin. Test podundan uygulamanın pod IP adresine doğrudan erişebilir ve uygulamanın doğru yanıt verip vermediğini de kontrol edebilirsiniz. kubectl run, apt-get
ve cURL
komutlarını aşağıdaki gibi çalıştırın:
# Start a test pod in the cluster:
kubectl run -it --rm aks-ssh --image=debian:stable
# After the test pod is running, you will gain access to the pod.
# Then you can run the following commands:
apt-get update -y && apt-get install dnsutils -y && apt-get install curl -y
# After the packages are installed, test the connectivity to the application pod:
curl -Iv http://<pod-ip-address>:<port>
Diğer protokolleri dinleyen uygulamalar için, test podunun içine ilgili araçları yükleyebilir ve ardından uygulama podunun bağlantısını de kontrol edebilirsiniz.
Pod sorunlarını gidermeye yönelik diğer komutlar için bkz . Çalışan podlarda hata ayıklama.
2. Adım: Uygulamanın hizmetten erişilebilir olup olmadığını denetleyin
Pod içindeki uygulamanın çalıştığı senaryolar için, temel olarak pod'un nasıl kullanıma sunulduğuyla ilgili sorunları gidermeye odaklanabilirsiniz.
Pod bir hizmet olarak kullanıma sunuldu mu? Bu durumda hizmet olaylarını denetleyin. Ayrıca hizmet açıklamasında pod IP adresinin ve uygulama bağlantı noktasının uç nokta olarak kullanılabilir olup olmadığını denetleyin:
# Check the service details.
kubectl get svc -n <namespace-name>
# Describe the service.
kubectl describe svc <service-name> -n <namespace-name>
Aşağıdaki örnekte olduğu gibi pod'un IP adresinin hizmette bir uç nokta olarak bulunup bulunmadığını denetleyin:
$ kubectl get pods -o wide # Check the pod's IP address.
NAME READY STATUS RESTARTS AGE IP NODE
my-pod 1/1 Running 0 12m 10.244.0.15 aks-agentpool-000000-vmss000000
$ kubectl describe service my-cluster-ip-service # Check the endpoints in the service.
Name: my-cluster-ip-service
Namespace: default
Selector: app=my-pod
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.0.174.133
IPs: 10.0.174.133
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.244.0.15:80 # <--- Here
$ kubectl get endpoints # Check the endpoints directly for verification.
NAME ENDPOINTS AGE
my-cluster-ip-service 10.244.0.15:80 14m
Uç noktalar doğru pod IP adresini göstermiyorsa pod ve hizmet için ve Selectors
değerlerini doğrulayınLabels
.
Hizmetteki uç noktalar doğru mu? Bu durumda hizmete erişin ve uygulamanın erişilebilir olup olmadığını denetleyin.
ClusterIP hizmetine erişme
Hizmet için kümede ClusterIP
bir test podu başlatabilir ve hizmet IP adresine erişebilirsiniz:
# Start a test pod in the cluster:
kubectl run -it --rm aks-ssh --image=debian:stable
# After the test pod is running, you will gain access to the pod.
# Then, you can run the following commands:
apt-get update -y && apt-get install dnsutils -y && apt-get install curl -y
# After the packages are installed, test the connectivity to the service:
curl -Iv http://<service-ip-address>:<port>
Önceki komut uygun bir yanıt döndürmezse, hizmet olaylarının hataları olup olmadığını denetleyin.
LoadBalancer hizmetine erişme
Hizmet için LoadBalancer
yük dengeleyici IP adresine kümenin dışından erişebilirsiniz.
curl -Iv http://<service-ip-address>:<port>
LoadBalancer
Hizmet IP adresi doğru yanıt döndürmüyor mu? Aksi takdirde şu adımları izleyin:
Hizmetin olaylarını doğrulayın.
AKS düğümleri ve AKS alt ağıyla ilişkilendirilmiş ağ güvenlik gruplarının (NSG) hizmet bağlantı noktasında gelen trafiğe izin verdiğini doğrulayın.
Hizmet sorunlarını gidermeye yönelik diğer komutlar için bkz. Hizmetlerde hata ayıklama.
Hizmet yerine giriş kullanan senaryolar
Uygulamanın bir Ingress
kaynak kullanılarak kullanıma sunulduğu senaryolar için trafik akışı aşağıdaki ilerlemeye benzer:
İstemci >> DNS adı >> Yük dengeleyici veya uygulama ağ geçidi IP adresi >> Giriş podları küme >> Hizmeti veya podlar içinde
Burada sorun gidermenin iç içe yaklaşımını da uygulayabilirsiniz. Daha fazla bilgi için giriş ve giriş denetleyicisi ayrıntılarını da kontrol edebilirsiniz:
$ kubectl get ing -n <namespace-of-ingress> # Checking the ingress details and events.
NAME CLASS HOSTS ADDRESS PORTS AGE
hello-world-ingress <none> myapp.com 20.84.x.x 80, 443 7d22h
$ kubectl describe ing -n <namespace-of-ingress> hello-world-ingress
Name: hello-world-ingress
Namespace: <namespace-of-ingress>
Address: 20.84.x.x
Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
TLS:
tls-secret terminates myapp.com
Rules:
Host Path Backends
---- ---- --------
myapp.com
/blog blog-service:80 (10.244.0.35:80)
/store store-service:80 (10.244.0.33:80)
Annotations: cert-manager.io/cluster-issuer: letsencrypt
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /$1
nginx.ingress.kubernetes.io/use-regex: true
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Sync 5m41s nginx-ingress-controller Scheduled for sync
Normal Sync 5m41s nginx-ingress-controller Scheduled for sync
Bu örnekte aşağıdakiler gibi bir Ingress
kaynak bulunur:
- Konakta
myapp.com
dinler. - yapılandırılmış iki
Path
dize vardır. - Arka uçta ikiye
Services
yönlendirir.
Arka uç hizmetlerinin çalıştığını doğrulayın ve giriş açıklamasında belirtilen bağlantı noktasına yanıt verin:
$ kubectl get svc -n <namespace-of-ingress>
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
ingress-basic blog-service ClusterIP 10.0.155.154 <none> 80/TCP
ingress-basic store-service ClusterIP 10.0.61.185 <none> 80/TCP
ingress-basic nginx-ingress-ingress-nginx-controller LoadBalancer 10.0.122.148 20.84.x.x 80:30217/TCP,443:32464/TCP
Bir hata varsa giriş denetleyicisi podlarının günlüklerini doğrulayın:
$ kubectl get pods -n <namespace-of-ingress> # Get the ingress controller pods.
NAME READY STATUS RESTARTS AGE
aks-helloworld-one-56c7b8d79d-6zktl 1/1 Running 0 31h
aks-helloworld-two-58bbb47f58-rrcv7 1/1 Running 0 31h
nginx-ingress-ingress-nginx-controller-9d8d5c57d-9vn8q 1/1 Running 0 31h
nginx-ingress-ingress-nginx-controller-9d8d5c57d-grzdr 1/1 Running 0 31h
$ # Check logs from the pods.
$ kubectl logs -n ingress-basic nginx-ingress-ingress-nginx-controller-9d8d5c57d-9vn8q
İstemci giriş ana bilgisayar adına veya IP adresine istekte bulunuyorsa ancak giriş denetleyicisi podunun günlüklerinde hiçbir giriş görünmüyorsa ne olur? Bu durumda, istekler kümeye ulaşmıyor olabilir ve kullanıcı bir Connection Timed Out
hata iletisi alıyor olabilir.
Diğer bir olasılık, Load Balancer veya Application Gateway gibi giriş podlarının üstündeki bileşenlerin istekleri kümeye doğru yönlendirmemesidir. Bu doğruysa, bu kaynakların arka uç yapılandırmasını de kontrol edebilirsiniz.
Hata Connection Timed Out
iletisi alırsanız AKS düğümleriyle ilişkili ağ güvenlik grubunu denetleyin. Ayrıca AKS alt akını denetleyin. Yük dengeleyiciden veya uygulama ağ geçidinden AKS düğümlerine gelen trafiği engelliyor olabilir.
Giriş sorunlarını giderme (Nginx Girişi gibi) hakkında daha fazla bilgi için bkz. ingress-nginx sorunlarını giderme.
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.
Üçüncü tarafla iletişim sorumluluk reddi
Microsoft, bu konu hakkında ek bilgi bulmanıza yardımcı olmak için üçüncü taraf iletişim bilgileri sağlar. Bu iletişim bilgileri önceden haber verilmeksizin değiştirilebilir. Microsoft, üçüncü taraf iletişim bilgilerinin doğruluğunu garanti etmez.
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