- vừa được xem lúc

Kubernetes - Học cách sử dụng Kubernetes Namespace cơ bản

0 0 96

Người đăng: Thu Nguyen Thi Thanh

Theo Viblo Asia

Namespace trong Kubernetes là gì?

Namespace trong Kubernetes được thiết kế để sử dụng trong môi trường có nhiều người dùng trải rộng trên nhiều team hoặc nhiều project khác nhau. 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. Tên của các tài nguyên Kubernetes chỉ cần là duy nhất trong một namespace duy nhất. Các namespace khác nhau có thể có các tài nguyên có cùng tên. Tên của các namespace phải khác nhau và chúng không thể được lồng vào nhau.

Tại sao nên sử dụng namespace?

Kubernetes namespace được sử dụng để phân vùng các cụm lớn thành các nhóm nhỏ hơn, dễ quản lý và nhận dạng. Namespace cho phép bạn tách biệt môi trường staging, QA, production hoặc developement riêng biệt và phân bổ tài nguyên đầy đủ trong một namespace duy nhất.

Nếu nhiều người dùng có quyền truy cập vào cùng một cụm, bạn có thể giới hạn người dùng và cho phép họ hoạt động trong giới hạn của một namespace cụ thể. Tách biệt người dùng là một cách tuyệt vời để phân định tài nguyên và tránh xung đột từ cách đặt tên gọi các tài nguyên hoặc version.

Namespace cũng là một loại tài nguyên Kubernetes và rất dễ dàng khởi tạo. Sau đó, bạn có thể sử dụng namespace để quản lý việc triển khai các tài nguyên bổ sung vào namespace cụ thể.

Sử dụng và quản lý namespace

Namespace "default"

Mặc định, sau khi chúng ta cài đặt một cụm Kubernetes đã có sẵn 4 namespace được tạo sẵn, đó là default, kube-public, kube-systemkube-node-lease:

  • default: là namespace mặc định được sử dụng cho các tài nguyên Kubenetes được deploy mà không chỉ định một namespace cụ thể nào khác.
  • kube-system: là namespace chứa các tài nguyên là các thành phần chính của một cụm Kubernetes cluster, được tạo bởi Kubernetes system. Namespace này chứa các tài nguyên hệ thống quan trọng, vì vậy, khi sử dụng cụm, nên giữ cho namespace này chạy độc, tách biệt với các service và ứng dụng riêng của chúng ta.
  • kube-public: Namespace này được tạo tự động khi cài đặt cụm và được Kubernetes quy ước là một namespace chứa các tài nguyên public có thể truy cập công khai trong toàn bộ cụm. Thực tế, thông thường, kube-public không được sử dụng nhiều.
  • kube-node-lease: Kể từ Kubernetes version 1.13, tính năng cho thuê node được giới thiệu là một tính năng alpha (NodeLease). Khi tính năng NodeLease được bật, mỗi node sẽ có một đối tượng Lease được liên kết trong namespace kube-node-lease, namespace được làm mới định kì, node lease được coi như tín hiệu từ node. Các node lease được làm mới thường xuyên và node lease nhẹ hơn nhiều so với NodeStatus (được sử dụng ở các version trước 1.13) nên tính năng này làm cho tín hiệu của node trở nên rẻ hơn đáng kể từ cả hai khía cạnh là khả năng mở rộng và hiệu suất.

Tạo namespace

Một điều quan trọng mình phải nói với các bạn là, đừng ngại việc tạo các namespace vì điều này không làm giảm hiệu suất cụm của bạn mà trong nhiều trường hợp còn giúp cải thiện hiệu suất khi phân chia các đối tượng tài nguyên vào các namespace vì việc hoạt động với từng nhóm đối tượng giúp Kubernetes API hoạt động hiệu quả hơn.

Chúng ta có thể tạo các namespace theo hai cách

  • Sử dụng kubectl command, rất đơn giản, chỉ cần thực hiện:

kubectl create namespace [Tên namespace]

  • Hoặc tạo manifest file với Yaml rồi sử dụng kubectl apply để thực thi file này, ví dụ với file test-namespace.yaml đơn giản như sau:
kind: Namespace
apiVersion: v1
metadata: name: viblo labels: name: viblo

kubectl apply -f test-namespace.yaml

Kiểm tra namespace

Để kiểm tra các namespace có trong cụm, ta có thực hiện các lệnh kubectl get namespace để liệt kê các namespace có trong cụm và các thông tin cơ bản.

thanhthu ~ kubectl get namespace NAME STATUS AGE
kube-system Active 168d
default Active 168d
kube-public Active 168d
kube-node-lease Active 168d
ingress-nginx Active 168d
cert-manager Active 168d
test Active 115d
harbor Active 78d
test-resources Active 67d
viblo Active 2m17s

Hoặc lấy thông tin mô tả về các namespace với kubectl describe

thanhthu ~ kubectl describe namespace kube-system
Name: kube-system
Labels: <none>
Annotations: <none>
Status: Active No resource quota. No LimitRange resource.

Tạo tài nguyên Kubernetes trong một namespace

