你当前正在访问 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 控制器收集日志

  1. 获取正在运行的 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-sdd9talb-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

  2. 收集日志

    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 错误代码的场景如下:

  1. 后端条目无效:在以下场景中,后端被定义为无效:

    • 它引用某种未知或不受支持的资源。 在这种情况下,HTTPRoute 的状态有一个原因设置为 InvalidKind 的条件,而且消息说明哪种资源未知或不受支持。
    • 它引用某个不存在的资源。 在这种情况下,HTTPRoute 的状态有一个原因设置为 BackendNotFound 的条件,而且消息说明该资源不存在。
    • 它引用另一个命名空间中的资源,而 ReferenceGrant(或等效概念)未显式允许该引用。 在这种情况下,HTTPRoute 的状态有一个原因设置为 RefNotPermitted 的条件,而且消息说明不允许哪种交叉命名空间引用。

    例如,如果 HTTPRoute 指定了两个权重相等的后端,而 50% 的流量对其中一个后端无效,则一定会收到 500。

  2. 找不到所有后端的终结点:如果没有为 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 的托管标识的联合凭据,以更改适用于容器的应用程序网关。 有关如何配置联合凭据的说明,请参阅快速入门指南: