在適用於容器的應用程式閘道中進行疑難排解
本文提供一些指引,可協助您針對適用於容器的應用程式閘道常見問題進行疑難排解。
尋找 ALB 控制器的版本
開始進行疑難排解之前,請先判斷已部署的 ALB 控制器版本。 您可以使用下列 kubectl 命令來判斷正在執行哪個 ALB 控制器版本 (如果使用的不是預設命名空間 azure-alb-system
,請確保取代您的命名空間):
kubectl get deployment -n azure-alb-system -o wide
範例輸出︰
NAME | 就緒 | UP-TO-DATE | 可用 | 年齡 | 容器 | 映像 | SELECTOR |
---|---|---|---|---|---|---|---|
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 名稱可能會稍有不同。
NAME 就緒 狀態 重新啟動 年齡 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-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 '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 閘道資源無法從認證鏈結取得權杖
徵兆
未對適用於容器的應用程式閘道套用任何 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\":\"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
解決方案
請確定在 Azure 中設定 ALB 控制器 Pod 的受控識別同盟認證,以變更適用於容器的應用程式閘道。 如需如何設定同盟認證的指示,請參閱快速入門指南: