Serial blog Nhập môn Kubernetes

Nội dung

  • Các môi trường Kubernetes
  • Local Kubermetes
  • Công cụ hỗ trợ thiết lập môi trường Kubernetes
  • Quản lý Kubernetes trên public cloud
  • Kết luận

Mở đầu

Trong phần 1 của loạt bài viết về k8s, mình đã trình bày tại sao k8s là cần thiết. Mọi người có thể tham khảo [Nhập môn Kubernetes P1] - Tại sao Kubernetes là cần thiết?
Tiếp tục series bài viết về K8s, trong phần 2 này mình sẽ nói về việc chuẩn bị môi trường kubernetes.

Các môi trường Kubernetes

Trường hợp sử dụng môi trường k8s, nếu phân loại thì mình cho rằng có 3 loại lớn như sau:

  • Chạy k8s trên môi trường local Windows/MAC
  • Sử dụng công cụ thiết lập k8s, xây dựng Cluster
  • Sử dụng Public Cloud Managed Kubernetes

Tuỳ theo từng môi trường, cũng có những phần không thiết lập được như là liên kết với load bancing bên ngoài, Dynamic Persistent Volume vv. Tuy nhiên, về cơ bản cho dù là môi trường nào đi nữa, để có thể hoạt động giống nhau CNCF đã dung cấp Conformance Program. Trong các môi trường k8s mà mình giới thiệu lần này đều là Certified Kubernetes Distribution/Platform được thiết lập bởi Conformance Program. Có nhiều sự lựa chọn, tuy nhiên lần này trong mỗi phương pháp mình sẽ chỉ giới thiệu 2,3 loại cho mỗi phương pháp.

  • Local Kubernetes
    • Minikube
    • Docker for Mac
  • Tool kiến trúc Kubernetes
    • Kubeadm
    • Rancher
  • Public Cloud Managed Kubernetes
    • Google Kubernetes Engine(GKE)
    • Azure Container Service(AKS)
    • Elastic Container Service for Kubernetes(EKS)

Local Kubernetes

Đối với môi trường local k8s, là một phương pháp để bạn có thể thử k8s một cách tự do trên máy tính của bạn. Để hoạt động trên cấu hình tất cả trong một máy thì tính dự phòng sẽ không được đảm bảo, bạn cần chú ý điểm này. Thêm vào đó, một số chức năng sẽ không sử dụng được.

Minikube

uc?id=13ZFOi3gEfCiP8mCy3gQ03mEkXQnpPkGI&export=download
Logo minikube

Để vận hành k8s một cách đơn giản, trong tầm kiểm soát, hầu hết mọi người sẽ chọn Minikube. Vì Các thao tác trong Minikube yêu cầu VirtualBox mặc định, nên chúng ta cần cài đặt trước. Đặc biệt khi bạn không quan tâm đến version đặc biệt nào thì bằng package manager như Homebrew bạn cũng có thể cài đặt được. Bạn có thể cài đặt bằng cách khác, ngoài ra bạn cũng có thể sử dụng xhyve hay VMware Fusion.

Lưu ý: Các cài đặt dưới đây mình chạy trên máy MAC. Các bạn có thể tìm hiểu và cài trên môi trường Linux chẳng hạn.
Linux: https://kubernetes.io/docs/tasks/tools/install-minikube/

Đầu tiên tải và cài đặt VirtualBox:
https://www.virtualbox.org/wiki/Downloads

$ brew update
$ brew install kubectl
$ brew cask install virtualbox 

Cài đặt minikube bằng brew command hoặc download binary.
Cài minikube bằng brew command

$ brew cask install minikube

Cài minikube bằng cách download binary

$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64
$ chmod 755 minikube

Sau khi đã chuẩn bị sẵn sàng, chúng ta khởi động Minikube. Trong trường hợp chỉ định version cụ thể thì hãy chỉ định option --kubernetes-version.

$ minikube start
Starting local Kubernetes v1.10.0 cluster...
Starting VM...
Downloading Minikube ISO
 160.27 MB / 160.27 MB [============================================] 100.00% 0s
Getting VM IP address...
Moving files into cluster...
Downloading kubeadm v1.10.0
Downloading kubelet v1.10.0
Finished Downloading kubeadm v1.10.0
Finished Downloading kubelet v1.10.0
Setting up certs...
Connecting to cluster...
Setting up kubeconfig...
Starting cluster components...
Kubectl is now configured to use the cluster.
Loading cached images from config file.

Để xác nhận Minikube hoạt động chính xác hay không chúng ta gõ command minikube status, Nếu trạng thái của Minikube như dưới đây là OK. Lúc này thì VM dùng cho Minikube đã được khởi động trên VirtualBox. Từ đây về sau thì chúng ta có thể thao tác trên Cluster của Minikube bằng kubectl.

$ minikube status
minikube: Running
cluster: Running
kubectl: Correctly Configured: pointing to minikube-vm at 192.168.99.100

Tiếp theo chúng ta test thử hoạt động của minikube thế nào nhé. Chạy command sau để tạo 1 pod với container được build từ image centos:7, khi pod được tạo ra thì đồng thời truy cập vào terminal của container centos.

