Устранение неполадок в Шлюз приложений для контейнеров
В этой статье приведены некоторые рекомендации по устранению распространенных проблем в Шлюз приложений для контейнеров.
Поиск версии контроллера ALB
Перед началом устранения неполадок определите версию развернутого контроллера балансировки нагрузки. Вы можете определить, какая версия контроллера ALB выполняется с помощью следующей команды kubectl (убедитесь, что вы замените пространство имен, если не используется пространство azure-alb-system
имен по умолчанию):
kubectl get deployment -n azure-alb-system -o wide
Пример результата:
ИМЯ | ГОТОВО | СОВРЕМЕННЫЙ | ДОСТУПНО | ВОЗРАСТ | КОНТЕЙНЕРЫ | ОБРАЗЫ | СЕЛЕКТОР |
---|---|---|---|---|---|---|---|
контроллер alb-controller | 2/2 | 2 | 2 | 18d | контроллер alb-controller | mcr.microsoft.com/application-lb/images/alb-controller:1.2.3 | app=alb-controller |
alb-controller-bootstrap | 1/1 | 1 | 1 | 18d | alb-controller-bootstrap | mcr.microsoft.com/application-lb/images/alb-controller-bootstrap:1.2.3 | app=alb-controller-bootstrap |
В этом примере контроллер ALB версии 1.2.3.
Версию контроллера ALB можно обновить, выполнив helm upgrade alb-controller
команду. Дополнительные сведения см. в разделе "Установка контроллера ALB".
Совет
Последнюю версию контроллера ALB можно найти в заметках о выпуске контроллера ALB.
Сбор журналов контроллера ALB
Журналы можно собирать с контроллера ALB с помощью команды kubectl logs , ссылающейся на pod контроллера ALB.
Получение имени модуля pod контроллера ALB
Выполните следующую команду kubectl. Убедитесь, что вы замените пространство имен, если не используется пространство
azure-alb-system
имен по умолчанию:kubectl get pods -n azure-alb-system
Вы должны увидеть выходные данные, аналогичные следующему примеру. Имена pod могут немного отличаться.
ИМЯ ГОТОВО СОСТОЯНИЕ ПЕРЕЗАПУСКИ ВОЗРАСТ alb-controller-6648c5d5c-sdd9t 1/1 Выполняется 0 4d6h alb-controller-6648c5d5c-au234 1/1 Выполняется 0 4d6h alb-controller-bootstrap-6648c5d5c-hrmpc 1/1 Выполняется 0 4d6h Контроллер ALB использует выборы, предоставляемые диспетчером среды выполнения контроллера, для определения активного и резервного pod для обеспечения высокой доступности.
Скопируйте имя каждого модуля pod alb-controller (а не pod bootstrap, в данном случае и
alb-controller-6648c5d5c-sdd9t
alb-controller-6648c5d5c-au234
) и выполните следующую команду, чтобы определить активный модуль pod.kubectl logs alb-controller-6648c5d5c-sdd9t -n azure-alb-system -c alb-controller | grep "successfully acquired lease"
Если модуль pod является основным, вы увидите следующее:
successfully acquired lease azure-alb-system/alb-controller-leader-election
Сбор журналов
Журналы из контроллера ALB возвращаются в формате JSON.
Выполните следующую команду kubectl, заменив имя на имя pod, возвращенное на шаге 1:
kubectl logs -n azure-alb-system alb-controller-6648c5d5c-sdd9t
Аналогичным образом можно перенаправить выходные данные существующей команды в файл, указав знак больше (>) и имя файла для записи журналов в:
kubectl logs -n azure-alb-system alb-controller-6648c5d5c-sdd9t > alb-controller-logs.json
Ошибки конфигурации
Шлюз приложений для контейнеров возвращает код состояния 500
В сценариях, в которых вы заметите код ошибки 500 на Шлюз приложений для контейнеров, сделайте следующее:
Недопустимые внутренние записи: серверная часть определяется как недопустимая в следующих сценариях:
- Он относится к неизвестному или неподдерживаемому типу ресурса. В этом случае состояние HTTPRoute имеет условие, для которого задано
InvalidKind
значение, и сообщение объясняет, какой тип ресурса неизвестен или не поддерживается. - Он относится к ресурсу, который не существует. В этом случае состояние HTTPRoute имеет условие с заданной причиной
BackendNotFound
, а сообщение объясняет, что ресурс не существует. - Он относится к ресурсу в другом пространстве имен, если ссылка не допускается явным образом с помощью referenceGrant (или эквивалентной концепции). В этом случае состояние HTTPRoute имеет условие с заданной причиной
RefNotPermitted
, а сообщение объясняет, какая ссылка на кросс-пространство имен не разрешена.
Например, если httpRoute имеет две внутренние части, указанные с равными весами, и один недопустим 50 процентов трафика должен получить 500.
- Он относится к неизвестному или неподдерживаемому типу ресурса. В этом случае состояние HTTPRoute имеет условие, для которого задано
Конечные точки не найдены для всех серверных компонентов: если конечные точки не найдены для всех серверных компонентов, на которые ссылается HTTPRoute, получается код ошибки 500.
Настраиваемый ресурс Load Balancer приложения не отражает состояние "Готово"
Симптомы
Сообщение о состоянии настраиваемого ресурса ApplicationLoadBalancer постоянно говорит: "Шлюз приложений для ресурса Application Gateway for Containers-name
контейнеров проходит обновление".
Следующие журналы повторяются основным модулем контроллера alb-controller.
{"level":"info","version":"x.x.x","Timestamp":"2024-02-26T20:31:53.760150719Z","message":"Stream opened for config updates"}
{"level":"info","version":"x.x.x","operationID":"aaaa0000-bb11-2222-33cc-444444dddddd","Timestamp":"2024-02-26T20:31:53.760313623Z","message":"Successfully sent config update request"}
{"level":"error","version":"x.x.x","error":"rpc error: code = PermissionDenied desc = ALB Controller with object id 'aaaa0000-bb11-2222-33cc-444444dddddd' does not have authorization to perform action on Application Gateway for Containers resource.Please check RBAC delegations to the Application Gateway for Containers resource.","Timestamp":"2024-02-26T20:31:53.769444995Z","message":"Unable to capture config update response"}
{"level":"info","version":"x.x.x","Timestamp":"2024-02-26T20:31:53.769504489Z","message":"Retrying to open config update stream"}
{"level":"info","version":"x.x.x","Timestamp":"2024-02-26T20:31:54.461487406Z","message":"Stream opened up for endpoint updates"}
{"level":"info","version":"x.x.x","operationID":"808825c2-b0a8-476b-b83a-8e7357c55750","Timestamp":"2024-02-26T20:31:54.462070039Z","message":"Successfully sent endpoint update request"}
{"level":"error","version":"x.x.x","error":"rpc error: code = PermissionDenied desc = ALB Controller with object id 'aaaa0000-bb11-2222-33cc-444444dddddd' does not have authorization to perform action on Application Gateway for Containers resource.Please check RBAC delegations to the Application Gateway for Containers resource.","Timestamp":"2024-02-26T20:31:54.470728646Z","message":"Unable to capture endpoint update response"}
{"level":"info","version":"x.x.x","Timestamp":"2024-02-26T20:31:54.47077373Z","message":"Retrying to open up endpoint update stream"}
Ресурс шлюза Kubernetes не может получить маркер из цепочки учетных данных
Симптомы
Изменения в HttpRoute не применяются к Шлюз приложений для контейнеров.
Следующее сообщение об ошибке возвращается в ресурсе шлюза Kubernetes, и изменения не отражаются для любых ресурсов HttpRoute.
status:
conditions:
- lastTransitionTime: "2023-04-28T22:08:34Z"
message: The Gateway is not scheduled
observedGeneration: 2
reason: Scheduled
status: "False"
type: Scheduled
- lastTransitionTime: "2023-04-28T22:08:34Z"
message: "No addresses have been assigned to the Gateway : failed to get token
from credential chain: [FromAssertion(): http call(https://login.microsoftonline.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/oauth2/v2.0/token)(POST)
error: reply status code was 401:\n{\"error\":\"unauthorized_client\",\"error_description\":\"AADSTS70021:
No matching federated identity record found for presented assertion. Assertion
Issuer: 'https://azureregion.oic.prod-aks.azure.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/'.
Assertion Subject: 'system:serviceaccount:azure-application-lb-system:gateway-controller-sa'.
Assertion Audience: 'api://AzureADTokenExchange'. https://docs.microsoft.com/en-us/azure/active-directory/develop/workload-identity-federation\\r\\nTrace
ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\\r\\nCorrelation ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\\r\\nTimestamp:
2023-04-28 22:08:46Z\",\"error_codes\":[70021],\"timestamp\":\"2023-04-28 22:08:46Z\",\"trace_id\":\"aaaa0000-bb11-2222-33cc-444444dddddd\",\"correlation_id\":\"aaaa0000-bb11-2222-33cc-444444dddddd\",\"error_uri\":\"https://login.microsoftonline.com/error?code=70021\"}
DefaultAzureCredential: failed to acquire a token.\nAttempted credentials:\n\tEnvironmentCredential:
incomplete environment variable configuration. Only AZURE_TENANT_ID and AZURE_CLIENT_ID
are set\n\tManagedIdentityCredential: IMDS token request timed out\n\tAzureCLICredential:
fork/exec /bin/sh: no such file or directory]"
observedGeneration: 2
reason: AddressNotAssigned
status: "False"
type: Ready
Решение
Убедитесь, что федеративные учетные данные управляемого удостоверения для модуля pod контроллера балансировки нагрузки позволяют вносить изменения в Шлюз приложений для контейнеров в Azure. Инструкции по настройке федеративных учетных данных см. в кратких руководствах.