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

Triển khai Lightweight Kubernetes, sử dụng kubectl, kubectx, kubens command và helm chart môi trường dev

0 0 3

Người đăng: Nguyễn Văn Quy

Theo Viblo Asia

Chào anh em lại một mùa Mayfest nữa lại về rồi nhỉ 😁. Hòa chung không khí của ngày hội chia sẻ kiến thức lớn nhất trong năm của Viblo mình cũng mạn phép được cầm gõ phím và viết ra vài dòng tâm sự 😚

Chuyện là thời gian gần đây dự án của mình có migrate từ việc quản lý apps sử dụng docker swarm (docker) sang Kubernetes (k8s). Trước đó thì dev bọn mình vẫn sử dụng docker-compose viết file YAML để build và run các container, và sau khi migrate chuyển qua quản lý container với Kubernetes thì phia dev vẫn sử dụng docker và docker-compose. Vẫn là triển khai ứng dụng dưới dạng container nên cũng không có thay đổi gì cho đến khi ...

ĐẶT VẤN ĐỀ

Kubernetes có thể hoạt động tốt với Docker?

Kubernetes là một hệ thống điều phối container nên nó không thể hoạt động nếu thiếu một môi trường container như Docker. Tuy nhiên, nếu không có Docker, Kubernetes vẫn có thể hoạt động với nhiều môi trường container khác như RunC, cri-o,... Nói là thế, nhưng Kubernetes lại được thiết kế để hoạt động tốt với Docker. Và hầu hết các tài liệu của Kubernetes cũng được viết cho Docker… Song song đó, Docker đã chấp nhận Kubernetes và còn cung cấp bản Kubernetes tích hợp cho riêng nó. Nhà sản xuất cũng đã đề cập đến việc loại bỏ Docker Swarm (có tính năng tương tự như Kubernetes) và sử dụng Kubernetes làm hệ thống điều phối mặc định cho Docker.

Từ phiên bản Kubernetes 1.24 và mới hơn không còn hỗ trợ docker 🤔 ?

Dockershim is removed in Kubernetes 1.24 and later versions. Therefore, Docker is not supported in Kubernetes 1.24 and later versions. However, you can continue to use Docker images. When you create new nodes, we recommend that you use containerd as the container runtime

Ngày 02 tháng 12 năm 2020, trong thông báo đi kèm với bản phát hành Kubernetes v1.20, Kubernetes đã tuyên bố ngừng việc hỗ trợ docker từ những bản release tiếp theo. Điều này cũng đồng nghĩa với Dockershim (lớp hỗ trợ tiêu chuẩn CRI của Kubernetes) sẽ bị gỡ bỏ.

zZZzzzz 😭

Điều này đồng nghĩa với việc ứng dụng trên production của mình khi upgrade version Kubernetes lên version 1.24 sẽ không thể sử dụng Dockershim được nữa. Vì vậy mình sẽ phải refactor ứng dụng trước khi deploy lên production với version mới. Để đảm bảo ứng dụng refactor thành công trước khi deloy lên môi trường production thì sẽ cần phải dựng môi trường K8s dev thay thế cho việc sử dụng docker, docker-compose trước kia.

Sau thời gian tìm tòi mình đã tìm ra DevSpace một Kubernetes tool giúp build dựng ứng dụng một cách nhanh chóng, cùng mình triển khai ứng dụng Kubernetes dưới môi trường dev nhé 😄

👉️ Phần 1: Triển khai Lightweight Kubernetes, rút gọn kubectl với kubectx, kubens và helm chart môi trường dev

Cài đặt kubectl, helm, k3s (Lightweight Kubernetes)

Cài đặt kubectl (Client)