$ kubectl run -i --tty --image=centos:7 testpod  --rm /bin/sh
If you don't see a command prompt, try pressing enter.
sh-4.2# 

Để kiểm tra các pod đang hoạt động, mở một Terminal khác trên MAC, gõ command sau:

$ kubectl get pods
NAME                      READY     STATUS    RESTARTS   AGE
testpod-9949f7bdc-nctwb   1/1       Running   0          3s
$ 

Chúng ta có 1 pod đang hoạt động.

Nếu bạn không cần thiết nữa thì có thể xoá dễ dàng như sau:

minikube delete

Docker for Mac

Tại sự kiện DockerCon EU 17, công ty Docker cũng đã phát biểu về Kubermetes support, thao tác với Docker Swarm từ CLI của Kubernetes, các chức năng liên kết được đã được cường hoá. Ở Docker for Mac cũng vậy, từ vesion 17.12 CE Edge chúng ta có thể khởi động Kubernetes trên máy local, đó cũng là một sự lựa chọn. Tuy nhiên không thể chỉ định vesion cụ thể, các bạn nên chú ý.

Các bước cài đặt Docker for Mac:
Install Docker for Mac
Để sử dụng Kubernetes bằng Docker for Mac, sau khi khởi động Docker, Từ Preference chúng ta chọn Enable Kubernetes.
uc?id=1CEvhkAA_DyJgPzOBEb45RKoWorQc9WXT&export=download
Việc tích hợp Kubernetes mất tầm 5phút
uc?id=1LZ3GqqMUJAPBLkCmsIi8x1WI3PF9SGf-&export=download

Trường hợp bạn đang sử dụng Minikube, context sẽ bị lẫn lộn giữa minikube với việc tích hợp k8s cho Docker for Mac, nên mình khuyên là nên thực hiện chuyển đổi, sau đó thì thoải mái thao tác trên Cluster với kubectl.

kubectl config use-context docker-for-desktop

Trên kubectl, Docker hosts được xem như một nodes.

$ kubectl get nodes
NAME                 STATUS    ROLES     AGE       VERSION
docker-for-desktop   Ready     master    12m       v1.10.2

Công cụ kiến trúc Kubernetes

Tiếp sau đây mình sẽ giới thiệu đến các bạn phương pháp sử dụng công cụ cấu trúc để cài đặt môi trường kubernetes trên máy tính. Trong cả 2 cách dưới đây, đều có thể xây dựng kubernetes cluster có nhiều nodes.

kubeadm

kubeadm là một công cụ cấu trúc được cung cấp chính thức bởi Kubernetes. Cũng có version mà một bộ phận nào đó không hoạt động được, tuy nhiên về cơ bản thì nó vẫn được đánh giá cao.
https://kubernetes.io/docs/setup/independent/install-kubeadm/

Rancher

Rancher là một open source được phát triển chủ yếu bới công ty Rancher Labs. Trong phiên bản 1.0 nó được thiết kế để hỗ trợ Kubernetes, nhưng từ phiên bản 2.0 trở đi thì nó phát triển Kubernetes như là một nhiệm vụ chính.
Những đặc trưng của Rancher 2.0 theo mình thì như sau:

  • Có thể triển khai Kubernetes Cluster trên nhiều platform như AWS, OpenStack, VMware v.v.
  • Kubernetes cluster hiện tại có thể được quản lý bởi Rancher
  • Cung cấp chức năng xác thực tập trung, monitoring, hay là WebUI.
  • application catalog phong phú.

Bản thân Rancher, nó có thể được sử dụng như một máy chủ tập trung bằng cách khởi động Rancher rerver.

#Khởi động Rancher Server
docker run -d --restart=unless-stopped -p 8080:8080 rancher/server:v2.0.0-alpha10

Từ Rancher server này chúng ta có thể thực hiện quản lý Kubernetes cluster, liên kết với các nhà cung cấp dịch vụ cloud vv. Trường hợp bạn sử dụng trên môi trường production hãy tính đến khả năng có thể sử dụng Database backup bên ngoài, cấu hình cho Rancher server vv.
uc?id=1dFDZTYbXEOx65ueiu0T6R6JiJ2Bb3hvD&export=download
Giao diện Rancher 2.0

Một số tool khác

Còn một số công cụ cấu trúc Kubernetes mà mình chưa giới thiệu trong bài viết này, nếu đề cử ra một vài cái tên nổi tiếng như là:

  • Techtonic được phát triển bởi công ty CoreOS
  • Kubespray sử dụng Ansible
  • Terraform
  • Kops có khả năng xuất tập có định dạng CloudFormation.
  • OpenStack Magnum sử dụng OpenStack Heat.

Managed Kubernetes on public cloud

Phương pháp thứ 3 mình muốn giới thiệu đó là Managed Kubernetes. Với Kubernetes trên public cloud, chúng ta có thể thực hiện việc tích hợp một cách đơn giản các tính năng như Liên kết với Persistent volume, Liên kết với load balancing vv.

GKE(Google Kubernetes Engine)

