Skip to content

⚔️ Challenge: The Silent Backend

Chào mừng trở lại phòng chiến sự. Tôi là Lead SRE. Hệ thống Monitoring vừa báo động: Frontend không thể kết nối tới Backend. Khách hàng đang phàn nàn vì lỗi "Connection Refused".

Nhiệm vụ của bạn: Hãy cứu Production.

🚨 The Scenario

DevOps team vừa deploy phiên bản mới.

  • Frontend Pod đang chạy ngon lành.
  • Backend Pod cũng đang Running.
  • Nhưng khi Frontend gọi tới Backend Service, nó nhận được lỗi 502 Bad Gateway hoặc timeout.

Dưới đây là cấu hình YAML hiện tại. Hãy tìm ra nguyên nhân.

💀 The Broken YAMLs

1. Backend Pod

yaml
apiVersion: v1
kind: Pod
metadata:
  name: backend-app
  labels:
    app: api-server   # 👈 Label của Pod
spec:
  containers:
  - name: heavy-app
    image: my-app:v2
    ports:
    - containerPort: 8080 # 👈 Ứng dụng lắng nghe ở port 8080

2. Backend Service

yaml
apiVersion: v1
kind: Service
metadata:
  name: backend-service
spec:
  type: ClusterIP
  selector:
    app: backend-api  # 👈 Service tìm kiếm label này
  ports:
  - port: 80          # 👈 Port của Service (người khác gọi vào)
    targetPort: 80    # 👈 Port mà Service gửi traffic tới Pod

🕵️‍♂️ Investigation (Điều tra)

Bạn cần thực hiện các bước sau (giả lập trong đầu hoặc trên giấy):

  1. Điều gì xảy ra khi bạn chạy lệnh:
    bash
    kubectl get endpoints backend-service
  2. Sau khi sửa lỗi 1, traffic có đi được vào Pod không? Tại sao?

💡 Solution (Đáp án)

Bấm để xem phân tích của Lead SRE

🔍 Bug 1: Label Mismatch (Lỗi Selector)

Triệu chứng: Service không tìm thấy Pod nào cả.

  • Lệnh kubectl get endpoints backend-service sẽ trả về ENDPOINTS: <none>.
  • Nguyên nhân:
    • Pod có label: app: api-server
    • Service tìm label: app: backend-api
    • Hai cái tên khác nhau hoàn toàn. Service giống như một người đưa thư cầm địa chỉ sai, không biết đưa thư cho ai.

👉 Fix: Sửa Selector của Service thành app: api-server.

🔍 Bug 2: Port Mismatch (Lỗi Cổng)

Triệu chứng: Có Endpoints, nhưng vẫn "Connection Refused".

  • Nguyên nhân:
    • Container mở cửa số 8080.
    • Nhưng Service lại cố gắng tống traffic vào cửa số 80 của Container (targetPort: 80).
    • Gói tin đập vào tường và bị từ chối.

👉 Fix: Sửa targetPort của Service thành 8080.

Correct Service YAML

yaml
apiVersion: v1
kind: Service
metadata:
  name: backend-service
spec:
  selector:
    app: api-server    # Match với Pod Label
  ports:
  - port: 80           # App khác gọi vào port 80 (đẹp)
    targetPort: 8080   # Chuyển tiếp vào port 8080 (thực tế)

👉 Next: Storage & Persistence (Module 5)