AKS에서 Helm을 사용하는 Kubernetes NGINX 수신 컨트롤러 실패

AKS에서 Helm을 사용하는 Kubernetes NGINX 수신 컨트롤러 실패

문서화된 K8 수신 컨트롤러 설정을 진행할 때여기

Helm 명령 단계에서 명령을 디버그 모드로 배치하는 동안 "수신 컨트롤러 생성" 단계를 지나갈 수 없습니다. 단계 중 하나에 시간 초과가 있는 것을 확인했습니다.

사전 설치 실패: 조건을 기다리는 동안 시간이 초과되었습니다.

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/installing-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

기사에 설명된 대로 env 변수 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 차트를 다시 실행하고 컨트롤러가 생성될 때 레지스트리에서 인증을 다시 활성화합니다.

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

버전이나 다른 것을 변경할 필요가 없습니다. 이것은 당신의 하루를 절약할 것입니다. acr 컨테이너 레지스트리가 9초(수신 컨트롤러가 실행되는 시간) 동안 공개적으로 노출되면 핵전쟁이 발생할 것이라고 생각하는 경우 원치 않는 액세스를 방지하기 위해 acr의 네트워킹 섹션에서 알려진 네트워크만 화이트리스트에 추가할 수 있습니다.

관련 정보