uc?id=1EAWp1lKET-KBy42qS4-xLOwpttfJix1v&export=download

Với GKE chúng ta có thể sử dụng được nhiều chức năng tiện lợi mà GKE cung cấp. Ví dụ như chúng ta có thể thực hiện version up cluster một cách đơn giản vì GKE đã chuẩn bị sẵn các cơ chế như là tự động phục hồi, tự động update. Ngoài ra vì chúng ta có thể cấu trúc cluster mà đã sử dụng các nodes ưu tiên của GCE(Google Compute Engine)nên chi phí xây dựng giảm đáng kể. Vì sử dụng container nên chúng ta có khả năng thiết kế để cho cho dù một node kubernetes tái khởi tạo lại đi nữa, thì cũng không ảnh hưởng đến service.
GKE có thể thực hiện tích hợp với chức năng của GCP (Google Cloud Platform). Chẳng hạn như liên kết với Stackdriver Logging, mặc định nó sẽ thu thập tất cả các log xuất ra bởi container. GKE còn có một điểm mạnh nữa là có thể sử dụng LoadBalancer(Ingress)với hiệu xuất cao.
Một khái niệm cũng rất quan trọng trong GKE đó là chức năng NodePool. NodePool là một chức năng grouping bằng cách gán nhãn cho từng node trong Kubernetes cluster. Ví dụ như chúng ta có khả năng triển khai hỗn tạp nhiều node khác nhau kiểu như [Node có số lượng CPU nhiều], [Node có Memnory nhiều] trên cùng một cluster, điều đó cho phép chúng ta tính toán để thực hiện lúc Container scheduling sao cho hợp lý. Thêm nữa, trong trường hợp chúng ta không chỉ định cụ thể khi scheduling, nó sẽ tự động triển khai trên một node bất kỳ. Bằng cách nhóm các nodes khác vào group, cũng có thể phòng trừ được sự hỗn loạn của workload.
uc?id=13HpPb3sLEbygK78TPjZTTJ4TQDIosxB5&export=download
Khi cấu trúc kubernetes bằng GKE, có thể cấu trúc bằng GUI hoặc sử dụng gcloud command.

$ gcloud container clusters create example-cluster

Thông tin xác thực đến kubernetes sau khi bạn cấu trúc xong được lưu trong thư mục ~/.kube/config

$ gcloud container clusters get-credentials example-cluster

Thông tin chi tiết các bạn tham khảo link bên dưới:
Google Kubernetes Engine
Bản tiếng việt:
http://vn.apps-gcp.com/google-kubernetes-engine/.

Hiện tại thì các bạn có thẻ Visa có thể đăng ký sử dụng Google Cloud Platform. Google sẽ tặng bạn miễn phí 300$ sử dụng trong vòng 1 năm để thoả thích tạo máy ảo, IP, và tất nhiên là có cả Kubernetes Cluster nữa. Các bạn thử dùng nhé, tạo Cluster và chạy các demo nhanh cực.

Tham khảo:
https://viblo.asia/p/voc-vps-voi-300-mien-phi-tu-google-V3m5Wz1ylO7

Các bạn vào mục Kubernetes Engine -> Cluster
uc?id=1aMTbxh0ElM1A4lQObXDw3HEIAU1fJpds&export=download

Chọn Connect để lấy thông tin kết nối và chạy nó ở máy local của bạn, khi đó các thao tác ở terminal ở local cũng như thao tác trên cluster. Tất nhiên khi không dùng nữa thì các bạn delete đi nhé, dựa vào price plan mà tính toán tạo bao nhiêu Nodes, dùng bao lâu, chứ không là đi 300$ nhanh lắm. :D

AKS(Azure Container Service)

uc?id=1-kIzA1LBx2G35eCMytiW7bjg7mskP5Qf&export=download
AKS cũng là một Managed Kubernetes có thể sử dụng cho việc update Kubernetes một cách tự động.
Chi tiết các bạn tham khảo link dưới đây:
Azure Container Service

EKS(Elastic Container Service for Kubernetes)

uc?id=1iWK1frglArGBlqbPCwJDbjnFQM7gkEnS&export=download
EKS là Managed Kubernetes trên AWS được phát biểu ở sự kiện AWS re:Invent 2017
Thông tin chi tiết các bạn tham khảo link bên dưới:
Amazon EKS

Kết luận

Bài viết lần này mình đã trình bày về các môi trường Kubernetes, trường hợp sử dụng trong thực tế, các môi trường có sự khác nhau ít nhiều, trong khả năng có thể hãy cố gắng kiến trúc các môi trường development/staging/production giống nhau.
Mình đã cài đặt và dùng thử các môi trường như là Minikuber, Docker for Mac, Rancher, và Google Kubernetes Engine. Google Kubernetes Engine rất tuyệt vời các bạn ạ (không cần phải bàn). Nhưng xem xét chi phí thì cũng khá tốn kém đấy.
Phần 3 loạt bài về Kubernetes mình sẽ giới thiệu chi tiết về cách thiết lập môi trường Kubernetes sử dụng Rancher 2.0 - dự án mình hiện cũng đang sử dụng.