用99元買的服務器搭一套CI/CD系統
故事的開始是這樣的:無聊的時候在阿里云買了一個99/年的服務,上面部署了一個Git服務,用于托管自己無聊時寫的一些代碼,順便也拿它做開發服務器。為了方便應用管理,起初用docker來管理和部署應用,后來升級了一把,用上了docker-compose,畢竟跟手撕命令相比聲明式部署更顯科學,docker-compose對于依賴項目的管理更是深得我心。于是,這樣和諧的過了很久,直到不久前無聊的時候在騰訊云上領了一個體驗服務器,免費的。雖然是體驗版,但不用起來談何體驗呢,思來想去感覺應該組個集群,順便搞一套 CI/CD,這樣做不僅能大幅提升編碼幸福感,也能對K8s有個體面的認識。
K3S
K3s 是輕量級的、一個完全兼容的 Kubernetes 發行版。K3s 易于安裝,僅需要 Kubernetes 內存的一半,所有組件都在一個小于 100 MB 的二進制文件中(~70MB)。官方說希望安裝的 Kubernetes 只占用一半的內存。Kubernetes 是一個 10 個字母的單詞,他們只用5個,所以叫K3s。
K3s很輕,適合2核2GB的云服務器裝著玩。雖然程序只有~70MB,但實際上包含Server和Agent兩個應用(同Master-Slave)。不僅如此,K3s 打包了所需的依賴,包括containerd、Flannel、Traefik、Service LB等等??瓷先ミ€是挺優秀的,實際上手還是有一些門檻的,由于基礎知識的缺失,單是kubectl這個工具都熟悉兩天。加上Flannel、LoadBalancer這些內容,服務器都重裝了好幾輪。好在,所有的問題都有一個標準答案,一路踩坑一路成長,總算把 K3s 給跑起來了。
Harness(open source)
記得它曾經叫Gitness,他們家東西挺多的,比如Drone。現在做強做大了,Gitness也改名叫Harness了,它資源消耗很小。Harness自帶Pipeline功能,這也是我比較喜歡的方式,CI的配置直接存項目里。它的服務是go寫的、ui是react、打包用webpack,或許是他們那里的網絡帶寬足夠大吧,它打包的時候沒有打壓縮包(像比較熟悉的gzip),服務上也沒做內容壓縮,部署在只有3M帶寬的服務器上加載速度著實感人,所以只能在代理層手動做 gzip 壓縮(順便還加上了http cache)。
ArgoCD
Argo CD是一款適用于Kubernetes 的聲明式GitOps 持續交付工具。應用程序的定義、配置和環境應該是聲明式的,并受版本控制。 應用程序的部署和生命周期管理應該是自動化的、可審計的,并易于理解。這是官方給出的介紹,簡單來說,它可以:
- 從Git倉庫拉取Kubernetes配置,并自動同步到集群。
- 提供可視化UI,支持應用管理、版本回滾等操作。
- 聲明式管理,所有變更都由Git驅動,保證部署一致性。
在我的架構中,ArgoCD負責盯緊Git倉庫中的deployment.yaml,一旦檢測到更新,就會自動部署最新的版本。如果出現問題,直接在UI里點回滾,幾秒鐘搞定,優雅又高效。
CI/CD 流程效果
CI階段(Harness Pipeline)
代碼push到Git倉庫后,Harness觸發Pipeline:
- Checkout代碼
- 安裝依賴 & 構建應用
- 構建Docker鏡像
- 上傳鏡像到阿里云鏡像倉庫(個人版免費)
- 修改deployment.yaml里的鏡像版本號。
CI 到此結束,下一步交給 ArgoCD。
CD階段(ArgoCD部署)
- 自動拉取最新配置deployment.yaml(deployment.yaml存放在Git倉庫中)。
- 自動同步或手動同步應用部署。
最終,實現了代碼提交 → 自動構建 → 自動部署的完整閉環,整個過程無需手動干預,更新全自動完成!
防坑指南
最坑的還是AI大模型的幻覺問題,當下AI已成為生活必需品,它能快速的分析問題并給出解決方案,也正是因此被他帶著滿世界跑,兜兜轉轉還是回到了起點,下面盤點一下這次AI帶我跳過的坑。
1、禁用Traefik
安裝K3s時它就讓我直接把Traefik禁用,然后用Nginx或Caddy做反向代理。正好Caddy我熟,這坑跳得是無怨無悔。老實說,Caddy配置著實簡單,尤其是在開啟Let‘s Encrypt和gzip壓縮這件事上,于是果斷選擇了Caddy。起初手動部署項目的時候用著還挺順手的,直到安裝了ArgoCD要開始自動部署時,我忽然意識到了問題,程序雖自動部署了,域名綁定什么的咋整?又要上服務器嗎?哎!這才明白Ingress Controller是不可替代的。不過這一路也不虧,不僅提高了對Ingress Controller的認知,中間還因為Flannel配置導致的問題將LoadBalancer的知識也擼了不少(AI讓我把自帶的ServiceLB禁用了,自己安裝MetalLB,竟然也老老實實的跟著干了)。
2、Harness Pipeline配置
這個其實有點甩鍋,畢竟工具是我選的。在使用Pipeline插件構建docker鏡像這件事上,Harness自己的插件文檔給出來的代碼并不適用于Harness Pipeline。但又確實是AI胡編亂造的給我的配置文件,折騰到了幾乎要放棄的地步。好在放棄的前一刻,自己根據pipeline示例配置結合官方文檔魔改了一份,最后竟成功蒙混過關。
最后
從最初的99元服務器,到搭建完整的K3s + CI/CD體系,這一路踩了不少坑,但收獲也不少。Kubernetes的學習門檻確實不低,但只要愿意折騰,總能找到答案。
如果對K3s感興趣,可以看看我的詳細筆記:https://www.aser1989.cn/docs/k3s/intro/

浙公網安備 33010602011771號