Để tạo các đối tượng tài nguyên Kubernetes vào các namespace cụ thể, ta sẽ viết các manifest file yaml define các đối tượng tài nguyên và sử dụng kubectl apply để cài đặt chúng. Ví dụ, ta có 1 file yaml define một deployment như sau:

apiVersion: apps/v1
kind: Deployment
metadata: name: nginx-deployment namespace: test
spec: selector: matchLabels: app: nginx replicas: 1 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80

kubectl apply -f test/deployment-nginx.yaml

Ngoài ra, nếu bạn chỉ định 1 namespace trong file yaml thì khi thực thi file yaml đối tượng của bạn sẽ luôn được triển khai vào namespace đó. Nếu bạn muốn sử dụng lại cùng 1 file yaml để triển khai cùng 1 đổi tượng tài nguyên lên nhiều namespace khác nhau, để thuận tiện hơn, thay vì xác định namespace ngay trong file yaml, bạn cũng có thể sử dụng cờ --namespace hoặc -n để xác định namespace cho đối tượng tài nguyên được triên khai.

kubectl apply -f test/deployment-nginx.yaml --namespace test

Kiểm tra các tài nguyên được tạo trong một namespace

Để tìm và xem thông tin các tài nguyên trong một namespace cụ thể, chúng ta cũng sử dụng các command kubectl getkubectl describe và thêm cờ --namespace hoặc -n. Ví dụ:

thanhthu ~ kubectl get deployment -n test
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 1/1 1 1 71s
thanhthu ~ kubectl get pods -n test NAME READY STATUS RESTARTS AGE
nginx-deployment-6b474476c4-tvgsk 1/1 Running 0 18m
thanhthu ~ kubectl describe pods nginx-deployment-6b474476c4-tvgsk -n test
Name: nginx-deployment-6b474476c4-tvgsk
Namespace: test
Priority: 0
Node: i121035-lt/192.168.19.60
Start Time: Fri, 15 Jan 2021 15:57:19 +0700
Labels: app=nginx pod-template-hash=6b474476c4
Annotations: <none>
Status: Running
IP: 10.42.0.221
IPs: IP: 10.42.0.221
Controlled By: ReplicaSet/nginx-deployment-6b474476c4
Containers: nginx:
[...]

Truy cập giữa các service khác namespace

Trong Kubernetes, namespace được sử dụng để isolate tài nguyên. Tuy nhiên, trong nhiều trường hợp, tùy theo yêu cầu của ứng dụng mà bạn cần truy cập đến các service thuộc các namespace khác nhau. Để thực hiện được điều này, bạn sẽ có 2 cách.

  • Cách thứ nhất, bạn có thể sử dụng trực tiếp địa chỉ IP được cấp phát cho service sau khi tạo. Xem thêm tại Kubernetes documents - Discovering services
  • Cách thứ hai, thay vì sử dụng địa chỉ IP, bạn có thể truy cập đến một service khác namespace dựa trên tên DNS của chúng theo dạng <your-service-name>.<your-namespace>.svc.cluster.local. Xem thêm tại Kubernetes documents - DNS pod service

Tạm kết

Qua bài viết này, mình đã giới thiệu đến các bạn những khái niệm và cách sử dụng cơ bản của Kubernetes namespace, hi vọng các bạn sẽ cảm thấy hữu ích và tiếp tục ủng hộ mình ở các bài viết sau nhé!

Nguồn tham khảo

Bình luận

Bài viết tương tự

- vừa được xem lúc

Đề thi interview DevOps ở Châu Âu

Well. Chào mọi người, mình là Rice - một DevOps Engineers ở đâu đó tại Châu Âu.

0 0 65

- vừa được xem lúc

In calculus, love also means zero.

Mình nhớ hồi năm 2 đại học, thầy giáo môn calculus, trong một giây phút ngẫu hứng, đã đưa ra cái definition này. Lúc đấy mình cũng không nghĩ gì nhiều.

0 0 51

- vừa được xem lúc

Chuyện thay đổi

Thay đổi là một thứ gì đó luôn luôn đáng sợ. Cách đây vài tháng mình có duyên đi làm cho một banking solution tên là X.

0 0 30

- vừa được xem lúc

Pet vs Cattle - Thú cưng và gia súc

Khái niệm. Pets vs Cattle là một khái niệm cơ bản của DevOps. Bài viết này sẽ nói về sự phát triển của các mô hình dịch vụ từ cốt lõi Pets and Cattle. 1.

0 0 22

- vừa được xem lúc

Git workflow được Google và Facebook sử dụng có gì hay ho

Với developer thì Git hẳn là công cụ rất quen thuộc và không thể thiếu rồi. Thế nhưng có mấy ai thực sự hiểu được Git.

0 0 66

- vừa được xem lúc

[Kubernetes] Kubectl và các command cơ bản

Mở đầu. Kubectl là công cụ quản trị Kubernetes thông qua giao diện dòng lệnh, cho phép bạn thực thi các câu lệnh trong Kubernetes cluster.

0 0 39