← Về danh sách bài học Bài 6/25

📂 Bài 6: Namespace - Phân Chia Môi Trường

⏱️ Thời gian: 20 phút | 📚 Độ khó: Dễ

🎯 Sau bài học này, bạn sẽ:

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)

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ơn
brew 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.

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