Skip to content

Giới thiệu Namespace

Thien edited this page Oct 16, 2018 · 6 revisions

Trong phần này chúng tôi sẽ chia sẽ các bạn khái niệm namespace, như bạn biết khi chúng ta muốn chia sẽ cluster cho team deploy lên môi trường dev, staging, testing, production, vvv. Thì sau khi deploy xong thì sẽ rất khó quản lý cũng như gây ra sự nhầm lẫn. Chính vì lý do đó nên Kubernetes cung cấp cho ta khái niệm namespace để quản lý cho hiệu quả.

Nếu bạn nào làm lập trình thì có lẽ khái niệm namespace không xa lạ gì. Mặc định khi bạn cài thì Kubernetes đã tạo sẵng cho bạn một namespace là defaultkube-public, kube-system, bạn có thể xác nhận nó thông qua lệnh sau

Tại sao lại phải dùng namespace

Như những lý do trên chúng tôi đã nêu trên, thì việc dùng namespace sẽ giúp cho các bạn tiết kiệm chi phí server và dễ quản lý hơn, cũng code base của bạn sẽ trực quan, mặc định kubernetes cung cấp cho 2 namespace

$ kubectl get namespaces
NAME           STATUS    AGE
default        Active    61d
kube-public    Active    61d
kube-system    Active    61d

với kube-public và kube-system thì nó chứa các service và pod của thành phần chính kubernetes cluster do đó chúng ta không nên can thiệp vào namespace này, còn namespace default là nơi chúng ta sẽ tạo pod và service nhưng chúng tôi khuyên bạn ko bên dùng nó mà hãy tạo mới.

Tạo một namespace mới

Bạn tạo một tập tin namespace-dev.json với nội dung như sau:

{
  "kind": "Namespace",
  "apiVersion": "v1",
  "metadata": {
    "name": "development",
    "labels": {
      "name": "development"
    }
  }
}

sau đó bạn chạy lệnh này để tạo một namespace với name là development

kubectl apply -f namespace-dev.json

Bạn sẽ thấy một tin nhắn xác nhận thành công như bên dưới, hoặc bạn cũng có thể chạy lại lệnh giống như bên trên đễ xác nhận lại:

namespace/development created
$ kubectl get namespaces --show-labels
NAME           STATUS    AGE       LABELS
default        Active    61d       <none>
development    Active    6m13s     name=development
kube-public    Active    61d       <none>
kube-system    Active    61d       <none>

Làm tương tự như cách trên bạn cũng có thể tạo cho namespace testing hay staging

Tạo một deployment với namespace tương ứng

Trước khi tạo môt pod hoặc một deployment bạn hãy kiểm tra xem bạn đang kết nối tới cluster nào (curent context):

$ kubectl config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: REDACTED
    server: https://192.168.10.64:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: kubernetes-admin
  name: gsviec-traning
current-context: gsviec-traning
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED
$ kubectl config current-context
gsviec-traning

Hiện tại chúng tôi kết nối tới cluster là kubernetes, kế đến bạn cần phải định nghĩa nội dung(context) cho tương ứng mỗi namespace, bạn cần chú ý tới 2 giá trị sau clusteruser

thien at thien in ~/github/kubernetes on next-kube*
$ kubectl config set-context dev --namespace=development --cluster=kubernetes --user=kubernetes-admin
Context "dev" created.
thien at thien in ~/github/kubernetes on next-kube*
$ kubectl config set-context testing --namespace=testing --cluster=kubernetes --user=kubernetes-admin
Context "testing" created.
thien at thien in ~/github/kubernetes on next-kube*
$ 

Vậy là bạn đã tạo xong 2 môi trường dev và testing trên cùng một cluster thông qua namespace, ví dụ bạn muốn deploy lên môi trường dev nghĩa là trên namespace development thì chạy lệnh sau:

$ kubectl config use-context dev
Switched to context "dev".

ngược lại nếu bạn muốn chạy cho môi trường testing thì chạy lệnh sau:

$ kubectl config use-context testing
Switched to context "testing".

Kiểm tra lại

Để xác nhận mọi thứ đều làm việc ok, thì chúng tối tạo một pod với nội dung như sau(test-pod.yaml):

kind: Pod
apiVersion: v1
metadata:
  name: test-pod
spec:
  containers:
  - name: test-pod
    image: gcr.io/google_containers/busybox:1.24
    command:
      - "/bin/sh"
    args:
      - "-c"
      - "echo Gsviec awesome && tail -f /dev/null"
  restartPolicy: "Never"

sau đó deploy lại bằng lệnh sau

kubectl apply -f test-pod.yaml 

Bạn có thể mở trang quản lý kubernetes lên để xem pod mà bạn đã tạo, trong trường hợp của tôi là đang ở namespace là testing

dashboard kube

Kết luận

Trong phần này chúng tôi đã giới thiệu các bạn khái niệm căn bản về namespace của kubernetes huy vọng bạn thấy hữu ích.