Lời mở đầu
Kubernetes, nền tảng quản lý container phổ biến nhất hiện nay, cùng với Helm, một công cụ quản lý chart để đơn giản hóa việc triển khai các ứng dụng trên Kubernetes, tạo thành một bộ đôi hoàn hảo khi kết hợp với FluxCD. Helm giúp định nghĩa, cài đặt và nâng cấp các ứng dụng Kubernetes dễ dàng, trong khi FluxCD đảm bảo rằng các thay đổi trong kho Git được phản ánh ngay lập tức vào cụm Kubernetes.
Ở bài viết trước GitOps Và Sử Dụng FluxCD: Tự Động Hóa Quy Trình Triển Khai Liên Tục mình cũng đã có giới thiệu qua về khái niệm GitOps, sơ đồ hoạt động của FluxCD.
Trong bài viết này, chúng ta sẽ cùng cài đặt Flux và công cụ Kubernetes trước và sau đó tích hợp FluxCD, thực hành với helm và Kubernetes nhé.
Cài đặt FluxCD
Cài đặt với Flux CLI
Cài đặt với Homebrew cho macOS và linux:
brew install fluxcd/tap/flux
Cài đặt với bash macOS và linux:
curl -s https://fluxcd.io/install.sh | sudo bash
Tải về package
1, Truy cập: https://github.com/fluxcd/flux2/releases
2, Tải về package tương ứng: Tại thời điểm viết bài flux có version cuối là 2.3.0
Với máy của mình đang sử dụng linux và kiến trúc amd64 nên mình sẽ tải tệp flux_2.3.0_linux_amd64.tar.gz
Sau khi download package phù hợp về máy, thực hiện giải nén tệp flux_2.3.0_linux_amd64.tar.gz
. Thực hiện 1 số lệnh để sử dụng được binary
$ cd flux_2.3.0_linux_amd64
$ sudo chmod +x flux
$ sudo mv flux /usr/local/bin
Cuối cùng, kiểm tra đã sử dụng flux chưa:
$ flux --version
flux version 2.3.0
Cài đặt minikube
Ưu và nhược điểm
Môi trường local, môi trường dev (staging) bạn có thể cài các bản thu nhỏ của Kubernetes. Cả K3s và minikube là những công cụ phổ biến để chạy các cụm Kubernetes nhỏ gọn và nhẹ nhàng, phù hợp cho mục đích phát triển, thử nghiệm và học tập. Tuy nhiên, chúng có các ưu và nhược điểm riêng biệt
1, Cài đặt K3s: hướng dẫn cài đặt
- Ưu điểm:
- Nhẹ và nhỏ gọn: K3s là phiên bản rút gọn của Kubernetes, được thiết kế để nhẹ nhàng và dễ cài đặt. Nó chỉ chiếm khoảng 40MB dung lượng và sử dụng ít tài nguyên hơn so với Kubernetes đầy đủ.
- Dễ dàng cài đặt và cấu hình: Quá trình cài đặt của K3s rất đơn giản và nhanh chóng, chỉ cần một lệnh duy nhất là có thể khởi chạy một cụm Kubernetes.
- Tích hợp sẵn nhiều thành phần: K3s tích hợp sẵn nhiều thành phần phổ biến như traefik (Ingress controller), CoreDNS, và Flannel (networking), giúp giảm bớt công việc cấu hình thêm.
- Hỗ trợ ARM: K3s hỗ trợ các kiến trúc ARM, giúp dễ dàng triển khai trên các thiết bị nhỏ gọn như Raspberry Pi, phù hợp cho các dự án IoT và edge computing.
- Tính ổn định và bảo mật: K3s được phát triển bởi Rancher Labs và có sự tập trung mạnh mẽ vào tính ổn định và bảo mật, với các bản vá bảo mật được cung cấp kịp thời.
- Nhược điểm:
- Thiếu một số tính năng của Kubernetes đầy đủ: K3s loại bỏ hoặc thay thế một số thành phần không cần thiết để giữ cho nó nhẹ nhàng, do đó có thể thiếu một số tính năng và tiện ích của Kubernetes chuẩn.
- Phụ thuộc vào Rancher Labs: Sự phát triển và hỗ trợ của K3s phụ thuộc vào Rancher Labs, điều này có thể gây lo ngại về tính bền vững nếu Rancher thay đổi hướng phát triển hoặc ngừng hỗ trợ.
2, Cài đặt minikube:
- Ưu điểm:
- Tương thích với Kubernetes đầy đủ: Minikube chạy một phiên bản đầy đủ của Kubernetes, giúp đảm bảo rằng các thử nghiệm và phát triển sẽ tương thích hoàn toàn với các cụm Kubernetes sản xuất.
- Nhiều tùy chọn cấu hình: Minikube cung cấp nhiều tùy chọn cấu hình và có thể tích hợp với nhiều trình điều khiển (drivers) như VirtualBox, Docker, KVM, v.v., cho phép người dùng linh hoạt trong việc chọn môi trường chạy.
- Hỗ trợ cho các add-ons: Minikube hỗ trợ một loạt các add-ons như dashboard, metrics-server, Ingress controllers, giúp mở rộng khả năng của cụm Kubernetes nhanh chóng.
- Nhược điểm:
- Cài đặt phức tạp hơn: Quá trình cài đặt và cấu hình của minikube có thể phức tạp hơn và yêu cầu nhiều bước hơn so với K3s.
- Yêu cầu tài nguyên cao hơn: Minikube chạy một phiên bản Kubernetes đầy đủ, do đó yêu cầu nhiều tài nguyên hệ thống hơn, có thể không phù hợp với các máy tính có cấu hình thấp.
- Không hỗ trợ kiến trúc ARM một cách tự nhiên: Minikube chủ yếu hỗ trợ các kiến trúc x86_64 và có thể gặp khó khăn khi triển khai trên các thiết bị ARM như Raspberry Pi.
Tùy vào nhu cầu với cấu hình máy mọi người lựa chọn cho mình công cụ phù hợp nhé. Mình cũng có 1 bài hướng dẫn cài đặt và sử dụng K3s rồi, ở bài này mình lựa chọn sử dụng minikube
Cài đặt
Cài đặt kubectl (Client): hướng dẫn cài đặt
Cài đặt Minikube sử dụng package:
1, Truy cập: https://github.com/kubernetes/minikube/releases
2, Sử dụng các package tool của bản phân phối Linux của bạn để cài đặt package phù hợp.
Cài đặt Minikube thông qua tải xuống trực tiếp:
Nếu bạn không cài đặt qua package, bạn có thể tải xuống bản binary và sử dụng.
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 \ && chmod +x minikube
sudo mv minikube /usr/local/bin
Cài đặt Minikube sử dụng Homebrew:
Một lựa chọn khác là bạn có thể cài đặt Minikube bằng cách sử dụng Linux Homebrew:
brew install minikube
Khởi chạy minikube:
minikube start
Nếu minikube trả về lỗi machine does not exist
, chạy lệnh bên dưới để xóa bỏ local state của minikube:
minikube delete
Done, kiểm tra xem bạn có thể truy cập vào minikube chưa nhé 😁
Kiểm tra context:
$ kubectl config get-contexts
minikube
Kiểm tra các namespace:
$ kubectl get namespace
default
kube-node-lease
kube-public
kube-system
Cài đặt xong xuôi, tiếp đến mình có tạo thêm 1 Git repo: https://github.com/vanquynguyen/fleet-infra để thực hiện tích hợp FluxCD.
Bootstrap Flux với github
export GITHUB_TOKEN=<your-token>
export GITHUB_USER=<your-username>
export GITHUB_REPOSITORY=<your-repository>
export K8S_CONTEXT=<your-k8s-context>
export CLUSTER_PATH=<cluster-path>
Ở đây mình dùng GitHub Personal Account nên thêm flag --token-auth
:
flux bootstrap github \ --token-auth \ --components-extra=image-reflector-controller,image-automation-controller \ --context=$K8S_CONTEXT \ --owner=$GITHUB_USER \ --repository=$GITHUB_REPOSITORY \ --branch=main \ --personal \ --path=$CLUSTER_PATH
Please enter your GitHub personal access token (PAT): ► connecting to github.com
► cloning branch "main" from Git repository "https://github.com/vanquynguyen/fleet-infra.git"
✔ cloned repository
► generating component manifests
✔ generated component manifests
✔ committed component manifests to "main" ("937108b086e3f3fc82fd21fab5860248d0a983a1")
► pushing component manifests to "https://github.com/vanquynguyen/fleet-infra.git"
► installing components in "flux-system" namespace
✔ installed components
✔ reconciled components
► determining if source secret "flux-system/flux-system" exists
► generating source secret
✔ public key: xxxxxxxxxxxxxxxxxxxxxxxxxxx
✔ configured deploy key "flux-system-main-flux-system-./clusters/staging" for "https://github.com/vanquynguyen/fleet-infra"
► applying source secret "flux-system/flux-system"
✔ reconciled source secret
► generating sync manifests
✔ generated sync manifests
✔ committed sync manifests to "main" ("15460835865b698788085be90801ca9a82d4dee4")
► pushing sync manifests to "https://github.com/vanquynguyen/fleet-infra.git"
► applying sync manifests
✔ reconciled sync configuration
◎ waiting for GitRepository "flux-system/flux-system" to be reconciled
✔ GitRepository reconciled successfully
◎ waiting for Kustomization "flux-system/flux-system" to be reconciled
✔ Kustomization reconciled successfully
► confirming components are healthy
✔ helm-controller: deployment ready
✔ image-automation-controller: deployment ready
✔ image-reflector-controller: deployment ready
✔ kustomize-controller: deployment ready
✔ notification-controller: deployment ready
✔ source-controller: deployment ready
✔ all components are healthy
Sau khi bootstrap xong, flux sẽ thêm file sync manifests lên github
Thư mục cluster bao gồm Flux config như dưới:
./clusters/
└── staging └── flux-system ├── gotk-components.yaml └── gotk-sync.yaml └── kustomization.yaml
Cùng với đó một namespace flux-system
sẽ được tạo ra, kèm theo đó sẽ tạo ra các pod như bên dưới
$ kubectl get pod NAME READY STATUS RESTARTS AGE
helm-controller-6cdc89f4ff-jzg5t 1/1 Running 0 3m11s
image-automation-controller-fb6c9df74-95pzk 1/1 Running 0 3m11s
image-reflector-controller-565565d549-5fm5v 1/1 Running 0 3m11s
kustomize-controller-7bbf5b9895-bpvf7 1/1 Running 0 3m11s
notification-controller-7f5cd7fdb8-mp4w9 1/1 Running 0 3m11s
source-controller-66c686679-5vc6s 1/1 Running 0 3m11s
Helm Controller
: một Kubernetes operator, cho phép quản lý các bản phát hành Helm chart một cách khai báo thông qua các tệp manifest Kubernetes.Image reflector and automation controller
: phối hợp với nhau để cập nhật Git repository khi có các container image mới sẵn có.Kustomize Controller
: một Kubernetes operator, chuyên về việc chạy các pipeline continuous delivery cho hạ tầng và workloads được định nghĩa bằng các tệp manifest Kubernetes và được lắp ráp bằng Kustomize.Notification Controller
: một Kubernetes operator, chuyên về xử lý các sự kiện đến và đi.Source Controller
: cung cấp một giao diện chung để thu thập các artifacts. Source API định nghĩa một tập hợp các đối tượng Kubernetes mà các quản trị viên cụm và các operator tự động khác nhau có thể tương tác để chuyển các hoạt động của Git và Helm repository sang một controller chuyên dụng.
Tạm kết
Bài viết này dừng lại ở các công việc cài đặt package FluxCD, công cụ Kubernetes. ở bài viết tiếp theo, chúng ta sẽ cùng sử dụng FluxCD thực hành với helm và K8s nhé. Bài viết tiếp theo: GitOps Và Sử Dụng FluxCD: Xây dựng thư mục, cấu hình Helm charts và K8s