Skip to content

⚔️ Challenge: Find the Bug (Module 2)

Chào mừng bạn đến với vòng phỏng vấn kỹ thuật tại HPN. Tôi là Lead Interviewer. Dưới đây là một file Deployment YAML mà Junior DevOps vừa gửi cho tôi để review trước khi deploy lên Production.

Nhiệm vụ của bạn: Tìm ra 3 LỖI CHÍ TỬ trong file này.

  1. Một lỗi khiến Deployment không thể hoạt động (Crash/Hệ thống từ chối).
  2. Một lỗi là thảm họa bảo mật/vận hành.
  3. Một lỗi gây rủi ro về độ ổn định (Stability).

💀 The Broken YAML

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: payment-service
spec:
  replicas: 3
  selector:
    matchLabels:
      app: payment-service  # 👈 Nhìn kỹ chỗ này
  template:
    metadata:
      labels:
        app: payment-svc    # 👈 ...và chỗ này
    spec:
      containers:
      - name: payment
        image: my-registry/payment-api:latest  # 👈 Cái này ổn không?
        ports:
        - containerPort: 8080
        # (Dev note: Em quên cấu hình resources, để sau nhé)

🕵️‍♂️ Solution (Đáp án)

Bấm để xem phân tích của Senior Engineer

1. Fatal Error: Label Mismatch (Lỗi Chết Người)

Vị trí: spec.selector.matchLabels (payment-service) KHÁC VỚI template.metadata.labels (payment-svc).

Hậu quả: Deployment sẽ không bao giờ tìm thấy Pod mà nó vừa tạo ra.

  • Deployment tạo ReplicaSet -> ReplicaSet tạo Pod với label payment-svc.
  • Nhưng ReplicaSet lại được dặn dò là "Chỉ quản lý thằng nào tên payment-service".
  • Kết quả: ReplicaSet thấy chưa có Pod nào đúng tên -> Tạo tiếp -> Tạo tiếp -> Infinite Loop (Vòng lặp vô tận) -> Cluster bị spam hàng nghìn Pod "mồ côi".

2. Production Risk: Using :latest Tag

Vị trí: image: ...:latest.

Hậu quả:

  • Không biết phiên bản nào đang chạy: Hôm nay latest là v1, mai nó là v2 (có bug).
  • Không Rollback được: Cả bản cũ và mới đều tên là latest. K8s sẽ bối rối.
  • Caching: Node có thể cache image cũ và không chịu pull image mới về.

👉 Fix: Luôn dùng version cụ thể (VD: :v1.2.0).

3. Stability Risk: Missing Requests/Limits

Vị trí: Thiếu block resources.

Hậu quả:

  • Pod này được xếp hạng Best Effort (Hạng bét).
  • Khi Node bị thiếu RAM, Pod này sẽ là kẻ đầu tiên bị bắn bỏ (Evicted/OOMKilled).
  • Ngoài ra, nếu code bị lag, nó có thể ăn hết 100% CPU của Node, làm treo các Service khác (Noisy Neighbor).

👉 Fix: BẮT BUỘC định nghĩa requestslimits cho Memory và CPU. 👉 Fix: BẮT BUỘC định nghĩa requestslimits cho Memory và CPU.


👉 Next Module: Service Discovery & CoreDNS Magic