AKS 上の Helm を使用した Kubernetes NGINX Ingress コントローラーの障害

AKS 上の Helm を使用した Kubernetes NGINX Ingress コントローラーの障害

K8イングレスコントローラのセットアップを実行する際、文書化されているここ

「Ingress コントローラーの作成」のステップを通過できません。Helm コマンドのステップ中にコマンドをデバッグ モードにすると、ステップの 1 つでタイムアウトが発生していることがわかります。

事前インストールに失敗しました: 条件の待機中にタイムアウトしました

K8 PODログを確認したところ、K8システムは認証エラーのためレジストリに接続できないことがわかりました。次の出力はセキュリティ上の理由から変更されていますが、エラーが表示されています。

Failed to pull image "myregistry.azurecr.io/jettech/kube-webhook-certgen:v1.5.1@sha256:...90bd8068": [rpc error: code = NotFound desc = failed to pull and unpack image "....azurecr.io/jettech/kube-webhook-certgen@sha256:....9b9e90bd8068": failed to resolve reference "myregistry.azurecr.io/jettech/kube-webhook-certgen@sha256:...190b1dcbcb9b9e90bd8068": ....azurecr.io/jettech/kube-webhook-certgen@sha256:...9b9e90bd8068: not found, rpc error: code = Unknown desc = failed to pull and unpack image "myregistry.azurecr.io/jettech/kube-webhook-certgen@sha256:...dcbcb9b9e90bd8068": failed to resolve reference "myregistry.azurecr.io/jettech/kube-webhook-certgen@sha256:...b9b9e90bd8068": failed to authorize: failed to fetch anonymous token: unexpected status: 401 Unauthorized]

「az acr import」コマンドに基づいて、イメージがコンテナー レジストリに配置されていること、および「kubectl」を使用して標準の K8 デプロイメントを実行すると、k8 が acr に接続できることを確認しました。また、次のコマンドを使用してクラスターとレジストリ間の接続を確認しましたが、期待どおりに機能します。

az aks check-acr -n <cluster> -g <rg>  --acr <acr>

この障害は、helm コマンドを使用する場合にのみ発生します。

編集

さらに調べてみると、次の記事を見つけました。

https://stackoverflow.com/questions/68949434/nginx-ingress-controller-into-aks-cluster-cant-pull-image-from-azu をインストールしています

ダイジェストに問題があるようです。helm コマンドで以下を追加/置き換えました。

--set controller.image.digest="sha256:e9fb216ace49dfa4a5983b183067e97496e7a8b307d2093f4278cd550c303899" \
--set controller.admissionWebhooks.patch.image.digest="sha256:950833e19ade18cd389d647efb88992a7cc077abedef343fa59e012d376d79b7" \

しかし、修正されたhelmコマンドを実行すると、PODは次のエラーでエラー状態になります。

unknown flag: --controller-class

記事に記載されているように、環境変数 CONTROLLER_TAG=v1.0.0 を設定してみましたが、効果はありませんでした。

別の解決策としては、コマンドにバージョン番号3.36.0を設定することです。これは成功しますが、ダウングレードされたバージョンが必要です。

答え1

MSドキュメントサイトのフィードバックに連絡したところ、このドキュメントに対する次の修正が提供されました。

https://github.com/MicrosoftDocs/azure-docs/issues/80321

変更をロールバックして再適用した後、コマンドは成功しました。重要なのは、 helm uninstall コマンドを使用してポッドを削除することでした。

helm uninstall nginx-ingress --namespace ingress-basic

次に、ACR から ACR リポジトリを削除します。

jettech/kube-webhook-certgen
defaultbackend-amd64
jetstack/cert-manager-controller
jetstack/cert-manager-webhook
jetstack/cert-manager-cainjector

「az acr import」コマンドで作成し、変更したコマンドを再実行します。

誰かがこれを価値あるものと感じてくれることを願う

答え2

ACR コンテナ レジストリの認証をしばらく無効にします。

az acr update --name my-acr-registry-name --anonymous-pull-enabled true

コントローラが作成されたら、Helm Chart を再実行し、レジストリで認証を再度有効にします。

az acr update --name my-acr-registry-name --anonymous-pull-enabled false

バージョンなどを変更する必要はありません。これであなたの一日が救われるでしょう。ACR コンテナ レジストリを 9 秒間 (Ingress コントローラが実行される時間) 公開すると核戦争が起こると考える人は、望ましくないアクセスを防ぐために、ACR のネットワーク セクションで既知のネットワークのみをホワイトリストに登録できます。

関連情報