Bỏ qua

19.namespace

1. Namespace là gì? "Ngôi nhà" riêng trong cụm Kubernetes 🏡

Hãy tưởng tượng cụm Kubernetes của bạn là một thành phố. Thay vì để tất cả mọi người sống chung trong một khu vực hỗn loạn, bạn có thể xây nhiều "ngôi nhà" (Namespaces) riêng biệt.

  • Mỗi "ngôi nhà" (Namespace) có thể chứa các tài nguyên riêng của nó (Pods, Deployments, Services,...).
  • Trong cùng một nhà: Mọi người (tài nguyên) có thể gọi nhau bằng tên (ví dụ: web-pod có thể gọi db-service chỉ bằng tên db-service).
  • Gọi sang nhà hàng xóm: Nếu muốn gọi một người ở nhà khác, bạn phải dùng "địa chỉ đầy đủ" của họ (ví dụ: db-service.dev).
  • Mỗi nhà có luật riêng: Bạn có thể đặt ra các chính sách (Policies) và giới hạn tài nguyên (Resource Quotas) cho từng nhà.

Về cơ bản, Namespaces cho phép bạn tạo ra các cụm ảo (virtual clusters) bên trong một cụm Kubernetes vật lý duy nhất.


2. Các Namespace Mặc định

Khi một cụm Kubernetes được tạo, nó sẽ có sẵn 3 Namespace:

  • default: Đây là "ngôi nhà" mặc định. Nếu bạn tạo tài nguyên mà không chỉ định namespace, nó sẽ được tạo ở đây.
  • kube-system: "Phòng kỹ thuật" của Kubernetes. Nơi chứa các thành phần hệ thống cốt lõi như DNS, kube-proxy,... Bạn không nên "đụng" vào namespace này.
  • kube-public: Nơi chứa các tài nguyên cần được công khai và có thể đọc được bởi tất cả người dùng trong cụm.

3. Tại sao và Khi nào nên dùng Namespace?

  • Khi học hoặc dùng cho dự án nhỏ: Dùng namespace default là đủ.
  • Trong môi trường doanh nghiệp/production: Namespace cực kỳ quan trọng để:
  • Cô lập các môi trường: Tạo các namespace riêng cho dev, production, testing... trên cùng một cụm. Điều này giúp team dev không vô tình làm ảnh hưởng đến môi trường production.
  • Quản lý tài nguyên: Áp dụng Resource Quotas để giới hạn lượng CPU, Memory, số lượng Pod,... mà mỗi namespace được phép sử dụng.

4. Giao tiếp "Hàng xóm" (Giữa các Namespace)

  • Trong cùng Namespace: Một Pod có thể gọi một Service chỉ bằng tên của Service đó.
  • Khác Namespace: Một Pod phải sử dụng Tên miền đầy đủ (Fully Qualified Domain Name - FQDN).
  • Cú pháp: <tên-service>.<tên-namespace>.svc.cluster.local
  • Ví dụ: Một Pod ở namespace default muốn gọi db-service ở namespace dev thì sẽ dùng địa chỉ: db-service.dev.svc.cluster.local.

5. "Đồ nghề" kubectl để làm việc với Namespace

  • Xem tài nguyên trong một namespace cụ thể:
    kubectl get pods --namespace kube-system
    # Hoặc viết tắt:
    kubectl get pods -n kube-system
    
  • Xem tài nguyên trong TẤT CẢ các namespace:
    kubectl get pods --all-namespaces
    
  • Tạo tài nguyên trong một namespace cụ thể:
  • Cách 1 (Dùng cờ): kubectl create -f pod.yaml -n dev
  • Cách 2 (Khai báo trong YAML - Khuyến khích): Thêm trường namespace: dev vào phần metadata.
    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
      namespace: dev # <-- Luôn tạo trong namespace 'dev'
    
  • Tạo một Namespace mới:
  • kubectl create namespace dev
  • Chuyển "Nhà" (Thay đổi namespace làm việc mặc định):
  • Để không phải gõ -n dev mỗi lần, bạn có thể chuyển context hiện tại sang làm việc với namespace dev.
  • kubectl config set-context --current --namespace=dev
  • Sau lệnh này, kubectl get pods sẽ tự động liệt kê các pod trong namespace dev.

6. Resource Quota - "Quản gia ngân sách" cho từng Namespace 💰

Resource Quota giống như một "quản gia ngân sách" được giao nhiệm vụ kiểm soát và giới hạn tài nguyên mà mỗi namespace được phép sử dụng.

6.1. Resource Quota có thể giới hạn gì?

  • Tài nguyên tính toán: - requests.cpu: Tổng CPU request của tất cả Pod - requests.memory: Tổng Memory request của tất cả Pod - limits.cpu: Tổng CPU limit của tất cả Pod - limits.memory: Tổng Memory limit của tất cả Pod
  • Số lượng đối tượng: - count/pods: Số lượng Pod tối đa - count/services: Số lượng Service tối đa - count/persistentvolumeclaims: Số lượng PVC tối đa

6.2. Ví dụ Resource Quota

apiVersion: v1
kind: ResourceQuota
metadata:
  name: dev-quota
  namespace: dev
spec:
  hard:
    requests.cpu: "4" # Tối đa 4 CPU cores được yêu cầu
    requests.memory: 8Gi # Tối đa 8GB RAM được yêu cầu
    limits.cpu: "8" # Tối đa 8 CPU cores limit
    limits.memory: 16Gi # Tối đa 16GB RAM limit
    count/pods: "10" # Tối đa 10 Pods
    count/services: "5" # Tối đa 5 Services

6.3. Lệnh kubectl cho Resource Quota

# Xem resource quota trong namespace
kubectl get resourcequota -n dev

# Xem chi tiết usage
kubectl describe resourcequota dev-quota -n dev

# Tạo resource quota
kubectl apply -f quota.yaml

⚠️ Lưu ý quan trọng: Khi namespace có ResourceQuota cho CPU/Memory, tất cả Pod BẮT BUỘC phải khai báo resources.requestsresources.limits, nếu không sẽ bị từ chối tạo.



7. "Chốt hạ" cho Kỳ thi CKA 📝

  • Namespaces cung cấp sự cô lập logic (không phải vật lý) giữa các tài nguyên.
  • Nắm vững 3 namespace mặc định: default, kube-system, kube-public.
  • Hiểu cách giao tiếp giữa các namespace bằng FQDN.
  • Thành thạo các lệnh kubectl với cờ --namespace (hoặc -n) và lệnh kubectl config set-context để chuyển đổi namespace mặc định.
  • Biết rằng ResourceQuota được dùng để giới hạn tài nguyên cho mỗi namespace.

Bình luận