K3S vs K0S
· 10 min read
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 | /var/lib/rancher/k3s/data/current |
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 | 系统/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 有交集
- 中文化社区友好
- 单节点默认 SQLite
- k0s
- 更新 - 2020 年 - 目前已经成熟,可以用于生产
- 用户体验更好
- k0sctl
- 能更好的辅助维护更多的集群,减少对 脚本/ansible 的依赖。
- 更好升级
- 更好备份
- 单节点默认 etcd/kine
为什选择 K0S
- k0s 作为 supervisor 运行 - 🌟
- 每个进程独立 - etcd, k0s-api, kube-apiserver
- 方便调试,排查问题 - 能清楚知道哪个进程启动了没启动
- 能看到所有实际运行参数
- 可以单独 kill 进程 - 例如: 修改了 containerd 镜像配置,只能通过 kill 来使新的配置生效
- 不需要启停全部服务
- 代码部署运行逻辑清晰 - 如果需要更深入了解
- 每个进程独立 - etcd, k0s-api, kube-apiserver
k0s bundled 了更多依赖 - ⭐️ - containerd, iptables- 目前 k3s 和 k0s 这一块区别不大- 几乎对系统没什么额外依赖
- k0sctl 辅助部署
- 如果需要可自行进行定制化
- 替代部分 ansible 工作
- 默认 control plane 和 worker 分离
- ⚠️ 部署有一些注意事项
- 使用 konnectivity - 相对更 kubernetes
- 改动更小
caution
- 默认用到了 k8s.gcr.io 镜像 - 国内环境部署需要注意,建议用 airgap 包导入基础镜像。
- k0sctl 功能还比较欠缺 @2022
为什选择 K3S
- 更加成熟
- 更新更频繁 - 更贴近上游
易于迁移备份 - e.g. sqlite -> etcd, k3s snapshot- 社区更大
- 对中国环境友好 - 背靠 rancher
- k0s 默认 k8s.gcr.io 镜像 - 国内环境部署需要注意,建议用 airgap 包导入基础镜像。
关于 Provisioning
虽然有 autok3s 和 k0sctl,一般重复部署时候还是建议自行脚本部署,但初次尝试使用这种自动化工具问题不大。
建议自行部署的主要原因:
- 工具可能会更新迭代 - 工具会变
- 特殊需求 - e.g. 需要自定义配置,pod 数量,网络参数
- 特殊环境 - e.g. musl, arm, alpinelinux
- 更好管控细节
当需要在多个环境中进行重复部署时,自行编写的自动化脚本比使用官方的自动化工具更加可靠。
关于 Docker
不建议使用 Docker 作为容器运行时,建议使用 containerd。
- 默认配置,不需要任何配置
- 避免污染 docker
- 现在都 bundle 了 containerd,更能匹配 k8s 要求的版本
推荐 Docker 用于前期 bootstrap 或者作为 host sock 给容器内用。
- 通过 docker 启动 dns 相关的服务
- dns 服务过于底层,不应该在 k8s 内部运行,会导致启动很慢
- 用于实现重新映射 domain -> ip
- 例如: adguard, dnsmasq
- 例如: 映射 docker.io 为 内网 IP
- 通过 docker 启动 registry 缓存镜像 - 配置为 mirror 可加速或者实现 airgap