Kubectl là command-line tool, cho phép chúng ta chạy các command trên Kubernetest cluster. Với kubectl ta có thể chạy các lệnh để deploy ứng dụng, kiểm tra và quản lý tài nguyên Kubernetes cluster, cũng như xem logs khi cần. Để sử dụng nhiều lệnh khác nhau bạn có thể tìm đọc tại trang chủ K8s về kubectl hay đơn giản chỉ cần gõ command kubectl --help

Với hệ điều hành sẽ có cách cài đặt binary khác nhau, ở đây mình dùng Linux nên mình sẽ cài như sau:

  • Cài version mới nhất:
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
  • Cài version chỉ định: tại thời điểm viết bài lastest version là v1.28 nhưng mình sẽ sử dụng v1.27.2
curl -LO https://dl.k8s.io/release/v1.27.2/bin/linux/amd64/kubectl

Tham khảo thêm tại: https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/

Sau khi cài đặt xong bạn kiểm tra lại version kubectl client:

kubectl version --client
Client Version: version.Info{Major:"1", Minor:"27", GitVersion:"v1.27.2", GitCommit:"7f6f68fdabc4df88cfea2dcf9a19b2b830f1e647", GitTreeState:"clean", BuildDate:"2023-05-18T02:15:29Z", GoVersion:"go1.20.4", Compiler:"gc", Platform:"linux/amd64"}
Kustomize Version: v5.0.1

Cài đặt K3s (Lightweight Kubernetes)

K3s là phiên bản nhỏ nhẹ của Kubernetes chính vì vậy thay vì phải cài đặt K8s phức tạp thì ta có thể sử dụng K3s ở môi trường dev hoặc staging. Dễ dàng để cài đặt K3s với command sau:

  • Cấu hình mặc định:
curl -sfL https://get.k3s.io | sh -
  • Không sử dụng Traefik ingress:
curl -sfL https://get.k3s.io | sh -s - --disable traefik
  • Không sử dụng Traefik Ingress và Local-path Storage:
curl -sfL https://get.k3s.io | sh -s - --disable traefik,local-storage
  • Trong trường hợp muốn thêm node cho cluster: tại agent node ta chạy command
curl -sfL https://get.k3s.io | K3S_URL=https://<myserver>:6443 K3S_TOKEN=<mynodetoken> sh - - <myserver> : IP của master node (nên sử dụng IP LAN)
- <mynodetoken> : Token của master node được ghi tại /var/lib/rancher/k3s/server/node-token
  • Xóa cài đặt K3s: Xóa K3s khỏi server node
/usr/local/bin/k3s-uninstall.sh
  • Xóa K3s khỏi agent node
/usr/local/bin/k3s-agent-uninstall.sh

Sử dụng kubectl, kubectx, kubens command thao tác với Kubernetes cluster

Sau khi cài đặt xong k3s cluster như các command bên trên bạn truy cập vào đường dẫn sau để lấy k3s config cluster:

sudo cat /etc/rancher/k3s/k3s.yaml

Nội dung trong k3s config cluster bạn có thể sửa lại như sau:

