ducdev
DevOps / Bài viết

Kubernetes Cơ Bản — Orchestration Cho Docker Containers

Docker giải quyết "chạy ở đâu cũng được". Kubernetes giải quyết "chạy bao nhiêu instance, restart khi crash, scale theo load". Hướng dẫn từ Pod đến Deployment và Service.

a
admin
16/08/2025 · 2 phút đọc · 0 lượt xem
Chia sẻ

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ể.

#Kubernetes #Docker #DevOps #Container
a
Tác giả
admin

Lập trình viên, yêu thích chia sẻ kiến thức về công nghệ và phát triển phần mềm.

Bình luận

Chưa có bình luận. Hãy là người đầu tiên!

Để lại bình luận

Bình luận sẽ được duyệt trước khi hiển thị.