Устранение неполадок подключения к приложению, размещенного в кластере AKS
В текущих динамических облачных средах обеспечение простого подключения к приложениям, размещенным в кластерах Служба Azure Kubernetes (AKS), имеет решающее значение для обеспечения оптимальной производительности и взаимодействия с пользователем. В этой статье описывается, как устранять и устранять проблемы с подключением, вызванные различными факторами, включая проблемы на стороне приложения, политики сети, правила группы безопасности сети (NSG) или другие.
Примечание.
Чтобы устранить распространенные проблемы при попытке подключения к серверу API AKS, ознакомьтесь с основными сведениями об устранении неполадок с подключением к кластеру с сервером API.
Предварительные требования
Средство URL-адреса клиента (cURL) или аналогичное средство командной строки.
Средство командной строки apt-get для обработки пакетов.
Средство командной строки Netcat (
nc
) для TCP-подключений.Средство Kubernetes kubectl или аналогичное средство для подключения к кластеру. Чтобы установить kubectl с помощью Azure CLI, выполните команду az aks install-cli.
Факторы, которые следует учитывать
В этом разделе рассматриваются действия по устранению неполадок при попытке подключиться к приложению, размещенном в кластере AKS.
В любом сетевом сценарии администраторы должны учитывать следующие важные факторы при устранении неполадок:
Что такое источник и назначение для запроса?
Что такое прыжки между источником и назначением?
Что такое поток ответа на запрос?
Какие прыжки имеют дополнительные уровни безопасности сверху, такие как следующие элементы:
- Брандмауэр
- Группа безопасности сети (NSG)
- Политика сети
При проверке каждого компонента получите и проанализируйте коды ответов HTTP. Эти коды полезны для выявления характера проблемы и особенно полезны в сценариях, в которых приложение отвечает на HTTP-запросы.
Если другие действия по устранению неполадок не предоставляют никаких убедительных результатов, выполните захват пакетов с клиента и сервера. Записи пакетов также полезны, если трафик, отличный от HTTP, участвует между клиентом и сервером. Дополнительные сведения о сборе записей пакетов для среды AKS см. в следующих статьях в руководстве по сбору данных:
Знание того, как получить коды http-ответов и принимать записи пакетов, упрощает устранение неполадок с сетевым подключением.
Базовый сетевой поток для приложений в AKS
Как правило, если приложения предоставляются с помощью типа службы Azure Load Balancer, поток запросов для доступа к ним выглядит следующим образом:
Dns-имя >> КЛИЕНТА >> AKS подсистемы >> балансировки нагрузки IP-адрес >> узлов AKS pod
Существуют и другие возможные ситуации, в которых могут быть задействованы дополнительные компоненты. Например:
- Управляемый входящий трафик NGINX с функцией надстройки маршрутизации приложений включен.
- Шлюз приложений используется с помощью Шлюз приложений контроллера входящего трафика (AGIC) вместо Azure Load Balancer.
- Azure Front Door и Управление API могут использоваться поверх подсистемы балансировки нагрузки.
- В процессе используется внутренняя подсистема балансировки нагрузки.
- Подключение может не заканчиваться в модуле pod и запрошенным URL-адресом. Это может зависеть от того, может ли модуль pod подключаться к другой сущности, например базе данных или любой другой службе в том же кластере.
Важно понимать поток запросов для приложения.
Базовый поток запросов к приложениям в кластере AKS будет похож на поток, показанный на следующей схеме.
Устранение неполадок внутри сети
Устранение неполадок с подключением может включать множество проверок, но внутренний подход может помочь найти источник проблемы и определить узкие места. В этом подходе вы начинаете с самого модуля pod, проверяя, отвечает ли приложение на IP-адрес pod. Затем проверьте каждый компонент в очереди на конечный клиент.
Шаг 1. Проверка правильности выполнения модуля pod и приложения или контейнера внутри модуля pod
Чтобы определить, выполняется ли модуль pod, выполните одну из следующих команд получения kubectl:
# List pods in the specified namespace.
kubectl get pods -n <namespace-name>
# List pods in all namespaces.
kubectl get pods -A
Что делать, если модуль pod не запущен? В этом случае проверьте события pod с помощью команды kubectl описать :
kubectl describe pod <pod-name> -n <namespace-name>
Если модуль pod не в состоянии Ready
или Running
не перезагружается много раз, проверьте выходные kubectl describe
данные. В событиях будут выявлены все проблемы, которые препятствуют запуску модуля pod. Или, если модуль pod запущен, приложение внутри модуля pod может завершиться ошибкой, что приведет к перезапуску модуля pod. Устраните неполадки pod соответствующим образом, чтобы убедиться, что он находится в подходящем состоянии.
Если модуль pod запущен, его также можно использовать для проверки журналов контейнеров, находящихся в модуле pod. Выполните следующую серию команд kubectl logs :
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? В этом случае проверьте подключение, запустив тестовый модуль pod в кластере. В тестовом модуле pod можно напрямую получить доступ к IP-адресу pod приложения и проверить правильность ответа приложения. Выполните выполнениеapt-get
kubectl и cURL
команды следующим образом:
# 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>
Для приложений, прослушивающих другие протоколы, можно установить соответствующие средства в тестовом модуле, например в средстве netcat, а затем проверить подключение к pod приложения, выполнив следующую команду:
# After the packages are installed, test the connectivity to the application pod using netcat/nc command:
nc -z -v <pod-ip-address> <port>
Дополнительные команды для устранения неполадок с модулями pod см. в разделе Отладка запущенных модулей pod.
Шаг 2. Проверка доступности приложения из службы
В сценариях, в которых выполняется приложение в модуле pod, можно сосредоточиться главным образом на устранении неполадок, предоставляемых модулем pod.
Предоставляется ли модуль pod как услуга? В этом случае проверьте события службы. Кроме того, проверьте, доступен ли IP-адрес pod и порт приложения в качестве конечной точки в описании службы:
# Check the service details.
kubectl get svc -n <namespace-name>
# Describe the service.
kubectl describe svc <service-name> -n <namespace-name>
Проверьте, присутствует ли IP-адрес pod в качестве конечной точки в службе, как показано в следующем примере:
$ 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
Если конечные точки не указывают на правильный IP-адрес pod, проверьте Labels
и Selectors
для pod и службы.
Правильны ли конечные точки в службе? В этом случае получите доступ к службе и проверьте, доступно ли приложение.
Доступ к службе ClusterIP
ClusterIP
Для службы можно запустить тестовый модуль pod в кластере и получить доступ к IP-адресу службы:
# 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>
Для приложений, прослушивающих другие протоколы, можно установить соответствующие средства в тестовом модуле, например в средстве netcat, а затем проверить подключение к pod приложения, выполнив следующую команду:
# After the packages are installed, test the connectivity to the application pod using netcat/nc command:
nc -z -v <pod-ip-address> <port>
Если предыдущая команда не возвращает соответствующий ответ, проверьте события службы на наличие ошибок.
Доступ к службе LoadBalancer
LoadBalancer
Для службы можно получить доступ к IP-адресу подсистемы балансировки нагрузки извне кластера.
curl -Iv http://<service-ip-address>:<port>
Для приложений, прослушивающих другие протоколы, можно установить соответствующие средства в тестовом модуле, например в средстве netcat, а затем проверить подключение к pod приложения, выполнив следующую команду:
nc -z -v <pod-ip-address> <port>
LoadBalancer
Возвращает ли IP-адрес службы правильный ответ? Если это не так, выполните следующие действия.
Проверьте события службы.
Убедитесь, что группы безопасности сети (NSG), связанные с узлами AKS и подсетью AKS, разрешают входящий трафик через порт службы.
Дополнительные команды для устранения неполадок служб см. в разделе "Отладка служб".
Сценарии, использующие входящий трафик вместо службы
В сценариях, в которых приложение предоставляется с помощью Ingress
ресурса, поток трафика выглядит следующим образом:
Подсистема балансировки нагрузки dns >> клиента >> или ip-адреса >> шлюза приложений контроллера Ingress в службе кластера >> или модулях pod
Здесь также можно применить внутренний подход к устранению неполадок. Дополнительные сведения см. также в ресурсе kubernetes ingress и контроллере входящего трафика:
$ 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
В этом примере содержится Ingress
ресурс, который:
- Прослушивает
myapp.com
узел. - Имеет две
Path
строки, настроенные. - Маршруты к двум
Services
в задней части.
Убедитесь, что внутренние службы запущены и отвечают на порт, упомянутый в описании входящего трафика:
$ 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
Проверьте журналы для модулей pod контроллера входящего трафика, если возникла ошибка:
$ 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
Что делать, если клиент выполняет запросы на имя узла входящего трафика или IP-адрес, но в журналах модуля pod контроллера входящего трафика не отображаются записи? В этом случае запросы могут не достигать кластера, и пользователь может получить сообщение об ошибке Connection Timed Out
.
Еще одна возможность заключается в том, что компоненты на вершине модулей pod ingress, например Load Balancer или Шлюз приложений, не перенаправляют запросы в кластер правильно. Если это верно, можно проверить конфигурацию серверной части этих ресурсов.
Если появится сообщение об ошибке Connection Timed Out
, проверьте группу безопасности сети, связанную с узлами AKS. Кроме того, проверьте подсеть AKS. Это может быть блокировка трафика от подсистемы балансировки нагрузки или шлюза приложений к узлам AKS.
Дополнительные сведения об устранении неполадок входящего трафика (например, Nginx Ingress) см. в статье об устранении неполадок ingress-nginx.
Свяжитесь с нами для получения помощи
Если у вас есть вопросы или вам нужна помощь, создайте запрос в службу поддержки или обратитесь за поддержкой сообщества Azure. Вы также можете отправить отзыв о продукте в сообщество отзывов Azure.
Заявление об отказе от ответственности за контактные данные сторонней организации
Корпорация Майкрософт предоставляет контактные данные сторонних производителей в целях получения дополнительных сведений по данной теме. Эти данные могут быть изменены без предварительного уведомления. Корпорация Майкрософт не гарантирует точность контактных данных сторонних производителей.