探祕 k8e:極簡 Kubernetes 發行版
TL;DR
本文介紹並安裝體驗了極簡 Kubernetes 發行版,也順便分析學習下編譯的流程。
背景
k8e[1] 本意爲 kuber easy,是一個 Kubernetes 的極簡發行版,意圖讓雲原生落地部署 Kubernetes 更輕鬆。k8e 是基於另一個發行版 k3s[2] ,經過裁剪(去掉了 Edge/IoT 相關功能、traefix 等)、擴展(加入 ingress、sidecar 實現、cilium 等)而來。
k8e 具有以下特性:
-
單二進制文件,集成了 k8s 的各種組件、containerd、runc、kubectl、nerdctl 等
-
使用 cilium 作爲 cni 的實現,方便 eBPF 的快速落地
-
支持基於 pipy 的 ingress、sidecar proxy,實現應用流量一站式管理
-
只維護一個 k8s 版本,目前是 1.21
-
按照私有云的經驗增加、優化代碼
得益於這些特性,k8e 非常適合 CI、開發和企業級部署,單機版的集羣適合技術驗證環境。
組件架構圖
安裝測試
可以從 GitHub 上下載對應版本的二進制文件 [3],也可以自己手動編譯(後面對編譯的流程進行了簡單的分析)。
sudo k8e check-config
sudo k8e server &
# Kubeconfig is written to /etc/k8e/k8e.yaml
export KUBECONFIG=/etc/k8e/k8e.yaml
# On a different node run the below. NODE_TOKEN comes from
# /var/lib/k8e/server/node-token on your server
sudo k8e agent --server https://myserver:6443 --token ${NODE_TOKEN}
# query all node from k8s cluster
sudo k8e kubectl get nodes
因爲沒有提供默認的 cni 實現,此時 pod 都處於 Pending
狀態。需要手動安裝 cilium:
通過 k8e check-config
可以找到 builddata 目錄:/var/lib/k8e/data/5a7ced03412504a18bf3f49cbee5dafca7187d86ef8fdaa789448d53d7fbb823
/var/lib/k8e/data/5a7ced03412504a18bf3f49cbee5dafca7187d86ef8fdaa789448d53d7fbb823/bin/cilium install
cilium 安裝成功後 Pod 成功運行,可以查看 cilium 狀態:
/var/lib/k8e/data/5a7ced03412504a18bf3f49cbee5dafca7187d86ef8fdaa789448d53d7fbb823/bin/cilium status
/¯¯\
/¯¯\__/¯¯\ Cilium: OK
\__/¯¯\__/ Operator: OK
/¯¯\__/¯¯\ Hubble: disabled
\__/¯¯\__/ ClusterMesh: disabled
\__/
DaemonSet cilium Desired: 1, Ready: 1/1, Available: 1/1
Deployment cilium-operator Desired: 1, Ready: 1/1, Available: 1/1
Containers: cilium Running: 1
cilium-operator Running: 1
Cluster Pods: 3/3 managed by Cilium
Image versions cilium quay.io/cilium/cilium:v1.10.5: 1
cilium-operator quay.io/cilium/operator-generic:v1.10.5: 1
或者執行 cilium connectivity test
進行檢查網絡。
上面是作爲開發驗證環境的部署,若要部署標準 Kubernetes,可以參考官方文檔 [4]。
編譯流程分析
k8e 的編譯部署簡單的兩條命令就能完成:
make generate
make
執行 make generate
下載內置的幾個工具:runc
、nerdctl
、cilium
,保存在 bin
目錄中。
.DEFAULT_GOAL
是 ci
,執行 make
則會執行 target ci
。
Dapper
在 makefile 的第一行是 TARGETS := $(shell ls hack | grep -v \\.sh | grep -v package-airgap| grep -v clean)
定義了變量 TARGETS
,然後 $(TARGETS): .dapper
爲幾個 target 指定前置條件。其中就有 ci
,因此在執行 ci
之前會先執行 target .dapper
。
target .dapper
用於下載 rancher dapper[5]。dapper 是 Docker 的構建封裝器,執行時會使用位於源碼根目錄 Dockerfile.dapper
構建鏡像,並以此作爲代碼構建環境。
在 Dockerfile.dapper
中,會準備構建環境,以及幾個需要關注的設置:
-
WORKDIR
:/go/src/github.com/xiaods/k8e/
,也就是容器的工作目錄。dapper
啓動時會將源碼內容拷貝到容器中 -
ENTRYPOINT
:["./hack/entry.sh"]
,容器啓動的 entrypoint。 -
CMD
:["ci"]
,容器運行時的默認 CMD -
ENV
-
DAPPER_SOURCE
:/go/src/github.com/xiaods/k8e/
-
DAPPER_OUTPUT
:./bin ./dist ./build/out
,構建完成後,會執行docker cp ${DAPPER_SOURCE}/${DAPPER_OUTPUT} .
將容器中的內容拷貝到容器外。 -
...
dapper 下載完成後會執行 ci
的命令:./.dapper ci
,根據 Dockerfile.dapper
的配置,啓動後會執行 ./hack/entry.sh ci
。
CI
CI 的流程與 k3s 的流程相比精簡了很多。在 ./hack/ci
中,會依次執行:
-
./hack/validate:代碼格式化、校驗
-
./hack/build:代碼編譯
-
./hack/package:將前面下載、編譯的
bin/
目錄下的二進制一同打包到同一個二進制文件中(使用 go-bindata[6])。 -
./hack/binary_size_check.sh:二進制文件大小的檢查,是否超過 81 M(k3s 的是 64M,由於加入了 cilium 等 cli,體積會有增加)。
參考資料
[1]
k8e: https://github.com/xiaods/k8e
[2]
k3s: https://github.com/rancher/k3s
[3]
二進制文件: https://github.com/xiaods/k8e/releases
[4]
官方文檔: https://getk8e.com/docs/install/quick-start/
[5]
rancher dapper: https://github.com/rancher/dapper
[6]
go-bindata: https://github.com/go-bindata/go-bindata
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/OT5JOOnRI6Zrq8eGfhqa5g