之所以叫做 K3S 是因为希望安装的 K8S 在内存占用方面只是一半的大小,而一半大的东西就是一个 5 个字母的单词,简写为 K3S。

k3s 特点

  • k3s 是由 Rancher Lab 开源的轻量级 Kubernetes。k3d 完美继承了 k3s 的简单、快速和占用资源少的优势,镜像大小只有 100 多 M,启动速度快,支持多节点集群。虽然 k3s 对 Kubernetes 进行了轻量化的裁剪,但是提供了完整了功能,像 Istio 这样复杂的云原生应用都可以在 k3s 上顺利运行。

  • 因为 k3s 本身应用场景主要在边缘侧,所以支持的设备和架构很多,如:ARM64 和 ARMv7 处理器。很多老旧 PC 和树莓派这样的设备都可以拿来做成 k3s 集群,为本地研发测试燃尽最后的生命。

  • k3s是打包为单个二进制文件

  • 把 K8S 相关的组件,比如 kube-api/ kube-manager 都打包到同一个二进制文件里面,这样的话,只需要启动这个文件就可以快速的启动对应的组件。

  • 使用基于 sqlite3 的默认存储机制

  • 同时支持使用 etcd3、MySQL 和 PostgreSQL 作为存储机制。

  • 默认情况下是安全的

  • 在 K3s 中有一个默认的证书管理机制(默认一年有效期),也有一个可以轮转证书的功能(就是在小于九十天之内重启 K3s 的话,就会自动续一年)。

  • 功能强大的 batteries-included 功能

  • 就是虽然有些服务本身这个二进制文件并没有提供,但是可以通过内置的服务,将配置文件放到指定的目录下面,就可以在启动的时候一并将该服务启动或替换默认组件。

  • 所有 K8S control-plane 组件都封装在单个二进制文件和进程中

  • 因为封装在二进制文件中,所以启动的时候只有一个进程。好处在于只需要管理这个单一进程就可以了,同时也具备操作复杂集群的能力。

  • 最大程度减轻了外部依赖性

  • 即稍新一点的 Linux 内核就可以了(需要 kernel 和 cgroup 挂载)。

k3s HA实现原理

我们都知道k8s的默认datastore是etcd,而k3s是如何将针对etcd的相关操作,转化到其他类型的datastore上的呢?这里Rancher开发了一个新的组件叫kine(https://github.com/rancher/kine),由它来完成这项工作。k8s(k3s)的api-server默认使用etcd v3的存储接口,etcd v3中被k8s使用的接口大致如下(https://github.com/etcd-io/etc ... proto):

在kine中,这些接口都依次被实现(Lease相关还不支持),可以参考这里:

https://github.com/rancher/kin ... erver

kine将这些接口暴露给k3s的api-server。当我们给k3s设置相应的datastore-endpoint时,k3s的api-server还是配置连接etcd v3,但是etcd-servers的地址则配置为kine的服务地址,相当于所有的api读写操作都通过kine来处理,kine来把读写操作转给MySQL/PostgreSQL/SQLite等。如果我们设置真正的etcd backend,kine会略过并直接暴露真实的etcd-servers给k3s api-server。

worker节点中的api-server代理通过一个tcpproxy(http://github.com/google/tcpproxy)来实现,参考:

https://github.com/rancher/k3s ... er.go

tcpproxy需要获取真实的api-server的服务地址,这里主要靠worker与master建立的tunnel,也就是websocket数据通道获取,这个tunnel是k3s独有的。当api-server地址有更新,worker依靠websocket获取新的地址,同时更新worker中的tcpproxy的配置。