你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
在适用于容器的应用程序网关中进行故障排除
本文提供了一些指导,可帮助你排查适用于容器的应用程序网关中的常见问题。
查找 ALB 控制器的版本
在开始故障排除之前,请确定已部署的 ALB 控制器的版本。 可以使用以下 kubectl 命令确定哪个版本的 ALB 控制器正在运行(如果使用的不是默认命名空间 azure-alb-system
,请确保替换命名空间):
kubectl get deployment -n azure-alb-system -o wide
示例输出:
名称 | 就绪 | UP-TO-DATE | AVAILABLE | 年龄 | 容器 | 图像 | SELECTOR |
---|---|---|---|---|---|---|---|
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。
可以通过运行 helm upgrade alb-controller
命令来升级 ALB 控制器版本。 有关详细信息,请参阅安装 ALB 控制器。
提示
可以在 ALB 控制器发行说明中找到最新的 ALB 控制器版本。
收集 ALB 控制器日志
可以使用引用 ALB 控制器 Pod 的 kubectl 日志命令从 ALB 控制器收集日志。
获取正在运行的 ALB 控制器 Pod 名称
运行以下 kubectl 命令。 如果使用的不是默认命名空间
azure-alb-system
,请确保替换命名空间:kubectl get pods -n azure-alb-system
应会看到与如下示例类似的输出。 Pod 名称可能稍有不同。
名称 就绪 状态 RESTARTS 年龄 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 控制器使用 controller-runtime 管理器提供的选择来确定活动和备用 Pod,以实现高可用性。
复制每个 alb-controller Pod 的名称(不是启动 Pod,本例中为
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 为主 Pod,则应看到以下内容:
successfully acquired lease azure-alb-system/alb-controller-leader-election
收集日志
ALB 控制器中的日志将以 JSON 格式返回。
执行以下 kubectl 命令,将名称替换为步骤 1 中返回的 Pod 名称:
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 错误代码。
应用程序负载均衡器自定义资源不反映就绪状态
现象
ApplicationLoadBalancer 自定义资源状态消息持续显示“适用于容器的应用程序网关资源 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 '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 网关资源无法从凭据链获取令牌
症状
不对适用于容器的应用程序网关应用任何 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\":\"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
解决方案
确保在 Azure 中配置 ALB 控制器 Pod 的托管标识的联合凭据,以更改适用于容器的应用程序网关。 有关如何配置联合凭据的说明,请参阅快速入门指南: