Namespaces và Cgroups là gì trong Kubernetes

Namespaces giúp cô lập tài nguyên trong một cluster, đảm bảo tổ chức và giảm thiểu xung đột. Trong khi đó, Cgroups cho phép kiểm soát chính xác việc phân bổ tài nguyên, đảm bảo mỗi container nhận được phần CPU và bộ nhớ cần thiết. Trong bài viết này, chúng ta sẽ tìm hiểu định nghĩa và chức năng của Cgroups và namespaces trong kubernetes.

Xem thêm:

kubernetes là gì

containerd là gì ? So sánh Docker và Containerd

1. Namespace là gì?

Namespace trong Kubernetes giống như những “ngăn kéo” để phân loại tài nguyên. Mỗi ngăn chứa một nhóm tài nguyên (Pod, Deployment, Service…), và các nhóm này được tách biệt với nhau. Điều này giúp:

  • Tránh xung đột tên tài nguyên
  • Dễ tổ chức môi trường: dev, test, prod
  • Giao quyền truy cập linh hoạt cho từng nhóm người dùng

Namespace cung cấp một phạm vi cho các đối tượng tài nguyên Kubernetes. Mỗi tài nguyên Kubernetes chỉ có thể nằm trong một namespace.

Ví dụ, nếu ta đã tạo Pod tên là nginx1 trong Namespace demo1 thì ta không thể tạo thêm Pod nginx1 trong Namespace demo1 này nữa vì đã tồn tại rồi. Tuy nhiên ta vẫn có thể tạo Pod nginx1 trong Namespace demo2 mà không sợ trùng với Pod nginx1 ở Namespace demo1 vì chúng ở 2 Namespace khác nhau.

Ví dụ namespaces k8s

2. Các chức năng của namespaces trong k8s

  • Kiểm soát quyền truy cập: Namespace cung cấp một lớp bảo mật bổ sung, cho phép bạn kiểm soát quyền truy cập đến các tài nguyên Kubernetes. Bạn có thể cấp quyền truy cập cho các nhóm người dùng khác nhau vào các namespace khác nhau, giúp ngăn chặn truy cập không được phép.
  • Phân bổ tài nguyên: Namespace giúp bạn phân bổ tài nguyên (như CPU, bộ nhớ) cho các ứng dụng của bạn một cách hiệu quả. Bạn có thể đặt giới hạn và yêu cầu tài nguyên cho các namespace khác nhau, đảm bảo mỗi ứng dụng nhận được lượng tài nguyên phù hợp.
  • Tách biệt các môi trường: Namespace cho phép bạn triển khai ứng dụng vào các môi trường riêng biệt, chẳng hạn như development, staging và production, giúp quản lý và kiểm tra code một cách độc lập.
  • Giúp dễ dàng quản lý và tổ chức: Namespace giúp bạn tổ chức và quản lý các ứng dụng Kubernetes một cách dễ dàng, đặc biệt trong các môi trường có nhiều người dùng và ứng dụng

NameSpace

Namespaces sẽ bao gồm các thành phần nhỏ hơn như:

  • PID namespace cho phép ta tạo các process tách biệt.
  • Networking namespace cho phép ta chạy chương trình trên bất kì port nào mà không bị xung độ với các process khác chạy trên server.
  • Mount namespace cho phép ta mount và unmount filesystem mà không ảnh hưởng gì tới host filesystem.

3. Các loại namespace thường thấy trong Kubernetes

Namespace Vai trò
default Namespace mặc định nếu bạn không chỉ định gì
kube-system Chứa các thành phần hệ thống như DNS, kube-proxy…
kube-public Dùng để chia sẻ thông tin (như cấu hình cluster) công khai
kube-node-lease Dùng để quản lý heartbeat giữa node và control plane

4. Cgroups là gì?

Cgroups – viết tắt của Control Groups – là công cụ giúp giới hạn tài nguyên cho container:

  • Giới hạn CPU tối đa được dùng
  • Giới hạn bộ nhớ RAM container có thể chiếm
  • Theo dõi mức sử dụng tài nguyên
  • Và ngăn chặn container “ngốn sạch tài nguyên” của cả hệ thống

Cgroups giúp Kubernetes phân chia tài nguyên chính xác cho từng Pod. Ví dụ: Bạn có 1 vCPU, 1 GB RAM, thì có thể gán Pod A 0.5 CPU + 512MB, Pod B 0.5 CPU + 512MB – không ai chiếm của ai

5. Một số lệnh kubectl với namespace

– Liệt kê các namespace trong hệ thống:

kubectl get namespaces
controlplane ~ ➜  kubectl get namespaces 
NAME              STATUS   AGE
kube-system       Active   23m
kube-public       Active   23m
kube-node-lease   Active   23m
default           Active   23m
finance           Active   31s
marketing         Active   31s
dev               Active   31s
prod              Active   31s
manufacturing     Active   31s
research          Active   31s

– Tạo namespace mới:

kubectl create namespace finance

– Xóa namespace:

kubectl delete namespace finance

– Liệt kê các pod trong namespace:

controlplane ~ ➜  kubectl get pod --namespace=research 
NAME    READY   STATUS             RESTARTS      AGE
dna-2   0/1     CrashLoopBackOff   4 (52s ago)   2m24s
dna-1   0/1     CrashLoopBackOff   4 (48s ago)   2m24s

– Tạo một pod có tên redis, image=redis, namespace=finance:

controlplane ~ ✖ kubectl run redis --image=redis -n finance
pod/redis created

– Xem chi tiết thông tin một namespace

kubectl describe ns my-namespace

– Chỉnh sửa namespace:

kubectl edit ns my-namespace

– Thêm label cho namespace:

kubectl label ns my-namespace env=dev team=backend

– Lấy YAML của namespace

kubectl get ns my-namespace -o yaml

– Cập nhật nhanh namespace bằng lệnh patch

k patch ns my-namespace -p '{"metadata": {"labels": {"env": "staging"}}}'

– Đặt namespace mặc định cho phiên làm việc

k config set-context --current --namespace=production

– Xem log pod trong namespace

k logs mypod -n my-namespace

– Truy cập shell bên trong pod của namespace

k exec -it mypod -n my-namespace -- /bin/sh

– Kết nối giữa các namespace:

Bạn có thể truy cập Resource trong các NameSpace khác bằng cách sử dụng tên đầy đủ. Ví dụ, bạn có thể truy cập một Service trong NameSpace dev bằng cách sử dụng: dbservice.dev.svc.cluster.local.

NameSpace là một khái niệm quan trọng trong Kubernetes, cho phép tách biệt các môi trường, quản lý và bảo mật tài nguyên tốt hơn. Cảm ơn bạn đã tham khảo kubernetes cơ bản trên ttnguyen.net.

Bài viết liên quan:

Container runtime là gì ? 2 loại phổ biến

ClusterIP, NodePort, Loadbalance – Các loại service K8S

Imperative và Declarative trong K8S

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em