sealer是阿里巴巴開源的一款集群鏡像技術實現《倩粒可以把整個集群打成像docker鏡像一樣的鏡像包,安裝生態(tài)任何軟件都可以sealer run xxx搞定璧南,保障整個集群緯度的交付一致性。是專有云和離線交付利器师逸,當然普通開發(fā)者可以用它來快速實踐云原生生態(tài)軟件司倚,比如你要安裝k8s 或者prometheus或者高可用的mysql都可以做到一鍵搞定。
與helm的區(qū)別是篓像,helm只編排不打包动知,這很多helm國內環(huán)境下載鏡像就是個問題,而sealer不存在這個問題员辩,所有依賴都會被打包盒粮,而且整個集群整體打包。
| 用sealer安裝一個k8s集群
sealer run kuberetes:v1.19.9 \
--master 192.168.0.2,192.168.0.3,192.168.0.4 \
--node 192.168.0.5,192.168.0.6 -p 123456
對比sealos有沒有發(fā)現命令行更簡約更干凈奠滑,多一分則嫌多丹皱,少一分則嫌少妒穴?優(yōu)雅的像藝術品。
kuberentes:v1.19.9我們稱之為集群鏡像摊崭,它很神奇讼油,和Docker鏡像類似本質是一坨安裝整個集群所需要的所有文件的集合,在sealos里面可能就是個tar包呢簸,而sealer里面做了分層和兼容docker registry的設計矮台,意味著我們可以把這個集群鏡像放到docker registry里面進行交付。
對接公有云更簡單根时,安裝時只需要指定機器數量
export ACCESSKEYID=xxx # 指定AK SK
export ACCESSKEYSECRET=xxx
# 運行3master 3node
sealer run kuberetes:v1.19.9 -m 3 -n 3
想定義更多參數瘦赫? 定義Clusterfile即可:
apiVersion: sealer.aliyun.com/v1alpha1
kind: Cluster
metadata:
name: my-cluster
spec:
image: registry.cn-qingdao.aliyuncs.com/sealer-io/kubernetes:v1.19.9
provider: ALI_CLOUD
masters:
cpu: 4
memory: 4
count: 3
systemDisk: 100
dataDisks:
- 100
nodes:
cpu: 4
memory: 4
count: 3
systemDisk: 100
dataDisks:
- 100
---
apiVersion: sealer.aliyun.com/v1alpha1
kind: Config
metadata:
name: calico
spec:
path: etc/calico-values.yaml
data: |
# in use NIC name
interface: eth0
# Network plug-in name
cniName: calico
podCIDR: 100.64.0.0/10
svcCIDR: 10.96.0.0/22
withoutCNI: false
| 一個安裝工具而已嘛,有什么了不起蛤迎?
安裝只是sealer的一個部分确虱,sealer是一個《集群鏡像》的實現,也就是如何通過一定的技術手段把整個集群打包替裆!這一點上相比sealos是一個質的提升校辩。
sealer賦予了用戶Build的能力,用非常簡單的方式讓用戶進行自定義集群鏡像:
我們想定義一個包含mysql ELK redis wordpress的集群扎唾,并把所有的依賴打包在一起,sealer就可以通過極簡單方式幫助你做到這一點:
- 定義Kubefile
FROM kuberentes:v1.19.9 # 集群鏡像基礎鏡像南缓,sealer官方提供
COPY mysql . # mysql 編排文件
COPY ELK .
COPY redis .
COPY wordpress .
CMD kubectl apply -f . # 集群啟動后執(zhí)行的命令
- Build自定義鏡像
sealer build -t mysql-redis-elk:latest .
然后需要部署一個新集群只需要
sealer run mysql-redis-elk:latest --master 192.168.0.2 -p 123456
這個集群run完就包含了mysql redis等
你還可以把集群鏡像推送到私有鏡像倉庫中:
sealer login hub.docker.io -u xxx -p xxx
sealer push mysql-redis-elk:latest
還可以pull下來save成tar到客戶環(huán)境中l(wèi)oad:
sealer pull mysql-redis-elk:latest
sealer save -o mysql-redis-elk.tar mysql-redis-elk:latest
sealer load -i mysql-redis-elk.tar # 客戶離線環(huán)境
| 從此以后
大部分云原生生態(tài)軟件落地:
sealer run rook:latest
sealer run prometheus:latest
sealer run ingress:latest
sealer run istio:latest
...
一切變得如此簡單...
| sealer設計思想
sealer設計是極其優(yōu)秀的胸遇,其實把整個集群制作成鏡像并非一件簡單的事,sealer的牛掰之處就在于把復雜的事通過優(yōu)雅的設計讓其足夠大道至簡汉形,這也是幾乎我所有產品的特點纸镊,犧牲復雜度換取的功能寧可不要。
kubefile設計
這是核心亮點概疆,它以一個非常簡單的用戶接口讓用戶實現自定義集群鏡像的能力逗威。
用怎樣的一種描述語言可以用來描述整個集群所需要的文件,并且還要簡單岔冀?在sealer誕生之前這其實是個復雜的問題凯旭,受Dockerfile啟發(fā),為何不把單機容器鏡像上升到集群緯度使套?
于是便有了Kubefile罐呼。
docker可以通過Dockerfile構建一個docker鏡像,使用compose就可以運行容器侦高。
sealer通過Kubefile構建一個CloudImage,使用Clusterfile啟動整個集群嫉柴。
這是個非常亮眼的想法和設計。那Kubefile中應該包含哪些指令奉呛?
FROM kubernetes:v1.19.9
FROM指定基礎鏡像计螺,它可以是一個很干凈的k8s基礎鏡像夯尽,也可以一個用戶已經打包了一些服務的自定義鏡像,對于使用者來說不需要關心里面的細節(jié)登馒,就像用docker時不用關心centos rootfs里面有哪些文件一樣匙握。
COPY my-chart .
RUN wget helm.sh/download/helm-v3 && mv helm-v3 /usr/bin/helm
COPY指令可以像Docker一樣把build工作目錄的文件拷貝到集群鏡像中。
RUN指令會在Build的時候執(zhí)行谊娇,執(zhí)行的過程中產生的文件都會緩存到集群鏡像的一個layer中肺孤,比如上面在集群鏡像中打包helm二進制
CMD helm install app my-chart
CMD指令在k8s集群拉起后執(zhí)行,它可以有多個济欢。
這樣在Build的過程中sealer會拉起一個臨時的k8s集群赠堵,然后在里面執(zhí)行Kubefile定義的指令,最終把這些指令產生的所有文件打包法褥。
容器鏡像緩存設計
緩存容器鏡像可不是件輕松的事茫叭,這其中有一些難點問題:
如何知道分布式軟件中有哪些容器鏡像,因為我們需要把這些鏡像緩存下來半等,不管是掃描用戶的yaml文件還是用helm template之后掃描都是不完美的揍愁,首先不能確定用戶的編排方式是什么,其次有些軟件甚至不把鏡像地址寫在編排文件中杀饵,而是通過自己的程序去拉起莽囤。無法保證build成功運行就一定沒問題。
容器鏡像是需要被存儲到私有倉庫中打包在集群鏡像里切距,那容器鏡像倉庫地址勢必和編排文件中寫的不一樣朽缎,特別是怎么保證用戶alwayPull的時候還是能夠在私有倉庫中下載到鏡像。
這里就體現sealer build的過程起一個臨時k8s集群的優(yōu)勢了谜悟,最終集群會讓docker去pull鏡像话肖,我們在pull的過程中攔截鏡像并緩存,透明的支持了容器鏡像存儲
如此做到了你Build的產物一致性會非常好葡幸,到了其它環(huán)境部署幾乎無需更改最筒。
配置文件管理
很多交付場景會有大量的業(yè)務配置文件要向外透出,sealer可以非常友好的讓用戶透出這些配置到Clusterfile中蔚叨。典型的情況是用戶希望集群鏡像里面的helm values能夠在部署時修改床蜘。
用戶只需要在Clusterfile中定義一個Config即可:
---
apiVersion: sealer.aliyun.com/v1alpha1
kind: Config
metadata:
name: mysql-values.yaml
spec:
path: etc/mysql-chart/values.yaml
data: |
mysql-user: root
mysql-passwd: xxx
data中的內容就會覆蓋掉默認的mysql chart的values
插件機制
還有一些場景比如希望通過sealer去修改主機名,或者升級內核蔑水,或者同步時間這些“本不該”由sealer去做的事情悄泥,那么我們可以啟用插件的方式來完成,以修改主機名插件為例:
---
apiVersion: sealer.aliyun.com/v1alpha1
kind: Plugin
metadata:
name: HOSTNAME
spec:
data: |
192.168.0.2 master-0
192.168.0.3 master-1
192.168.0.4 master-2
192.168.0.5 node-0
192.168.0.6 node-1
192.168.0.7 node-2
只需要定義上面插件就可以幫助用戶把集群中節(jié)點的主機名修改中data中定義的名字
當然還有一些其它的插件如打標簽插件肤粱,執(zhí)行shell命令插件等.
不同runtime支持
未來你可以FROM k3s FROM k0s FROM ACK等等弹囚,而完全不用關心他們之間的安裝差異。
對接公有云
現在很多用戶都希望在云端運行自己的集群鏡像领曼,sealer自帶對接公有云能力鸥鹉,sealer自己實現的基礎設施管理器蛮穿,得益于我們更精細的退避重試機制,30s即可完成基礎設施構建(阿里云6節(jié)點)性能是同類工具中的佼佼者毁渗,且API調用次數大大降低践磅,配置兼容Clusterfile。
| 何種場景適合使用sealer
如果你要整體交付你的分布式SaaS灸异,請用sealer
如果你要集成多個分布式服務在一起府适,如數據庫消息隊列或者微服務運行時,請用sealer
如果你要安裝一個分布式應用如mysql主備集群肺樟,請用sealer
如果你需要安裝/管理一個kubernetes高可用集群檐春,請用sealer
如果你要初始化多個數據中心,保持多個數據中心狀態(tài)強一致么伯,請用sealer
如果你需要在公有云上實現上述場景疟暖,請用sealer
| 心得
sealer最值得我們自豪的地方是把復雜的東西變簡單了,將近使用了一年的時間去思考User Interface田柔,怎么在用戶視角看不損失功能還能簡單俐巴,這非常難,Kubefile的設計草稿被推翻了不知道多少次硬爆,千錘百煉最終打造出sealer這個項目欣舵。
還想說一下sealer和sealos的淵源,其實sealos是我很早開源的一個很受歡迎的項目缀磕,一步一步迭代缘圈,真的把安裝k8s集群這件事做到了接近完美。然而有很多理由讓我必須要做一個大的改變了:
sealos背后其實有一整套自動化構建離線包能力的平臺虐骑,但是這些東西非常專用准验,基本是給我們自己發(fā)布新的離線包使用的而一般的開發(fā)者根本沒有辦法復用到這些能力赎线,如何“優(yōu)雅的開放這些能力”一直是我思考的廷没。sealer完美的給出了答案!
可能用過sealos的知道sealos有個install命令垂寥,可以安裝其它app如prometheus ingress dashboard這些颠黎,然而這塊的設計我一直不滿,但是又找不到更優(yōu)雅的設計滞项,只能說sealos的app包是沒有技術含量的狭归,首先鏡像靠load,這樣yaml里面always pull就涼了文判,其次打包麻煩过椎,需要用戶自己save鏡像再tar,簡直太low戏仓,而sealer一個Kubefile完全解決疚宇,這得益于底層鏡像緩存技術的創(chuàng)新亡鼠。
sealos不會產生一個生態(tài),很簡單我們做東西給開發(fā)者使用敷待,是一個一對多的關系间涵,而sealer的出現,任何人都可以成為生產者和消費者榜揖,生態(tài)的崛起才有可能勾哩。
sealos的代碼現在看來簡直就是一坨SHIT(自我批評一下),很早的時候我只重視User interface而不重視用戶看不到的地方举哟,想著一個安裝工具而已思劳,隨手寫寫,只要命令好用誰管你里面是什么樣炎滞,PR只要回歸測試沒問題我也基本都全合并敢艰,現在證明這樣是大錯特錯!這種心態(tài)會讓你失去對自己作品的愛最終只能滅亡或者重構册赛,好在sealer算是涅槃重生了钠导。
我在怎么把事情變簡單的道路上一直有著很多的探索和很多非常棒的想法,并且最終把它變?yōu)楝F實森瘪,sealos就是個例子牡属,然而那只能是個業(yè)余興趣項目,而sealer不一樣扼睬,融入了更多的思考逮栅,以及整個社區(qū)的共同努力。當初大家還以為集群鏡像只是個空洞的概念窗宇,而今天大家都可以切實體驗到它變成了現實!
kubernetes一鍵安裝