Udostępnij za pośrednictwem


Rozwiązywanie problemów z połączeniem z aplikacją hostowaną w klastrze usługi AKS

W bieżących dynamicznych środowiskach w chmurze zapewnienie bezproblemowej łączności z aplikacjami hostowanymi w klastrach usługi Azure Kubernetes Service (AKS) ma kluczowe znaczenie dla utrzymania optymalnej wydajności i środowiska użytkownika. W tym artykule opisano sposób rozwiązywania i rozwiązywania problemów z łącznością spowodowanych przez różne czynniki, w tym problemy po stronie aplikacji, zasady sieciowe, reguły sieciowej grupy zabezpieczeń lub inne.

Uwaga 16.

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

Czynniki do rozważenia

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-odpowiedź?

  • Które przeskoki mają dodatkowe warstwy zabezpieczeń, takie jak następujące elementy:

    • Firewall
    • Sieciowa grupa zabezpieczeń
    • Zasady sieciowe

Podczas sprawdzania poszczególnych składników 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ą żadnych jednoznacznych wyników, 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 na temat zbierania przechwytywania pakietów dla środowiska usługi AKS, zobacz następujące artykuły w przewodniku zbierania danych:

Wiedza na temat pobierania kodów odpowiedzi HTTP i przechwytywania pakietów ułatwia rozwiązywanie problemów z łącznością sieciową.

Podstawowy przepływ sieci dla aplikacji w usłudze AKS

Ogólnie rzecz biorąc, gdy aplikacje są uwidocznione przy użyciu typu usługi Azure Load Balancer, przepływ żądania w celu uzyskania do nich dostępu jest następujący:

Zasobniki węzłów >> usługi AKS o nazwie >> DNS klienta >> usługi AKS >>

Istnieją inne możliwe sytuacje, w których mogą być zaangażowane dodatkowe składniki. Na przykład:

  • Zarządzany ruch przychodzący NGINX z włączoną funkcją dodatku routingu aplikacji.
  • Brama aplikacji jest używana za pośrednictwem kontrolera ruchu przychodzącego usługi Application Gateway (AGIC) zamiast usługi Azure Load Balancer.
  • Usługi Azure Front Door i API Management mogą być używane na podstawie modułu równoważenia obciążenia.
  • Proces używa wewnętrznego modułu równoważenia obciążenia.
  • Połączenie może nie kończyć się zasobnikem i żądanym adresem URL. Może to zależeć od tego, czy zasobnik może łączyć się z inną jednostką, taką jak baza danych, czy jakakolwiek 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 przypomina przepływ przedstawiony na poniższym diagramie.

Diagram podstawowego przepływu żądań do aplikacji w klastrze usługi Azure Kubernetes Service (A K S).

Rozwiązywanie problemów wewnętrznych

Rozwiązywanie problemów z łącznością może obejmować wiele kontroli, ale podejście wewnętrzne może pomóc znaleźć źródło problemu i zidentyfikować wąskie gardło. W tym podejściu zaczynasz od samego zasobnika, sprawdzając, czy aplikacja odpowiada na adres IP zasobnika. Następnie sprawdź poszczególne składniki pod kątem klienta końcowego.

Krok 1. Sprawdzanie, czy zasobnik jest uruchomiony, a aplikacja lub kontener wewnątrz zasobnika prawidłowo odpowiada

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 przy użyciu polecenia kubectl describe :

kubectl describe pod <pod-name> -n <namespace-name>

Jeśli zasobnik nie jest w Ready stanie lub Running jest ponownie uruchamiany wiele razy, sprawdź kubectl describe dane wyjściowe. Zdarzenia ujawnią wszelkie problemy, które uniemożliwiają uruchamianie zasobnika. Lub jeśli zasobnik został uruchomiony, aplikacja wewnątrz zasobnika mogła zakończyć się niepowodzeniem, powodując ponowne uruchomienie zasobnika. Rozwiąż odpowiednie problemy z zasobnikiem , aby upewnić się, że jest w odpowiednim stanie.

