Sửa lỗi: Kubernetes MountVolume.SetUp Failed (Không tìm thấy ConfigMap)

beginner☸️ Kubernetes2026-04-06| Kubernetes (Tất cả các phiên bản), Linux/Cloud (EKS, GKE, AKS), kubectl

Error Message

MountVolume.SetUp failed for volume "config-vol" : configmap "app-config" not found
#kubernetes#khắc phục sự cố#configmap#secret#devops

Lỗi

Bạn vừa triển khai một bản deployment mới, nhưng Pod bị kẹt. Nó đã ở trạng thái ContainerCreating trong năm phút và log ứng dụng hoàn toàn trống rỗng. Khi bạn kiểm tra kỹ hơn bằng lệnh kubectl describe pod, bạn có thể sẽ thấy một loạt các sự kiện Warning ở cuối kết quả trả về:

Events:
  Type     Reason       Age                From               Message
  ----     ------       ----               ----               -------
  Warning  FailedMount  12s (x5 over 44s)  kubelet            MountVolume.SetUp failed for volume "config-vol" : configmap "app-config" not found

Về cơ bản, Kubelet trên worker node đang cố gắng mount một ConfigMap hoặc Secret vào hệ thống tệp của container, nhưng tài nguyên đó không tồn tại. Kubernetes sẽ không cho phép container khởi chạy nếu thiếu các phụ thuộc bắt buộc. Nó sẽ liên tục thử lại trong nền với hy vọng tài nguyên đó sẽ xuất hiện.

Nguyên nhân gốc rễ

Thông thường, bạn sẽ gặp phải một trong ba nguyên nhân phổ biến sau:

  • Sai lệch Namespace: Bạn đã tạo ConfigMap trong namespace default, nhưng Pod của bạn đang chạy trong production.
  • Lỗi đánh máy trong YAML: Một lỗi phân biệt chữ hoa chữ thường đơn giản hoặc sai tên trong manifest Deployment của bạn.
  • Thiếu tài nguyên: ConfigMap chưa bao giờ được tạo, hoặc có thể một đồng nghiệp đã xóa nó để dọn dẹp cụm.

Các bước khắc phục sự cố

1. Kiểm tra tài nguyên và Namespace

Các tài nguyên Kubernetes như ConfigMap và Secret được phân chia theo namespace. Chúng không thể được mount xuyên biên giới giữa các namespace. Nếu Pod của bạn nằm trong namespace web-stack, ConfigMap của bạn cũng phải ở đó. Chạy lệnh này để kiểm tra:

# Thay thế 'web-stack' bằng namespace thực tế của bạn
kubectl get configmap app-config -n web-stack

Nếu bạn thấy lỗi Error from server (NotFound), bạn đã tìm thấy vấn đề. Bạn cần tạo lại tài nguyên ở đúng vị trí.

2. Kiểm tra phân biệt chữ hoa chữ thường và lỗi đánh máy

Kubernetes rất khắt khe về việc đặt tên. App-Config không giống với app-config. Hãy mở manifest deployment của bạn và so sánh phần volumes với tên thực tế trong cụm.

# Kiểm tra manifest deployment của bạn
spec:
  volumes:
    - name: config-vol
      configMap:
        name: app-config # <-- Tên này phải khớp chính xác với kết quả 'kubectl get configmap'

3. Tạo ConfigMap bị thiếu

Nếu tài nguyên thực sự bị thiếu, bạn có thể tạo nó ngay lập tức để giải phóng deployment. Ví dụ, nếu ứng dụng của bạn yêu cầu một biến API_URL, hãy chạy:

kubectl create configmap app-config --from-literal=API_URL="https://api.example.com" -n web-stack

Sau khi được tạo, bạn không cần khởi động lại Pod. Kubelet thường thử lại việc mount sau mỗi 10 đến 20 giây. Ngay khi tìm thấy ConfigMap, Pod sẽ tự động chuyển sang trạng thái Running.

4. Sử dụng Optional Mounts

Đôi khi một tệp cấu hình không hoàn toàn bắt buộc để ứng dụng khởi động. Trong những trường hợp này, bạn có thể đánh dấu volume là tùy chọn (optional). Điều này giúp toàn bộ Pod không bị treo nếu ConfigMap bị thiếu hoặc bị xóa.

      volumes:
        - name: config-vol
          configMap:
            name: app-config
            optional: true # <-- Pod sẽ khởi động ngay cả khi thiếu ConfigMap

Còn đối với Secret thì sao?

Logic xử lý hoàn toàn tương tự đối với Secret. Nếu bạn thấy lỗi tham chiếu đến secret "db-password" not found, hãy sử dụng các bước khắc phục tương tự nhưng thay đổi lệnh để nhắm vào secret:

kubectl get secret db-password -n web-stack

Xác minh

Để xác nhận mọi thứ đã hoạt động bình thường, hãy theo dõi trạng thái Pod. Bạn cần tìm thông báo Started container trong nhật ký sự kiện.

kubectl get pods -n web-stack
# Trạng thái bây giờ sẽ là 'Running'

kubectl describe pod <tên-pod> -n web-stack
# Tìm dòng: "Successfully mounted volumes for pod..."

Mẹo phòng ngừa

Các bản sửa lỗi thủ công chỉ là giải pháp tình thế, tự động hóa sẽ giúp ngăn chặn những vấn đề này ngay từ đầu. Hãy đóng gói ConfigMap và Deployment trong cùng một Helm chart hoặc thư mục Kustomize. Điều này đảm bảo chúng luôn được áp dụng đồng bộ như một đơn vị duy nhất. Ngoài ra, sử dụng các công cụ GitOps như ArgoCD sẽ giúp hiển thị các phụ thuộc bị thiếu trên giao diện trực quan trước khi bạn phải can thiệp bằng CLI.

Related Error Notes