在 Kubernetes 的世界裡,Pod、Deployment、Service 和 Ingress 是四個最核心的元件。它們各自扮演不同的角色,但又緊密協作,共同構建出一個完整的應用程式架構。本文將深入介紹這些元件的功能、關係,以及實際應用場景。
Pod 是 Kubernetes 中最小的可部署和管理單位。它就像是一個「容器的家」,可以包含一個或多個緊密相關的容器。
🏠 Pod = 容器的家
├── 📦 主要應用容器 (如 Web 服務)
├── 📦 輔助容器 (如日誌收集器)
└── 💾 共享存儲空間
apiVersion: v1
kind: Pod
metadata:
name: my-app-pod
labels:
app: my-app
version: v1
spec:
containers:
- name: web-server
image: nginx:1.21
ports:
- containerPort: 80
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 200m
memory: 256Mi
- name: log-collector
image: fluentd:latest
volumeMounts:
- name: log-volume
mountPath: /var/log
volumes:
- name: log-volume
emptyDir: {}
Deployment 是 Pod 的管理者,負責確保應用程式按照期望的狀態運行。它就像是一個「智能管家」,會持續監控和維護你的應用程式。
👨💼 Deployment = 應用程式管理者
├── 📊 監控 Pod 健康狀態
├── 🔄 管理滾動更新
├── ⬆️ 處理擴展需求
└── 🛡️ 確保高可用性
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app-deployment
labels:
app: web-app
spec:
replicas: 3 # 期望的 Pod 副本數
selector:
matchLabels:
app: web-app
template:
metadata:
labels:
app: web-app
spec:
containers:
- name: web-server
image: nginx:1.21
ports:
- containerPort: 80
readinessProbe: # 就緒檢查
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe: # 存活檢查
httpGet:
path: /
port: 80
initialDelaySeconds: 15
periodSeconds: 20
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
# 滾動更新策略
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25% # 最多 25% 的 Pod 可以不可用
maxSurge: 25% # 最多可以超出期望副本數的 25%
# 創建 Deployment
kubectl apply -f deployment.yaml
# 查看 Deployment 狀態
kubectl get deployments
kubectl describe deployment web-app-deployment
# 擴展副本數
kubectl scale deployment web-app-deployment --replicas=5
# 更新映像版本
kubectl set image deployment/web-app-deployment web-server=nginx:1.22
# 查看更新狀態
kubectl rollout status deployment/web-app-deployment
# 回滾到上一個版本
kubectl rollout undo deployment/web-app-deployment
# 查看更新歷史
kubectl rollout history deployment/web-app-deployment
Service 是 Kubernetes 的網路抽象層,為一組 Pod 提供穩定的網路端點。它就像是一個「智能路由器」,將流量分發到健康的 Pod 上。
🚦 Service = 網路流量指揮官
├── 🎯 提供穩定的 IP 和 DNS
├── ⚖️ 負載均衡流量分發
├── 🔍 自動發現後端 Pod
└── 💚 健康檢查過濾
apiVersion: v1
kind: Service
metadata:
name: web-app-service
spec:
type: ClusterIP # 集群內部存取
selector:
app: web-app
ports:
- protocol: TCP
port: 80 # Service 端口
targetPort: 80 # Pod 端口
apiVersion: v1
kind: Service
metadata:
name: web-app-nodeport
spec:
type: NodePort
selector:
app: web-app
ports:
- protocol: TCP
port: 80
targetPort: 80
nodePort: 30080 # 節點端口 (30000-32767)
apiVersion: v1
kind: Service
metadata:
name: web-app-loadbalancer
spec:
type: LoadBalancer
selector:
app: web-app
ports:
- protocol: TCP
port: 80
targetPort: 80
apiVersion: v1
kind: Service
metadata:
name: external-database
spec:
type: ExternalName
externalName: database.example.com
# DNS 解析
# 同一命名空間:service-name
# 跨命名空間:service-name.namespace-name.svc.cluster.local
# 環境變數
WEB_APP_SERVICE_HOST=10.96.0.100
WEB_APP_SERVICE_PORT=80
Ingress 是 Kubernetes 的 HTTP/HTTPS 路由規則集合,管理外部流量如何進入集群內的服務。它就像是一個「智能門衛」,根據 URL 路徑和主機名將流量導向正確的服務。
🚪 Ingress = 外部流量入口門衛
├── 🌐 HTTP/HTTPS 路由管理
├── 🔒 SSL/TLS 終止
├── 📍 基於路徑的路由
└── 🏷️ 基於主機名的路由
特性 | Ingress | LoadBalancer Service |
---|---|---|
成本 | 一個 Load Balancer 服務多個應用 | 每個服務一個 Load Balancer |
協議 | HTTP/HTTPS | TCP/UDP |
路由 | 支援路徑和主機名路由 | 僅支援端口路由 |
SSL | 內建 SSL 終止 | 需要額外配置 |
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-app-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-app-service
port:
number: 80
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 8080
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: secure-ingress
spec:
tls:
- hosts:
- myapp.example.com
secretName: myapp-tls-secret
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-app-service
port:
number: 80
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: multi-host-ingress
spec:
rules:
- host: app1.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app1-service
port:
number: 80
- host: app2.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app2-service
port:
number: 80
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: rewrite-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /app(/|$)(.*)
pathType: Prefix
backend:
service:
name: app-service
port:
number: 80
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: aws-alb-ingress
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]'
alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:region:account:certificate/cert-id
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-app-service
port:
number: 80
Internet
↓
Ingress (智能門衛)
↓ (HTTP/HTTPS 路由)
Service (流量指揮官)
↓ (負載均衡)
Deployment (管理者)
↓ (管理)
Pod (容器的家)
↓
Container (應用程式)
1. 用戶請求 → https://myapp.example.com/api/users
2. DNS 解析 → Load Balancer IP
3. Ingress 接收請求 → 檢查 host 和 path
4. Ingress 路由 → 選擇對應的 Service
5. Service 負載均衡 → 選擇健康的 Pod
6. Pod 處理請求 → 返回響應
7. 響應原路返回 → 用戶收到結果
# Deployment 選擇 Pod
spec:
selector:
matchLabels:
app: web-app # 選擇標籤為 app: web-app 的 Pod
# Service 選擇 Pod
spec:
selector:
app: web-app # 選擇標籤為 app: web-app 的 Pod
# Pod 標籤
metadata:
labels:
app: web-app # 被 Deployment 和 Service 選中