Jeśli zasobnik jest uruchomiony, może być również przydatne sprawdzenie dzienników kontenerów, które znajdują się wewnątrz zasobnika. 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 uzyskać bezpośredni dostęp do adresu IP zasobnika aplikacji i sprawdzić, czy aplikacja odpowiada poprawnie. Uruchom polecenie kubectl run, apt-geti 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 && apt-get install netcat-traditional -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, takiego jak narzędzie netcat, a następnie sprawdzić łączność z zasobnikem aplikacji, uruchamiając następujące polecenie:

# After the packages are installed, test the connectivity to the application pod using netcat/nc command:
nc -z -v <pod-ip-address> <port>

Aby uzyskać więcej poleceń do 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żna skoncentrować się głównie na rozwiązywaniu problemów z uwidacznianiem zasobnika.

Czy zasobnik jest udostępniany jako usługa? W takim 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 i Selectors dla 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:

Diagram użycia zasobnika testowego w klastrze usługi Azure Kubernetes Service (A K S) w celu uzyskania dostępu do adresu I P klastra.

# 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 && apt-get install netcat-traditional -y
  
# After the packages are installed, test the connectivity to the service:
curl -Iv http://<service-ip-address>:<port>

W przypadku aplikacji, które nasłuchują innych protokołów, można zainstalować odpowiednie narzędzia wewnątrz zasobnika testowego, takiego jak narzędzie netcat, a następnie sprawdzić łączność z zasobnikem aplikacji, uruchamiając następujące polecenie:

# After the packages are installed, test the connectivity to the application pod using netcat/nc command:
nc -z -v <pod-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żna uzyskać dostęp do adresu IP modułu równoważenia obciążenia spoza klastra.

Diagram użytkownika testowego, który uzyskuje dostęp do adresu I P modułu równoważenia obciążenia spoza klastra usługi Azure Kubernetes Service (A K S).

curl -Iv http://<service-ip-address>:<port>

W przypadku aplikacji, które nasłuchują innych protokołów, można zainstalować odpowiednie narzędzia wewnątrz zasobnika testowego, takiego jak narzędzie netcat, a następnie sprawdzić łączność z zasobnikem aplikacji, uruchamiając następujące polecenie:

nc -z -v <pod-ip-address> <port>

LoadBalancer Czy adres IP usługi zwraca poprawną odpowiedź? Jeśli tak nie jest, wykonaj następujące kroki:

  1. Sprawdź zdarzenia usługi.

  2. 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ń do 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 przy użyciu Ingress zasobu, przepływ ruchu przypomina następujący postęp:

Nazwa DNS klienta >> moduł równoważenia obciążenia lub zasobniki kontrolera ruchu przychodzącego bramy >> aplikacji w usłudze klastra >> lub zasobnikach >>

Diagram przepływu ruchu sieciowego, gdy aplikacja wewnątrz klastra usługi Azure Kubernetes Service (A K S) jest uwidoczniona przy użyciu zasobu ruchu przychodzącego.

W tym miejscu możesz również zastosować wewnętrzne podejście do rozwiązywania problemów. Aby uzyskać więcej informacji, możesz również sprawdzić zasób kubernetes ruchu przychodzącego i kontroler ruchu 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 myapp.com hoście.
  • Ma skonfigurowane dwa Path ciągi.
  • Trasy do dwóch Services na zapleczu.

Sprawdź, czy usługi zaplecza są uruchomione i odpowiadają 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 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.

Inną możliwością jest to, że składniki na zasobnikach przychodzących, takich jak moduł równoważenia obciążenia lub usługa Application Gateway, nie są prawidłowo przekierowywane do klastra. Jeśli to prawda, możesz sprawdzić konfigurację zaplecza tych zasobów.

Jeśli zostanie wyświetlony komunikat o błędzie, sprawdź sieciową grupę Connection Timed Out 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 (na przykład ruchu przychodzącego 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 na temat platformy Azure.

Wyłączenie odpowiedzialności za kontakty z osobami trzecimi

Firma Microsoft udostępnia informacje kontaktowe innych firm, aby uzyskać dodatkowe informacje na temat tego tematu. Informacje te mogą zostać zmienione bez powiadomienia. Firma Microsoft nie gwarantuje dokładności informacji kontaktowych innych firm.