Triển khai Lightweight Kubernetes, sử dụng kubectl, kubectx, kubens command và helm chart môi trường dev
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.27.2
, trong thời gian tới sẽ sớm có versionv1.28
chi tiết tại: https://kubernetes.io/releases/
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ậnKUBECONFIG
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 kubectx
và kubens
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?
All rights reserved