apiVersion: v1
clusters:
- cluster: certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJkekNDQafasfnZ3Foa2pPUFFRREFqQWpNU0V3SHdZRFZRUUREQmhyTTNNdGMyVnkKZG1WeUxXTmhRREUyT0RRMk16WTBNamN3SGhjTk1qTXdOVEl4TURJek16UTNXaGNOTXpNd05URTRNREl6TXpRMwpXakFqTVNFd0h3WURWUVFEREJock0zTXRjMlZ5ZG1WeUxXTmhRREUyT0RRMk16WTBNamN3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFRSGVYaXFrODRNZ0lTR25TWFd1b3R6c2JXLzFHbUlZNU9IV3lzdmQ4VW0KZHViMUJTV05FQy9uY1pWZGFpSWc3U1cyNTlabUUvb3VpemZ3Yk5nNWd2azBvMEl3UURBT0JnTlZIUThCQWY4RQpCQU1DQXFRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVWdxZ3V3WHQxaUhLL0pSMndvRXhqCjJFVGozc1F3Q2dZSUtvWkl6ajBFQXdJRFNBQtgghSUUlnZEtFTlF6alJ0TmZ0c2IwTXdLVVJuL3VWaGRRSG9zSHAKVUdlZlF4djZmUGNDSVFDWlJQU1NBcTdSeUhTeStxL0F1aXJDQzdXb05DQUpKbGd0eGJMZW5mZ0xkdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K server: https://127.0.0.1:6443 name: viblo-dev
contexts:
- context: cluster: viblo-dev user: ruacondepzaj name: viblo-dev
current-context: viblo-dev
kind: Config
preferences: {}
users:
- name: viblo-dev user: client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJrRENDQVRlZ0F3SUJBZ0lJUDFTYWdydGV0anN3Q2dZSUtvWkl6ajBFQXdJd0l6RWhNQjhHQTFVRUF3d1kKYXpOekxXTnNhV1Z1ZEMxallVQXhOamcwTmpNMk5ESTNNQjRYRFRJek1EVXlNVEF5TXpNME4xb1hEVEkwTURVeQpNREF5TXpNME4xb3dNREVYTUJVR0ExVUVDaE1PYzNsemRHVnRPbTFoYzNSbGNuTXhGVEFUQmdOVkJBTVRESE41CmMzUmxiVHBoWkcxcGJqQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJMaEVpZmlZQ2N1V2gzVTYKNGxkY3gwaHpQU0ExYVRLa1BwdnJYbE1vdGhQUzhHYVVwN3VaK2JHWlUydWN1M3JkZVpQay9GNjdaaDdpZzc2dgpDYUhhdUdpalNEQkdNQTRHQTFVZER3RUIvd1FFQXdJRm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBakFmCkJnTlZIU01FR0RBV2dCUU8xNXNFQWJDU0NCc1h3UktCaUVhUUMvSTY4akFLQmdncWhrak9QUVFEQWdOSEFEQkUKQWlBYWU2ZVZ3emdxUkhOWGk0YkVhUHY1MjZjL3luc1NmTENESTRWRzB3MCtUUUlnRjk1QUpqWkJId2JucXYvagpBUU1pTzlUejN0UTlieU16a3hkd09ISDIyKzA9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJkekNDQVIyZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQWpNU0V3SHdZRFZRUUREQmhyTTNNdFkyeHAKWlc1MExXTmhRREUyT0RRMk16WTBNamN3SGhjTk1qTXdOVEl4TURJek16UTNXaGNOTXpNd05URTRNREl6TXpRMwpXakFqTVNFd0h3WURWUVFEREJock0zTXRZMnhwWlc1MExXTmhRREUyT0RRMk16WTBNamN3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFRYTBFK3gzcDV0UmhYU0g5bGgybXZlZzhzRUpRQ2x3Y3p1STgwUmUyRlkKK3VCWE40d0xkZ2Uvc3dCUVBGOGlnLzVWQXQxdW16b3FYaURBREhkZkIxNWVvMEl3UURBT0JnTlZIUThCQWY4RQpCQU1DQXFRd0R3WURWUjBUQVFIL0JBVXdBd0 client-key-data: LS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS0tLS0tCk1IY0NBUUVFSU1jYXZYZmU3SHBRNGw3V1VTNEI5cjliN2JjRVFvWEt5VnRHeWp2ZWtVNG5vQW9HQ0NxR1NNNDkKQXdFSG9VUURRZ0FFdUVTSitKZ0p5NWFIZFRyaVYxekhTSE05SURWcE1xUSttK3RlVXlpMkU5THdacFNudTVuNQpzWmxUYTV5N2V0MTVrK1Q4WHJ0bUh1S0R2cThKb2RxNGFBPT0KLS0tLS1FTkQgRUMgUFJJVkFURSfdgdhdhfRVktLS0tLQo=
  • Export KUBECONFIG để sử dụng kubectl trong Kubernetes cluster. Bạn tạo một file ~/.kube/viblo-dev.config với nột dung config ở trên, thêm biến môi trường này vào trong file .bashrc hoặc .zshrc để khi sử dụng kubectl trên terminal tự động nhận KUBECONFIG
