Skip to content

Instantly share code, notes, and snippets.

@j796160836
Created July 3, 2025 17:00
Show Gist options
  • Save j796160836/23ecdb1279637da3c676635f53f92d06 to your computer and use it in GitHub Desktop.
Save j796160836/23ecdb1279637da3c676635f53f92d06 to your computer and use it in GitHub Desktop.
KCD Taipei 2025 CLBO Contest: CrashLoopBackOffService

微服務前後端依賴順序部署

KCD Taipei 2025 CLBO 挑戰賽

🎯 挑戰題目

您需要部署一個包含兩個微服務的應用程式:backend-servicefrontend-service
frontend-service 依賴於 backend-service 的啟動。
然而,當前提供的部署配置,出了一點問題,導致 frontend-service 持續 CrashLoopBackOff

🧩 挑戰任務

  1. 從零部署一個 Kubernetes 叢集 (至少單節點)。 選擇您熟悉的任何 Kubernetes Distribution
    (例如:kind, k3s, minikube, kubeadm)。
  2. 部署提供的應用程式 Manifests。
  3. 診斷 CrashLoopBackOff 問題。 找出根本原因,並分析其為不佳實踐。
  4. 修正問題並應用最佳實踐。
    • 修正問題,避免直接依賴服務啟動順序,或使用適當的機制確保依賴就緒。
    • 為兩個服務都配置合理的 Liveness 和 Readiness Probes。
    • 為兩個服務都配置合理的資源請求 (requests) 和限制 (limits)。
    • 確保服務間的通訊安全和穩定。
  5. 驗證兩個服務都成功運行並可互相通訊。

參考文件:
https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/

預計花費時間: 20 - 25 分鐘

預覽圖(修復前的樣子)

# kubectl get pod,service 
NAME                                    READY   STATUS             RESTARTS         AGE
pod/backend-service-b57db99bd-tj5xs     0/1     Running            0                35m
pod/frontend-service-769998d5f6-pcfg6   0/1     CrashLoopBackOff   5 (3m59s ago)    35m

NAME                      TYPE           CLUSTER-IP        EXTERNAL-IP     PORT(S)        AGE
service/backend-service   ClusterIP      192.168.194.188   <none>          80/TCP         35m
# backend-service.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend-service
labels:
app: backend-service
spec:
replicas: 1
selector:
matchLabels:
app: backend-service
template:
metadata:
labels:
app: backend-service
spec:
containers:
- name: backend-service
image: nginxdemos/hello:plain-text
ports:
- containerPort: 80
readinessProbe:
httpGet:
path: /
port: 3000
initialDelaySeconds: 2
periodSeconds: 5
timeoutSeconds: 1
failureThreshold: 2
resources:
limits:
memory: "64Mi"
cpu: "50m"
requests:
memory: "32Mi"
cpu: "25m"
---
apiVersion: v1
kind: Service
metadata:
name: backend-service
spec:
selector:
app: backend-service
ports:
- protocol: TCP
port: 80
targetPort: 80
---
# frontend-service.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend-service
labels:
app: frontend-service
spec:
replicas: 1
selector:
matchLabels:
app: frontend-service
template:
metadata:
labels:
app: frontend-service
spec:
containers:
- name: frontend-service
image: busybox
# 這裡直接依賴 backend-service 可用,且沒有任何重試機制
command: ["sh", "-c", "while true; do wget -q -O- http://backend-service:80 || exit 1; sleep 5; done"]
resources:
limits:
memory: "64Mi"
cpu: "50m"
requests:
memory: "32Mi"
cpu: "25m"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment