← Về danh sách bài học
Bài 6/25
📂 Bài 6: Namespace - Phân Chia Môi Trường
🎯 Sau bài học này, bạn sẽ:
- Hiểu Namespace là gì và khi nào dùng
- Tạo và quản lý Namespaces
- Thiết lập Resource Quota
- Chuyển đổi context giữa namespaces
1. Namespace Là Gì?
Namespace là cách phân chia cluster thành các "vùng" logic. Giống như folder trong filesystem.
📌 Dùng Namespace để:
• Phân chia môi trường: dev, staging, production
• Phân chia theo team/project
• Giới hạn resource cho từng vùng
• Áp dụng RBAC (quyền truy cập)
• Phân chia môi trường: dev, staging, production
• Phân chia theo team/project
• Giới hạn resource cho từng vùng
• Áp dụng RBAC (quyền truy cập)
Namespaces mặc định
kubectl get namespaces
# NAME STATUS AGE
# default Active 7d # Namespace mặc định
# kube-system Active 7d # System pods (DNS, scheduler...)
# kube-public Active 7d # Public, readable by all
# kube-node-lease Active 7d # Node heartbeats
2. Tạo Namespace
Cách 1: Command line
# Tạo namespace
kubectl create namespace dev
kubectl create namespace staging
kubectl create namespace production
Cách 2: YAML file
# namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: dev
labels:
environment: development
team: backend
kubectl apply -f namespace.yaml
3. Làm Việc Với Namespace
# Xem resources trong namespace cụ thể
kubectl get pods -n dev
kubectl get all -n dev
# Tạo resource trong namespace
kubectl run nginx --image=nginx -n dev
kubectl apply -f deployment.yaml -n dev
# Xem tất cả namespaces
kubectl get pods --all-namespaces
kubectl get pods -A # Viết tắt
# Đặt namespace mặc định (thay vì -n mỗi lần)
kubectl config set-context --current --namespace=dev
# Kiểm tra namespace hiện tại
kubectl config view --minify | grep namespace
💡 Tip: Cài
kubectx + kubens để chuyển context/namespace
nhanh hơnbrew install kubectx (macOS)
4. Chỉ Định Namespace Trong YAML
# deployment-dev.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
namespace: dev # Chỉ định namespace
spec:
replicas: 2
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:1.24
5. Resource Quota
Giới hạn tài nguyên cho namespace để tránh team này "ăn" hết resource của team khác.
# resource-quota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: dev-quota
namespace: dev
spec:
hard:
requests.cpu: "4" # Tổng CPU request tối đa
requests.memory: 4Gi # Tổng memory request tối đa
limits.cpu: "8" # Tổng CPU limit tối đa
limits.memory: 8Gi # Tổng memory limit tối đa
pods: "20" # Số pods tối đa
services: "10" # Số services tối đa
persistentvolumeclaims: "5" # Số PVC tối đa
# Apply
kubectl apply -f resource-quota.yaml
# Kiểm tra usage
kubectl describe resourcequota dev-quota -n dev
# Output:
# Name: dev-quota
# Namespace: dev
# Resource Used Hard
# -------- ---- ----
# limits.cpu 500m 8
# limits.memory 256Mi 8Gi
# pods 2 20
# requests.cpu 200m 4
# requests.memory 128Mi 4Gi
6. Limit Range
Đặt default và limit cho từng container trong namespace.
# limit-range.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: dev-limits
namespace: dev
spec:
limits:
- type: Container
default: # Default limits nếu không chỉ định
cpu: "500m"
memory: "256Mi"
defaultRequest: # Default requests
cpu: "100m"
memory: "64Mi"
max: # Giới hạn tối đa mỗi container
cpu: "2"
memory: "1Gi"
min: # Tối thiểu
cpu: "50m"
memory: "32Mi"
⚠️ Khi ResourceQuota được set:
Tất cả pods trong namespace bắt buộc phải có resources.requests và resources.limits. Dùng LimitRange để set default.
Tất cả pods trong namespace bắt buộc phải có resources.requests và resources.limits. Dùng LimitRange để set default.
7. Xóa Namespace
# Xóa namespace (XÓA TẤT CẢ resources trong đó!)
kubectl delete namespace dev
# ⚠️ Cẩn thận: Tất cả pods, services, deployments... sẽ bị xóa!
📝 Tóm Tắt Bài Học
- Namespace phân chia cluster thành các vùng logic
- Mặc định có: default, kube-system, kube-public
-n <namespace>để chỉ định namespace- ResourceQuota: Giới hạn tổng resource của namespace
- LimitRange: Default và limit cho mỗi container