Kubernetes Cơ Bản — Container Orchestration Cho Developer
Làm quen với Kubernetes: Pod, Deployment, Service, Ingress — đủ để deploy ứng dụng lên cluster.
Kubernetes (K8s) là nền tảng orchestration container phổ biến nhất. Nó quản lý việc deploy, scale, và vận hành container tự động.
Kiến Trúc#
┌─────────────────────────────────┐
│ Master Node │
│ ┌───────┐ ┌───────┐ ┌───────┐ │
│ │ API │ │Scheduler│ │Controller│
│ │ Server│ │ │ │ Manager │ │
│ └───┬───┘ └───────┘ └───────┘ │
│ │ │
│ ┌───┴───┐ │
│ │ etcd │ (cluster state) │
│ └───────┘ │
└──────────┬──────────────────────┘
│
┌──────┴──────┐
│ Worker Node │
│ ┌──────────┐ │
│ │ Pod │ │
│ │ ┌──────┐ │ │
│ │ │Container│ │
│ │ └──────┘ │ │
│ └──────────┘ │
│ ┌──────────┐ │
│ │ kubelet │ │
│ └──────────┘ │
└─────────────┘plaintextPod — Đơn Vị Nhỏ Nhất#
Pod là 1 hoặc nhiều container chạy cùng nhau, share network và storage.
apiVersion: v1
kind: Pod
metadata:
name: my-app
labels:
app: my-app
spec:
containers:
- name: app
image: myapp:latest
ports:
- containerPort: 3000yaml# Tạo pod
kubectl apply -f pod.yaml
# Xem pod
kubectl get pods
kubectl describe pod my-app
kubectl logs my-app
# Exec vào pod
kubectl exec -it my-app -- sh
# Xóa pod
kubectl delete pod my-appbashDeployment — Quản Lý Pod#
Không dùng Pod trực tiếp — dùng Deployment. Deployment đảm bảo số lượng pod mong muốn luôn chạy.
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: app
image: myapp:latest
ports:
- containerPort: 3000
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "256Mi"
livenessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 5
periodSeconds: 10yaml# Scale
kubectl scale deployment my-app --replicas=5
# Rolling update
kubectl set image deployment/my-app app=myapp:v2
# Rollback
kubectl rollout undo deployment/my-app
# Xem rollout status
kubectl rollout status deployment/my-appbashService — Kết Nối Vào Pod#
Pod có thể chết và tạo lại với IP mới. Service cung cấp một IP/domain ổn định.
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
selector:
app: my-app
ports:
- port: 80
targetPort: 3000
type: ClusterIP # Chỉ truy cập trong clusteryaml# LoadBalancer — expose ra ngoài (cloud)
apiVersion: v1
kind: Service
metadata:
name: my-app-lb
spec:
selector:
app: my-app
ports:
- port: 80
targetPort: 3000
type: LoadBalanceryamlIngress — HTTP Routing#
Service LoadBalancer mỗi cái một IP — Ingress cho phép routing theo domain/path:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app-ingress
spec:
rules:
- host: app.example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80yamlConfigMap & Secret — Cấu Hình#
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
NODE_ENV: production
LOG_LEVEL: info
---
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
stringData:
DATABASE_URL: postgres://user:pass@db:5432/myappyaml# Dùng trong Deployment
spec:
containers:
- envFrom:
- configMapRef:
name: app-config
- secretRef:
name: db-secretyamlPersistentVolume — Lưu Trữ Dữ Liệu#
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: data-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
---
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- volumeMounts:
- mountPath: /data
name: storage
volumes:
- name: storage
persistentVolumeClaim:
claimName: data-pvcyamlKubectl — Lệnh Cần Nhớ#
# Cluster
kubectl cluster-info
kubectl get nodes
# Pods
kubectl get pods -w # Watch mode
kubectl get pods -o wide # Chi tiết hơn (IP, node)
kubectl logs -f deployment/my-app # Follow logs
# Debug
kubectl port-forward pod/my-app 3000:3000 # Forward port local
kubectl exec -it pod/my-app -- sh
kubectl describe pod my-app # Xem events, lý do crash
# Namespace
kubectl get pods -n production
kubectl config set-context --current --namespace=production
# Tài nguyên
kubectl top pods
kubectl top nodesbashHelm — Package Manager#
# Install Helm chart
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install my-postgres bitnami/postgresql
# Tạo chart riêng
helm create my-app
# Chart.yaml, values.yaml, templates/bashK8s Cho Dev — Minikube#
# Local cluster
minikube start --cpus=4 --memory=8192
minikube dashboard # UI
# Dùng Docker images local
eval $(minikube docker-env)
docker build -t myapp:dev .bashKết Luận#
Kubernetes phức tạp — nhưng chỉ cần nắm Pod, Deployment, Service, Ingress là đủ để deploy ứng dụng. Bắt đầu với Minikube, deploy app đơn giản, rồi nâng dần.
Nhớ: K8s giải quyết vấn đề orchestration ở quy mô lớn. Nếu bạn chỉ có 1-2 server, Docker Compose là đủ.