vs. | k0s | k3s |
---|---|---|
since | 2020-06 | 2019-03 |
by | Mirants | Rancher/SUSE |
Governance | Mirants | CNCF |
Github | k0sproject/k0s | k3s-io/k3s |
Stars | ||
Issues | ||
CNI | kube-router,calico | flannel |
CRI | containerd | containerd |
CSI | OpenEBS | local-path-provisioner |
Windows | ✅ - calico | ❌ |
Arch | amd64,arm,arm64 | amd64,arm,arm64 |
LoadBalancer | n/a | klipper-lb |
Ingress | n/a | traefik |
Controller-Worker | konnectivity | remotedialer - WebSocket 反向代理 |
文档 | ⭐️⭐️ | ⭐️⭐️ |
成熟 | ⭐️⭐️ | ⭐️⭐️⭐️ |
国内环境友好 | ⭐️ | ⭐️⭐️⭐️ |
Pod CIDR | 10.244.0.0/16 | 10.42.0.0/16 |
Service CIDR | 10.96.0.0/12 | 10.43.0.0/16 |
CoreDNS | 10.96.0.10 | 10.43.0.10 |
configuration | /etc/k0s/k0s.yaml | /etc/rancher/k3s/config.yaml |
registry | /etc/k0s/k0s.yaml | /etc/rancher/k3s/registry.yaml |
data-dir | /var/lib/k0s | /var/lib/rancher/k3s |
bin-dir | /var/lib/k0s/bin | n/a |
kubeconfig | /var/lib/k0s/pki/admin.conf | /etc/rancher/k3s/k3s.yaml |
manifest | /var/lib/k0s/manifests | /var/lib/rancher/k3s/server/manifests |
local storage | /var/openebs/local | /var/lib/rancher/k3s/storage/ |
服务运行方式 | supervisor - 独立多进程 | embeded - 单进程 |
containerd | bundled | 系统 |
- k0s
- CIS security benchmark
- 符合 FIPS 140-2 要求
- bundled
- iptables, containerd, ctr, runc, etcd, kine
- openebs
- openebs-hostpath -> /var/openebs/local
- kube-router
- konnectivity
- helm-controller
- k3s
- CNCF 项目 - 脱离了 rancher
- bundled
- containerd, ctr, runc, etcd, kine
- helm-controller - 支持部署 helm chart, CDR 控制
- traefik - 提供 ingress 能力 - 通过 helm 部署
- local-path-provisioner - 提供基于本地目录的存储类
- 默认 /var/lib/rancher/k3s/storage
- klipper-lb - 基于 iptable 转发的负载均衡
caution
- k3s 默认包含较多组件,部署后 可使用性 更高,但部分组件( traefik,klipper-lb,local-path-provisioner )不建议生产使用,提供这些组件更多是为了保证功能完整,开箱即用。
- 使用 k3s 不推荐使用内置 traefik 和 klipper-lb
- ingress 建议自行安装 - 比较重要的核心组件
- 建议使用 metallb 替代 klipper-lb
- 因为 Controller-Worker 网络不同,k3s 和 k0s 无法混合使用
命令对比
k0s | k3s |
---|---|
k0s systinfo | ./contrib/util/check-config.sh |
k0s backup | k3s etcd-snapshot |
k0s restore | k3s server --cluster-reset-restore-path |
k0s controller | k3s server |
k0s worker | k3s agent |
n/a | k3s crictl |
k0s install | https://get.k3s.io 会安装 systemd, openrc 服务 |
k0s reset | n/a |
k0s kubeconfig create | n/a |
k0sctl | n/a |
k0sctl apply | ~autok3s |
k0sctl backup | n/a |
--- | --- |
k0s kubectl | k3s kubectl |
k0s ctr | k3s ctr |
如何选择
相同点
- 面向相同用户群体和使用场景,非常类似
- 核心都使用 kine - 区别不大
- 都有大的企业支撑开发
选择考量
- k3s
- 更成熟 - 存在时间更长,使用的更独立
- 社区更大 - 社区还与 rancher、rke 有交集
- 中文化社区友好
- k0s
- 更新 - 2020 年 - 目前已经成熟,可以用于生产
- 用户体验更好
- k0sctl
- 能更好的辅助维护更多的集群,减少对 脚本/ansible 的依赖。
- 更好升级
- 更好备份
为什选择 K0S
- k0s 作为 supervisor 运行 - 🌟
- 每个进程独立 - etcd, k0s-api, kube-apiserver
- 方便调试,排查问题 - 能清楚知道哪个进程启动了没启动
- 能看到所有实际运行参数
- 可以单独 kill 进程 - 例如: 修改了 containerd 镜像配置,只能通过 kill 来使新的配置生效
- 不需要启停全部服务
- 代码部署运行逻辑清晰 - 如果需要更深入了解
- 每个进程独立 - etcd, k0s-api, kube-apiserver
- k0s bundled 了更多依赖 - ⭐️ - containerd, iptables
- 几乎对系统没什么额外依赖
- k0sctl 辅助部署
- 如果需要可自行进行定制化
- 替代部分 ansible 工作
- 默认 control plane 和 worker 分离
- ⚠️ 部署有一些注意事项
- 使用 konnectivity - 相对更 kubernetes
caution
默认用到了 k8s.gcr.io 镜像 - 国内环境部署需要注意,建议用 airgap 包导入基础镜像。
组件简介
- kine
k3s 和 k0s 最核心组件
- 提供 etcd 能力
- 后端支持 etcd,sqlite,mysql,postgresql,dqlite
- traefik
- 提供 Ingress 能力
- k3s-io/helm-controller
- 支持部署 helm chart
- 通过 CDR 控制
- CNI - 容器网络
- CSI - 容器存储
- local-path-provisioner
- 基于本地路径提供 volume
- openebs
- local-path-provisioner
- LoadBalancer
- k3s-io/klipper-lb
- 基于 iptable 提供 ClusterIP 能力
- metallb
- k3s-io/klipper-lb
参考
为什么会存在不同发行版
K8S 作为最原始的项目,派生出来很多 分支/发布版。
Kubernetes 的核心能力为资源调度,主要资源为 Pod/容器组/计算资源。 因为是分布式多节点,所以对网络有要求。Pod 调度主要提供计算能力,实际使用还会需要存储能力。 也就是说 Kubernetes 涉及到核心的三元素
- 计算
- 网络
- 存储
Kubernetes 核心调度计算资源,但对于网络和存储是 无意见/Unopinioned ,但实际部署使用时这时候又不可避免的要面对这些问题。 因此不同的 发布版/Distribution 就是对这些问题不同的看法。
K8S 要求
Kubernetes 由 Google 开发,但不是所有人都有那么大规模的问题,而大多数时候都是小规模,先让 K8S “跑起来”。
Kubernetes 自身因为对基础设施层 无意见/Unopinioned,因此默认是没有部署工具,只有要求:
- 要求节点运行在平坦网络
- 要求 etcd 能力的状态存储
- 要求 cloud-controller 提供节点信息
- 要求 容器运行时
在这些基础之上,Kubernetes 提供基于状态的 接口 进行资源调度。
K8S 部署
除了满足 K8S 的要求,在实际使用时还希望能方便快捷的管理部署。 K8S 提供了 kubeadm 进行安装,不同的发布版也需要提供类似的工具,但工具区分为两部分
- 远程开通部署
- SSH
- 控制节点通过工具部署到多个节点
- 开通部署的提前准备
- CA 证书
- ETCD/存储初始化
- 网络设置
- Bootstrap
kubeadm 和 k0s, k3s 都属于第二种场景,第一种场景的工具例如
- autok3s
- rke
- ansible