컨테이너용 Application Gateway의 문제 해결
이 문서에는 컨테이너용 Application Gateway의 일반적인 문제를 해결하는 데 도움이 되는 몇 가지 참고 자료가 나와 있습니다.
ALB 컨트롤러 버전 찾기
문제 해결을 시작하기 전에 배포된 ALB 컨트롤러의 버전을 확인합니다. kubectl 명령을 사용하여 실행 중인 ALB 컨트롤러 버전을 확인할 수 있습니다(azure-alb-system
기본 네임스페이스를 사용하지 않는 경우 네임스페이스를 대체해야 함).
kubectl get deployment -n azure-alb-system -o wide
예제 출력:
이름 | READY | 최신 | 사용 가능 | 나이 | 컨테이너 | 이미지 | 선택기 |
---|---|---|---|---|---|---|---|
alb-controller | 2/2 | 2 | 2 | 18d | alb-controller | mcr.microsoft.com/application-lb/images/alb-controller:1.3.7 | app=alb-controller |
alb-controller-bootstrap | 1/1 | 1 | 1 | 18d | alb-controller-bootstrap | mcr.microsoft.com/application-lb/images/alb-controller-bootstrap:1.3.7 | app=alb-controller-bootstrap |
이 예제에서 ALB 컨트롤러 버전은 1.3.7입니다.
helm upgrade alb-controller
명령을 실행하여 ALB 컨트롤러 버전을 업그레이드할 수 있습니다. 자세한 내용은 ALB 컨트롤러 설치를 참조하세요.
팁
최신 ALB 컨트롤러 버전은 ALB 컨트롤러 릴리스 정보에서 찾을 수 있습니다.
ALB 컨트롤러 로그 수집
ALB 컨트롤러 Pod를 참조하는 kubectl logs 명령을 사용하여 ALB 컨트롤러에서 로그를 수집할 수 있습니다.
실행 중인 ALB 컨트롤러 Pod 이름 가져오기
다음 kubectl 명령을 실행합니다
azure-alb-system
기본 네임스페이스를 사용하지 않는 경우 네임스페이스를 대체해야 합니다.kubectl get pods -n azure-alb-system
다음 예제와 비슷한 내용이 출력됩니다. Pod 이름은 약간 다를 수도 있습니다.
이름 READY 상태 다시 시작 나이 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를 결정합니다.
각 alb 컨트롤러 Pod의 이름(이 경우
alb-controller-6648c5d5c-sdd9t
및alb-controller-6648c5d5c-au234
부트스트랩 Pod 아님)을 복사하고 다음 명령을 실행하여 활성 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 형식으로 반환됩니다.
1단계에서 반환된 Pod 이름으로 이름을 바꿔서 다음 kubectl 명령을 실행합니다.
kubectl logs -n azure-alb-system alb-controller-6648c5d5c-sdd9t
마찬가지로, 더 큰 기호(>)와 로그를 쓸 파일 이름을 지정하여 기존 명령의 출력을 파일로 리디렉션할 수 있습니다.
kubectl logs -n azure-alb-system alb-controller-6648c5d5c-sdd9t > alb-controller-logs.json
구성 오류
컨테이너용 Application Gateway는 500 상태 코드를 반환합니다.
컨테이너용 Application Gateway에서 500 오류 코드를 확인할 수 있는 시나리오는 다음과 같습니다.
잘못된 백 엔드 항목: 백 엔드는 다음 시나리오에서 잘못된 것으로 정의됩니다.
- 알 수 없거나 지원되지 않는 종류의 리소스를 나타냅니다. 이 경우 HTTPRoute의 상태에는 이유가
InvalidKind
로 설정된 조건이 있으며, 메시지로 알 수 없거나 지원되지 않는 리소스 종류를 설명합니다. - 존재하지 않는 리소스를 참조합니다. 이 경우 HTTPRoute의 상태에는 이유가
BackendNotFound
로 설정된 조건이 있으며, 메시지로 리소스가 존재하지 않음을 설명합니다. - 참조가 ReferenceGrant(또는 이에 상응하는 개념)에서 명시적으로 허용되지 않는 경우 다른 네임스페이스의 리소스를 참조합니다. 이 경우 HTTPRoute의 상태에는 이유가
RefNotPermitted
로 설정된 조건이 있으며, 메시지로 네임스페이스 간 참조가 허용되지 않음을 설명합니다.
예를 들어 HTTPRoute에 가중치가 동일하게 지정된 백 엔드가 두 개 있고 트래픽의 50%가 잘못된 경우 500을 수신해야 합니다.
- 알 수 없거나 지원되지 않는 종류의 리소스를 나타냅니다. 이 경우 HTTPRoute의 상태에는 이유가
모든 백 엔드에 대한 엔드포인트를 찾을 수 없음: HTTPRoute에서 참조되는 모든 백 엔드에 대한 엔드포인트를 찾을 수 없는 경우 500 오류 코드를 가져옵니다.
Application Load Balancer 사용자 지정 리소스가 준비 상태를 반영하지 않음
증상
ApplicationLoadBalancer 사용자 지정 리소스 상태 메시지에는 "컨테이너용 Application Gateway 리소스 Application Gateway for Containers-name
이 업데이트 중입니다."라고 계속 표시됩니다.
다음 로그는 기본 alb-controller Pod에서 반복됩니다.
{"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 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb' 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 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb' 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 게이트웨이 리소스가 자격 증명 체인에서 토큰을 가져오지 못함
증상
컨테이너용 Application Gateway에는 HttpRoutes 변경 내용이 적용되지 않습니다.
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\":\"0000aaaa-11bb-cccc-dd22-eeeeee333333\",\"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
솔루션
컨테이너용 Application Gateway를 변경하려면 ALB 컨트롤러 Pod용 관리 ID의 페더레이션된 자격 증명이 Azure에서 구성되었는지 확인합니다. 페더레이션된 자격 증명을 구성하는 방법에 대한 지침은 다음의 빠른 시작 가이드에서 찾을 수 있습니다.