Rozwiązywanie problemów z połączeniem z aplikacją hostowaną w klastrze usługi AKS
Problemy z połączeniem z klastrem usługi Microsoft Azure Kubernetes Service (AKS) mogą oznaczać różne rzeczy. W niektórych przypadkach może to oznaczać, że dotyczy to połączenia z serwerem interfejsu API (na przykład przy użyciu narzędzia kubectl). W innych przypadkach może to oznaczać, że typowe problemy z połączeniem mają wpływ na aplikację hostowaną w klastrze usługi AKS. W tym artykule omówiono sposób rozwiązywania problemów z połączeniem klastra usługi AKS.
Uwaga
Aby rozwiązać typowe problemy podczas próby nawiązania połączenia z serwerem interfejsu API usługi AKS, zobacz Podstawowe rozwiązywanie problemów z połączeniem klastra z serwerem interfejsu API.
Wymagania wstępne
Narzędzie Adres URL klienta (cURL) lub podobne narzędzie wiersza polecenia.
Narzędzie wiersza polecenia apt-get do obsługi pakietów.
Narzędzie Kubernetes kubectl lub podobne narzędzie do nawiązywania połączenia z klastrem. Aby zainstalować narzędzie kubectl przy użyciu interfejsu wiersza polecenia platformy Azure, uruchom polecenie az aks install-cli .
Czynniki, które należy wziąć pod uwagę
W tej sekcji opisano kroki rozwiązywania problemów, które należy wykonać, jeśli występują problemy podczas próby nawiązania połączenia z aplikacją hostowaną w klastrze usługi AKS.
W każdym scenariuszu sieci administratorzy powinni wziąć pod uwagę następujące ważne czynniki podczas rozwiązywania problemów:
Jakie jest źródło i miejsce docelowe żądania?
Jakie są przeskoki między źródłem a miejscem docelowym?
Jaki jest przepływ żądania i odpowiedzi?
Które przeskoki mają dodatkowe warstwy zabezpieczeń na górze, takie jak następujące elementy:
- Zapory
- Sieciowa grupa zabezpieczeń
- Zasady sieci
Po sprawdzeniu każdego składnika pobierz i przeanalizuj kody odpowiedzi HTTP. Te kody są przydatne do identyfikowania charakteru problemu i są szczególnie przydatne w scenariuszach, w których aplikacja odpowiada na żądania HTTP.
Jeśli inne kroki rozwiązywania problemów nie zapewniają żadnego jednoznacznego wyniku, wykonaj przechwytywanie pakietów z klienta i serwera. Przechwytywanie pakietów jest również przydatne, gdy między klientem a serwerem jest zaangażowany ruch inny niż HTTP. Aby uzyskać więcej informacji o sposobie zbierania przechwytywania pakietów dla środowiska usługi AKS, zobacz następujące artykuły w przewodniku zbierania danych:
Przechwytywanie zrzutu TCP z węzła systemu Linux w klastrze usługi AKS.
Przechwytywanie zrzutu TCP z węzła systemu Windows w klastrze usługi AKS.
Przechwytywanie pakietów TCP z zasobnika w klastrze usługi AKS.
Znajomość sposobu pobierania kodów odpowiedzi HTTP i przechwytywania pakietów ułatwia rozwiązywanie problemu z łącznością sieciową.
Podstawowy przepływ sieci dla aplikacji w usłudze AKS
Ogólnie rzecz biorąc, przepływ żądania uzyskiwania dostępu do aplikacji hostowanych w klastrze usługi AKS jest następujący:
Nazwa DNS klienta >> usługi AKS load balancer adres >> IP zasobników >> węzłów AKS >>
Istnieją inne możliwe sytuacje, w których mogą być zaangażowane dodatkowe składniki. Przykład:
- Brama aplikacji jest używana za pośrednictwem kontrolera ruchu przychodzącego Application Gateway (AGIC) zamiast Azure Load Balancer.
- Usługa Azure Front Door i API Management mogą być używane na szczycie modułu równoważenia obciążenia.
- Proces używa wewnętrznego modułu równoważenia obciążenia.
- Połączenie może nie zakończyć się w zasobniku i żądanym adresie URL. Może to zależeć od tego, czy zasobnik może nawiązać połączenie z inną jednostką, taką jak baza danych lub dowolna inna usługa w tym samym klastrze.
Ważne jest, aby zrozumieć przepływ żądań dla aplikacji.
Podstawowy przepływ żądań do aplikacji w klastrze usługi AKS będzie podobny do przepływu przedstawionego na poniższym diagramie.
Rozwiązywanie problemów wewnątrz
Rozwiązywanie problemów z łącznością może obejmować wiele testów, ale podejście do wewnątrz może pomóc znaleźć źródło problemu i zidentyfikować wąskie gardło. W tym podejściu rozpoczynasz od samego zasobnika, sprawdzając, czy aplikacja odpowiada na adres IP zasobnika. Następnie sprawdź każdy składnik z kolei do klienta końcowego.
Krok 1. Sprawdzanie, czy zasobnik jest uruchomiony, a aplikacja lub kontener wewnątrz zasobnika odpowiada poprawnie
Aby określić, czy zasobnik jest uruchomiony, uruchom jedno z następujących poleceń kubectl get :
# List pods in the specified namespace.
kubectl get pods -n <namespace-name>
# List pods in all namespaces.
kubectl get pods -A
Co zrobić, jeśli zasobnik nie jest uruchomiony? W takim przypadku sprawdź zdarzenia zasobnika za pomocą polecenia kubectl describe :
kubectl describe pod <pod-name> -n <namespace-name>
Jeśli zasobnik nie jest w Ready
stanie lub Running
jest wielokrotnie ponownie uruchamiany, sprawdź dane wyjściowe kubectl describe
. Zdarzenia ujawnią wszelkie problemy, które uniemożliwiają uruchomienie zasobnika. Jeśli zasobnik został uruchomiony, aplikacja wewnątrz zasobnika mogła zakończyć się niepowodzeniem, co spowodowało ponowne uruchomienie zasobnika. Rozwiąż odpowiednie problemy z zasobnikiem , aby upewnić się, że jest w odpowiednim stanie.
Jeśli zasobnik jest uruchomiony, warto również sprawdzić dzienniki zasobników i kontenerów znajdujących się w nich. Uruchom następującą serię poleceń dzienników kubectl :
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
Czy zasobnik jest uruchomiony? W takim przypadku przetestuj łączność, uruchamiając zasobnik testowy w klastrze. Z zasobnika testowego możesz bezpośrednio uzyskać dostęp do adresu IP zasobnika aplikacji i sprawdzić, czy aplikacja odpowiada poprawnie. Uruchom polecenia kubectl run, apt-get
, i cURL
w następujący sposób:
# 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>
W przypadku aplikacji, które nasłuchują innych protokołów, można zainstalować odpowiednie narzędzia wewnątrz zasobnika testowego, a następnie sprawdzić łączność z zasobnikiem aplikacji.
Aby uzyskać więcej poleceń rozwiązywania problemów z zasobnikami, zobacz Debugowanie uruchomionych zasobników.
Krok 2. Sprawdzanie, czy aplikacja jest osiągalna z usługi
W przypadku scenariuszy, w których aplikacja wewnątrz zasobnika jest uruchomiona, możesz skupić się głównie na rozwiązywaniu problemów z sposobem uwidoczniania zasobnika.
Czy zasobnik jest uwidoczniany jako usługa? W tym przypadku sprawdź zdarzenia usługi. Sprawdź również, czy adres IP zasobnika i port aplikacji są dostępne jako punkt końcowy w opisie usługi:
# Check the service details.
kubectl get svc -n <namespace-name>
# Describe the service.
kubectl describe svc <service-name> -n <namespace-name>
Sprawdź, czy adres IP zasobnika jest obecny jako punkt końcowy w usłudze, jak w poniższym przykładzie:
$ 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
Jeśli punkty końcowe nie wskazują poprawnego adresu IP zasobnika, sprawdź Labels
wartości i Selectors
zasobnika i usługi.
Czy punkty końcowe w usłudze są poprawne? Jeśli tak, uzyskaj dostęp do usługi i sprawdź, czy aplikacja jest osiągalna.
Uzyskiwanie dostępu do usługi ClusterIP
ClusterIP
W przypadku usługi możesz uruchomić zasobnik testowy w klastrze i uzyskać dostęp do adresu IP usługi:
# 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>
Jeśli poprzednie polecenie nie zwraca odpowiedniej odpowiedzi, sprawdź zdarzenia usługi pod kątem błędów.
Uzyskiwanie dostępu do usługi LoadBalancer
LoadBalancer
W przypadku usługi możesz uzyskać dostęp do adresu IP modułu równoważenia obciążenia spoza klastra.
curl -Iv http://<service-ip-address>:<port>
LoadBalancer
Czy adres IP usługi zwraca poprawną odpowiedź? Jeśli tak się nie stanie, wykonaj następujące kroki:
Sprawdź zdarzenia usługi.
Sprawdź, czy sieciowe grupy zabezpieczeń skojarzone z węzłami usługi AKS i podsiecią usługi AKS zezwalają na ruch przychodzący na porcie usługi.
Aby uzyskać więcej poleceń rozwiązywania problemów z usługami, zobacz Debugowanie usług.
Scenariusze korzystające z ruchu przychodzącego zamiast usługi
W przypadku scenariuszy, w których aplikacja jest uwidoczniona Ingress
przy użyciu zasobu, przepływ ruchu przypomina następujący postęp:
Nazwa >> DNS klienta >> Moduł równoważenia obciążenia lub zasobniki ruchu przychodzącego bramy >> aplikacji w usłudze lub zasobnikach klastra >>
Tutaj możesz również zastosować podejście do rozwiązywania problemów wewnątrz. Aby uzyskać więcej informacji, możesz również sprawdzić szczegóły kontrolera ruchu przychodzącego i przychodzącego:
$ 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
Ten przykład zawiera Ingress
zasób, który:
- Nasłuchuje na hoście
myapp.com
. - Ma skonfigurowane dwa
Path
ciągi. - Kieruje do dwóch
Services
na zapleczu.
Sprawdź, czy usługi zaplecza są uruchomione, i odpowiedz na port wymieniony w opisie ruchu przychodzącego:
$ 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
Sprawdź dzienniki dla zasobników kontrolera ruchu przychodzącego, jeśli wystąpił błąd:
$ 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
Co zrobić, jeśli klient wysyła żądania do nazwy hosta ruchu przychodzącego lub adresu IP, ale w dziennikach zasobnika kontrolera ruchu przychodzącego nie są widoczne żadne wpisy? W takim przypadku żądania mogą nie docierać do klastra, a użytkownik może otrzymać Connection Timed Out
komunikat o błędzie.
Inna możliwość polega na tym, że składniki znajdujące się na szczycie zasobników ruchu przychodzącego, takie jak Load Balancer lub Application Gateway, nie są prawidłowo routingiem żądań do klastra. Jeśli jest to prawda, możesz sprawdzić konfigurację zaplecza tych zasobów.
Jeśli zostanie wyświetlony Connection Timed Out
komunikat o błędzie, sprawdź sieciową grupę zabezpieczeń skojarzoną z węzłami usługi AKS. Sprawdź również podsieć usługi AKS. Może to blokować ruch z modułu równoważenia obciążenia lub bramy aplikacji do węzłów usługi AKS.
Aby uzyskać więcej informacji na temat rozwiązywania problemów z ruchem przychodzącym (takim jak ruch przychodzący Nginx), zobacz rozwiązywanie problemów z ruchem przychodzącym nginx.
Skontaktuj się z nami, aby uzyskać pomoc
Jeśli masz pytania lub potrzebujesz pomocy, utwórz wniosek o pomoc techniczną lub zadaj pytanie w społeczności wsparcia dla platformy Azure. Możesz również przesłać opinię o produkcie do społeczności opinii platformy Azure.
Wyłączenie odpowiedzialności za kontakty z osobami trzecimi
Firma Microsoft udostępnia informacje kontaktowe innych firm, które ułatwiają znalezienie dodatkowych informacji na ten temat. Informacje te mogą zostać zmienione bez powiadomienia. Firma Microsoft nie gwarantuje dokładności informacji kontaktowych innych firm.
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla