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ọidb-service
chỉ bằng têndb-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ọidb-service
ở namespacedev
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ể:
- Xem tài nguyên trong TẤT CẢ các namespace:
- 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ầnmetadata
. - 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 namespacedev
. 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 namespacedev
.
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.requests
và resources.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ệnhkubectl 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.