k0sctl: Deploy Kubernetes cluster trong 2 phút mà không muốn tin
k0sctl giúp bạn bootstrap và quản lý k0s Kubernetes cluster chỉ với một file config và một lệnh duy nhất. Không cần kubeadm, không cần Ansible.
Nguyễn Nhật Long
@nguyennhatlong1303
Nếu bạn đã từng phải setup một Kubernetes cluster từ đầu dù là dùng kubeadm, RKE, hay tự viết Ansible playbook thì chắc bạn biết cái cảm giác ngồi debug tại sao node worker không join được vào cluster lúc 11 giờ đêm. Mình đã ở đó, và mình không muốn quay lại.
k0sctl là câu trả lời mà mình ước gì biết sớm hơn.
k0s và k0sctl đừng nhầm hai cái này
Trước tiên cần phân biệt rõ: k0s là một Kubernetes distribution gọn nhẹ, single binary, không cần external etcd hay load balancer phức tạp. Còn k0sctl là cái tool CLI để bootstrap và quản lý các cluster chạy k0s.
Nói đơn giản hơn: k0s là cái engine, k0sctl là cái remote control. Bạn dùng k0sctl để SSH vào các máy, cài k0s, config cluster, rồi join các node lại với nhau tất cả hoàn toàn tự động.
Cái output mà README của project show ra nói lên tất cả:
1INFO ==> Running phase: Connect to hosts2INFO ==> Running phase: Detect host operating systems3INFO [ssh] 10.0.0.1:22: is running Ubuntu 20.104INFO [ssh] 10.0.0.2:22: is running Ubuntu 20.105INFO ==> Running phase: Download k0s binaries on hosts6INFO ==> Running phase: Configure k0s7INFO ==> Running phase: Initialize the k0s cluster8INFO [ssh] 10.0.0.1:22: installing k0s controller9INFO ==> Running phase: Install workers10INFO [ssh] 10.0.0.2:22: installing k0s worker11INFO [ssh] 10.0.0.2:22: waiting for node to become ready12INFO ==> Finished in 2m2s13INFO k0s cluster version 1.22.3+k0s.0 is now installed
2 phút 2 giây. Từ máy trần đến cluster hoạt động. Mình đã test cái này và vẫn thấy hơi khó tin.
Cài k0sctl về máy
k0sctl support đủ mọi platform, và cộng đồng đã đóng gói cho hầu hết package manager phổ biến:
Mình dùng macOS nên chỉ cần brew install là xong. Nếu bạn dùng Linux server không có package manager nào ở trên, thì download binary từ releases page về, chmod +x rồi bỏ vào /usr/local/bin là ổn.
| Platform | Cách cài |
|---|---|
| macOS | `brew install k0sproject/tap/k0sctl` |
| Linux (Alpine) | `apk add k0sctl` |
| Linux (openSUSE) | `zypper install k0sctl` |
| Arch Linux | `yay -S k0sctl-bin` |
| Windows (Chocolatey) | `choco install k0sctl` |
| Windows (WinGet) | `winget install k0sproject.k0sctl` |
| Nixpkgs | `nix profile install nixpkgs#k0sctl` |
| Go toolchain | `go install github.com/k0sproject/k0sctl@latest` |
Lưu ý nhỏ: binary chưa được sign, nên trên macOS bạn cần right-click → Open lần đầu để bypass Gatekeeper. Hơi bất tiện nhưng chấp nhận được với một tool open source.
File config trái tim của k0sctl
k0sctl hoạt động dựa trên một file YAML config mô tả cluster của bạn. Cấu trúc khá straightforward:
1apiVersion: k0sctl.k0sproject.io/v1beta12kind: Cluster3metadata:4 name: my-cluster5spec:6 hosts:7 - ssh:8 address: 10.0.0.19 user: ubuntu10 port: 2211 keyPath: ~/.ssh/id_rsa12 role: controller13 - ssh:14 address: 10.0.0.215 user: ubuntu16 port: 2217 keyPath: ~/.ssh/id_rsa18 role: worker19 - ssh:20 address: 10.0.0.321 user: ubuntu22 port: 2223 keyPath: ~/.ssh/id_rsa24 role: worker25 k0s:26 version: 1.29.2+k0s.027 config:28 apiVersion: k0s.k0sproject.io/v1beta129 kind: ClusterConfig30 metadata:31 name: my-cluster32 spec:33 network:34 provider: calico
Mỗi host trong spec.hosts có một role có thể là controller, worker, hoặc controller+worker (cho single-node setup). k0sctl sẽ SSH vào từng máy theo đúng thứ tự, cài binary k0s, config, rồi wire chúng lại với nhau.
Cái mình thích nhất là phần k0s.config bạn có thể nhúng thẳng k0s ClusterConfig vào đây. Muốn đổi CNI từ kube-router sang Calico? Sửa một dòng. Muốn thêm feature gate? Thêm vào spec. Không cần SSH vào từng máy tay.
Deploy cluster lần đầu
Sau khi có file config, deploy chỉ là:
1k0sctl apply --config k0sctl.yaml
k0sctl sẽ tự detect xem host đang chạy OS gì, download đúng version k0s binary, install, configure, rồi join các node. Idempotent hoàn toàn chạy lại lần nữa nó sẽ chỉ reconcile những gì thay đổi, không cài lại từ đầu.
Sau khi xong, lấy kubeconfig về local:
1k0sctl kubeconfig --config k0sctl.yaml > ~/.kube/config
Rồi verify:
1kubectl get nodes2# NAME STATUS ROLES AGE VERSION3# node-1 Ready <none> 2m v1.29.2+k0s4# node-2 Ready <none> 1m v1.29.2+k0s
Done. Cluster đang chạy.
Thêm node mới không cần downtime
Đây là phần mình thấy k0sctl shine nhất so với làm tay. Muốn scale thêm worker? Chỉ cần thêm entry vào file config:
1- ssh:2 address: 10.0.0.43 user: ubuntu4 port: 225 keyPath: ~/.ssh/id_rsa6 role: worker
Rồi chạy lại k0sctl apply. Tool sẽ tự detect node nào là mới, cài k0s lên đó, generate join token, rồi join vào cluster. Các node cũ không bị touch.
Theo kinh nghiệm của mình, cái workflow này cực kỳ hữu ích khi làm việc với Terraform. Bạn provision VM bằng Terraform, output IP ra, rồi feed vào k0sctl config. Trong repo có sẵn ví dụ Terraform trong thư mục examples/ anh em nên xem qua.
Upgrade cluster
Upgrade Kubernetes version thường là cái mà ops team sợ nhất. Với k0sctl, quy trình là:
- Sửa
k0s.versiontrong config file - Chạy
k0sctl apply - Ngồi uống cà phê
1k0s:2 version: 1.30.1+k0s.0 # đổi từ 1.29.2
k0sctl sẽ upgrade controller trước, sau đó drain và upgrade từng worker node theo thứ tự. Rolling upgrade, không downtime cho workload nếu bạn có đủ replica.
Mình đã dùng cái này để upgrade một cluster production từ 1.27 lên 1.29 và nó smooth hơn mình tưởng nhiều. Dĩ nhiên vẫn nên test trên staging trước đừng liều.
Backup và reset
k0sctl cũng có một số lệnh utility hữu ích:
1# Backup etcd data2k0sctl backup --config k0sctl.yaml34# Reset cluster (xóa sạch k0s trên tất cả hosts)5k0sctl reset --config k0sctl.yaml
k0sctl reset thực sự hữu ích khi bạn cần tear down cluster test environment. Nó sẽ stop k0s service, xóa binary, xóa data sạch sẽ để bạn có thể apply lại từ đầu.
So sánh với các tool tương tự
k3sup là cái gần nhất với k0sctl về độ đơn giản, nhưng nó dành cho k3s. Nếu team bạn đang dùng k0s (hoặc đang cân nhắc), k0sctl là lựa chọn tự nhiên nhất.
| Tool | Complexity | Kubernetes distro | SSH-based | Idempotent |
|---|---|---|---|---|
| kubeadm | Cao | Vanilla K8s | Không (chạy trực tiếp trên node) | Một phần |
| RKE/RKE2 | Trung bình | Rancher K8s | Có | Có |
| k3sup | Thấp | k3s | Có | Một phần |
| **k0sctl** | **Thấp** | **k0s** | **Có** | **Có** |
| Kubespray | Cao | Vanilla K8s | Có (Ansible) | Có |
Mình thấy cái này hay ở chỗ: k0sctl không cần bạn cài bất cứ thứ gì trên các node trước không cần pre-installed agent, không cần Ansible, không cần Python. Chỉ cần SSH access là đủ. Tool sẽ tự lo phần còn lại.
Một vài gotcha cần biết
Anh em lưu ý một số điểm khi dùng:
SSH key phải accessible từ máy bạn chạy k0sctl. Nếu bạn chạy trong CI/CD pipeline, nhớ mount hoặc inject SSH key đúng cách. k0sctl không hỗ trợ password authentication chỉ dùng key.
Firewall giữa các node. k0s cần một số port được mở giữa controller và worker (6443, 8132, 8133, 10250...). Nếu cluster không form được, đây thường là nguyên nhân đầu tiên cần check.
Binary chưa được sign như đã đề cập. Nếu bạn đang setup pipeline tự động trên macOS build agent, cần handle cái này riêng.
HA controller setup hoàn toàn được support bạn chỉ cần thêm nhiều host với role: controller và k0sctl sẽ setup etcd cluster tự động. Tuy nhiên bạn vẫn cần một external load balancer phía trước các controller nếu muốn HA thực sự.
1hosts:2 - ssh:3 address: 10.0.0.14 role: controller5 - ssh:6 address: 10.0.0.27 role: controller8 - ssh:9 address: 10.0.0.310 role: controller
Dùng trong CI/CD
Một use case mình hay thấy là dùng k0sctl trong pipeline để spin up ephemeral cluster cho integration test:
1# Trong GitHub Actions hoặc GitLab CI2- name: Bootstrap test cluster3 run: |4 k0sctl apply --config ci-cluster.yaml --no-wait5 k0sctl kubeconfig --config ci-cluster.yaml > /tmp/kubeconfig6 export KUBECONFIG=/tmp/kubeconfig7 kubectl wait --for=condition=Ready nodes --all --timeout=120s89- name: Run integration tests10 run: make test-integration11 env:12 KUBECONFIG: /tmp/kubeconfig1314- name: Teardown cluster15 if: always()16 run: k0sctl reset --config ci-cluster.yaml
k0sctl cũng có thể chạy trong container nếu bạn không muốn install binary trực tiếp lên CI runner check Dockerfile trong repo.
Nhìn chung, k0sctl giải quyết đúng cái pain point mà mình và nhiều team đã gặp: làm sao để setup và maintain Kubernetes cluster on-premise hoặc trên bare metal mà không phải viết hàng trăm dòng Ansible hay ngồi SSH tay vào từng máy. Nếu bạn đang dùng k0s hoặc đang tìm một Kubernetes distribution nhẹ để self-host, đây là cái tool bạn nên thêm vào toolbox ngay.
Nguyễn Nhật Long
@nguyennhatlong1303Nguyễn Nhật Long is a Senior Frontend Engineer and Frontend Team Leader with 7 years of experience building real-time fintech platforms. Specializing in React, Next.js, TypeScript, and React Native, shipping 10+ products across Web, Mobile, Telegram Mini-Apps, and Web3.
Thấy hay? Chia sẻ cho bạn bè!