Nếu Docker là việc đóng gói ứng dụng vào container, Kubernetes là hệ thống điều phối hàng nghìn container đó — tự restart khi crash, scale khi load tăng, và zero-downtime deployment.
Kiến Trúc Kubernetes
- Cluster: Tập hợp các máy (nodes)
- Node: Máy vật lý hoặc VM chạy containers
- Pod: Đơn vị nhỏ nhất, chứa 1+ containers
- Deployment: Quản lý nhiều Pods, đảm bảo số lượng
- Service: Expose Pods ra ngoài, load balance
- Ingress: HTTP routing từ ngoài vào Services
Pod — Đơn Vị Cơ Bản
# pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: blog-pod
spec:
containers:
- name: blog
image: username/blog:latest
ports:
- containerPort: 8000
env:
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: blog-secrets
key: database-url
Deployment — Quản Lý Nhiều Pods
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: blog-deployment
spec:
replicas: 3 # Luôn duy trì 3 pods
selector:
matchLabels:
app: blog
template:
metadata:
labels:
app: blog
spec:
containers:
- name: blog
image: username/blog:latest
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "500m"
readinessProbe:
httpGet:
path: /health/
port: 8000
initialDelaySeconds: 5
Service — Expose Và Load Balance
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: blog-service
spec:
selector:
app: blog
ports:
- port: 80
targetPort: 8000
type: ClusterIP # Internal only
---
# Ingress — HTTP routing từ ngoài
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: blog-ingress
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
rules:
- host: yourdomain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: blog-service
port:
number: 80
ConfigMap Và Secret
# ConfigMap — config không nhạy cảm
kubectl create configmap blog-config --from-literal=DEBUG=False --from-literal=ALLOWED_HOSTS=yourdomain.com
# Secret — credentials nhạy cảm (base64 encoded)
kubectl create secret generic blog-secrets --from-literal=secret-key='your-django-secret-key' --from-literal=database-url='postgres://...'
Các Lệnh Thường Dùng
# Deploy
kubectl apply -f deployment.yaml
# Xem pods
kubectl get pods -w
# Logs
kubectl logs -f deployment/blog-deployment
# Scale
kubectl scale deployment blog-deployment --replicas=5
# Rolling update
kubectl set image deployment/blog-deployment blog=username/blog:v2
# Rollback
kubectl rollout undo deployment/blog-deployment
Kubernetes có learning curve rất dốc. Đừng jump vào K8s nếu docker-compose vẫn đủ dùng. Thích hợp khi có nhiều services, cần auto-scaling, hoặc team có DevOps chuyên trách.
Kết Luận
Kubernetes là công cụ mạnh nhưng có chi phí vận hành cao. Với dự án nhỏ và vừa, Railway, Render, hoặc Fly.io cung cấp trải nghiệm tương tự mà không cần tự quản lý cluster. Chỉ self-host K8s khi có lý do kinh tế hoặc compliance cụ thể.
Chưa có bình luận. Hãy là người đầu tiên!