export KUBECONFIG='~/.kube/viblo-dev.config'

Thử sử dụng lệnh xem đã truy cập vào context chưa:

kubectl config get-contexts

Kết quả:

CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* viblo-dev viblo-dev ruacondepzaj default

Thao tác vào context và namespace rút gọn với kubectx, kubens. Bạn download binary kubectxkubens tại: https://github.com/ahmetb/kubectx/releases

Mình sử dụng linux nên copy vào /usr/local/bin, gõ thử lệnh:

  • Kiểm tra danh sách context:
kubectx
  • Chuyển đổi các context:
kubectx <context-name>
  • Kiểm tra danh sách namespace:
kubens
  • Chuyển đổi namespace:
kubens <namespace-name>

Cài đặt helm

Mỗi khi deploy ứng dụng lên Kubernetes cluster ta sẽ phải viết hàng loạt các resources: Pod, Service, Deployment, ReplicaSet, StatefullSet,... mỗi resource đều phải viết 1 file YAML để deploy. Nếu viết theo kiểu thông thường như vậy thì sẽ rất là phức tạp, đòi hỏi độ chính xác cao khi có lỗi xảy ra debug gặp nhiều khó khăn, mặt khác chúng ta sẽ khó tái sử dụng lại cho các ứng dụng tương tự.

Helm là một trình quản lý gói ứng dụng cho Kubernetes, điều phối tải xuống, cài đặt và triển khai ứng dụng. Bằng việc xây dựng các template có sẵn (helm chart) ta dễ dàng tạo ra cấu hình tài nguyên và linh hoạt cho nhiều ứng dụng khác nhau.

Dễ dàng cài đặt helm theo các command sau đây:

curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh

Sau khi cài xong kiểm tra với command:

helm version
version.BuildInfo{Version:"v3.7.0", GitCommit:"eeac83883cb4014fe60267ec6373570374ce770b", GitTreeState:"clean", GoVersion:"go1.16.8"} 

Mình cũng có viết các sử dụng helm chart cơ bản các bạn có thể đọc thêm tại đây: Hướng dẫn cài đặt và sử dụng ChartMuseum hỗ trợ việc custom chart với helm (k8s)

Trong phạm vi bài viết này chúng ta chưa cần phải tạo ra các helm chart, Devspace đã làm giúp ta việc đó rồi cùng tiếp tục đọc ở phần tiếp theo trong series Bạn đã sử dụng Devspace để triển khai ứng dụng Kubernetes dưới môi trường dev chưa?

Bình luận

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

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

Golang Data Structures and Algorithms - Stack

Giới thiệu. Series về cấu trúc dữ liệu và thuật toán sử dụng Golang.

0 0 25

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

AWS Certified Solutions Architect Professional - Security - Secrets Manager

Introduction. A quick note about AWS Secrets Manager.

0 0 30

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

Golang Data Structures and Algorithms - Queue

Giới thiệu. Series về cấu trúc dữ liệu và thuật toán sử dụng Golang.

0 0 36

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

Terraform Series - Bài 17 - Security - Manage Secrets with Vault

Giới thiệu. Chào các bạn tới với series về Terraform, ở bài trước chúng ta đã tìm hiểu về vấn đề security trong Terraform.

0 0 25

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

Golang Data Structures and Algorithms - Linked Lists

Giới thiệu. Series về cấu trúc dữ liệu và thuật toán sử dụng Golang.

0 0 26

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

AWS Certified Solutions Architect Professional - Security - AWS Certificate Manager

Introduction. A quick note about AWS Certificate Manager.

0 0 20