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

浙公網(wǎng)安備 33010602011771號(hào)