Sửa lỗi Kubernetes: failed calling webhook "validate.nginx.ingress.kubernetes.io"

intermediate☸️ Kubernetes2026-06-15| Cụm Kubernetes (mọi phiên bản), NGINX Ingress Controller được cài đặt qua Helm hoặc Manifest

Error Message

Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": service "ingress-nginx-controller-admission" not found
#kubernetes#webhook#nginx-ingress#devops

Khi quá trình triển khai gặp bế tắcLuồng CI/CD của bạn đang chạy trơn tru cho đến khi lệnh kubectl apply đột ngột treo trong 30 giây và thất bại. Thay vì triển khai thành công, Kubernetes API server ném ra một lỗi nội bộ cụ thể, chặn tất cả các tài nguyên Ingress mới. Lỗi trông như thế này:

Error from server (InternalError): Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": service "ingress-nginx-controller-admission" not found

Lỗi này thường xuất hiện sau khi bạn cố gắng gỡ cài đặt hoặc nâng cấp NGINX Ingress Controller. Nó gây khó chịu vì nó tham chiếu đến một service không còn tồn tại, nhưng lại có khả năng dừng các bản cập nhật hạ tầng của bạn.

"Bóng ma" trong API ServerAdmission controller đóng vai trò là người gác cổng cho cụm của bạn. Trước khi bất kỳ đối tượng nào được lưu vào cơ sở dữ liệu etcd, các controller này sẽ kiểm tra yêu cầu. NGINX sử dụng một ValidatingWebhookConfiguration để đảm bảo YAML của Ingress không có lỗi cú pháp có thể làm hỏng controller.

Sự cố xảy ra khi bạn xóa các pod hoặc service của NGINX nhưng vẫn để lại cấu hình webhook toàn cục. Vì failurePolicy mặc định được đặt thành Fail, API server sẽ từ chối chấp nhận mọi thay đổi của Ingress nếu nó không nhận được "đèn xanh" từ bộ xác thực. Nó chọn cách "đóng lại khi lỗi" (fail closed) để ngăn chặn các cấu hình có khả năng không hợp lệ xâm nhập vào cụm.

Giải pháp 1: Loại bỏ Webhook bị dư thừaNếu bạn đã gỡ cài đặt NGINX Ingress hoặc đang chuyển sang một controller khác, bạn cần xóa cấu hình cũ. Đây là cách khắc phục phổ biến nhất cho 90% người dùng.

1. Tìm "thủ phạm"Chạy lệnh này để xem các webhook nào hiện đang hoạt động trong cụm của bạn:

kubectl get validatingwebhookconfigurations

Tìm một mục có tên ingress-nginx-admission. Trong một số Helm chart cũ, nó có thể chỉ được đặt tên là ingress-nginx.

2. Xóa cấu hìnhXóa đối tượng toàn cục này. Vì đây không phải là tài nguyên theo namespace, bạn có thể chạy lệnh từ bất kỳ đâu:

kubectl delete validatingwebhookconfigurations ingress-nginx-admission

Sau khi xóa, API server sẽ ngừng cố gắng gọi đến admission service không tồn tại. Các lệnh kubectl apply của bạn sẽ bắt đầu hoạt động ngay lập tức.

Giải pháp 2: Sửa chữa bản cài đặt bị hỏngĐôi khi bạn không có ý định xóa NGINX, nhưng một lần nâng cấp Helm đã gặp trục trặc. Nếu các pod Ingress đang chạy nhưng admission service bị thiếu, bạn cần khôi phục kết nối.

1. Xác minh serviceKiểm tra xem admission service có tồn tại trong namespace ingress-nginx hay không:

kubectl get svc -n ingress-nginx

2. Buộc Helm làm mớiNếu thiếu service, hãy yêu cầu Helm tạo lại các thành phần bị thiếu. Sử dụng lệnh này để đảm bảo các flag của webhook được thiết lập rõ ràng:

helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx \n  --namespace ingress-nginx \n  --set controller.admissionWebhooks.enabled=true

Lệnh này đồng bộ hóa cấu hình webhook với trạng thái thực tế của các service, khắc phục tình trạng mất kết nối "không tìm thấy service".

Giải pháp 3: Bỏ qua khẩn cấpGiả sử bây giờ là 2 giờ sáng và bạn cần đẩy một bản sửa lỗi quan trọng, nhưng bạn không thể tìm ra lý do tại sao admission service bị hỏng. Bạn có thể tạm thời yêu cầu Kubernetes bỏ qua lỗi của webhook.

Mở cấu hình để chỉnh sửa:

kubectl edit validatingwebhookconfigurations ingress-nginx-admission

Tìm failurePolicy và thay đổi từ Fail thành Ignore:

webhooks:\n- name: validate.nginx.ingress.kubernetes.io\n  failurePolicy: Ignore\n  # ...

Sau khi lưu, API server vẫn sẽ cố gắng gọi webhook. Tuy nhiên, khi cuộc gọi thất bại, nó sẽ đơn giản bỏ qua bước xác thực và cho phép tài nguyên của bạn được tạo.

Xác minh và Phòng ngừaXác nhận việc sửa lỗi bằng cách áp dụng một Ingress thử nghiệm hoặc bản triển khai gốc của bạn. Nếu lệnh trả về configured hoặc unchanged mà không bị trễ, tình trạng tắc nghẽn đã hết. Để tránh điều này trong tương lai, hãy tuân theo hai quy tắc sau:

  • Không bao giờ xóa namespace thủ công: Luôn sử dụng helm uninstall. Việc xóa thủ công thường bỏ qua các tài nguyên toàn cục như webhook và CRD.- Theo dõi độ trễ của Webhook: Sử dụng Prometheus để theo dõi admissions_webhook_admission_duration_seconds. Các mức tăng đột ngột thường là tín hiệu cho thấy admission controller của bạn đang gặp khó khăn trước khi nó thực sự thất bại.

Related Error Notes