TL;DR
本文介绍并装置体验了极简 Kubernetes 发行版,也顺便剖析学习下编译的流程。
背景
k8e 本意为 kuber easy,是一个 Kubernetes 的极简发行版,用意让云原生落地部署 Kubernetes 更轻松。k8e 是基于另一个发行版 k3s,通过裁剪(去掉了 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 上下载对应版本的二进制文件,也能够本人手动编译(前面对编译的流程进行了简略的剖析)。
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,能够参考官网文档。
编译流程剖析
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。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)。 -
./hack/binary_size_check.sh:二进制文件大小的查看,是否超过 81 M(k3s 的是 64M,因为退出了 cilium 等 cli,体积会有减少)。
文章对立公布在公众号
云原生指北