K3S vs K0S
K0S vs K3S
| vs. | k0s | k3s |
|---|---|---|
| since | 2020-06 | 2019-03 |
| by | Mirants | Rancher/SUSE |
| Governance | Mirants | CNCF |
| Github | k0sproject/k0sGitHubk0sproject/k0s[k0s] 是什么? · 类似 k3s 的精简 k8s · 无系统依赖 - 静态 · 无外部依赖 · 支持 amd64 Windows · 支持 amd64, arm, arm64 · 网络 · kube-router - 默认 · 资源占用更少 - 比 calico 少 15%笔记:k0s | k3s-io/k3sGitHubk3s-io/k3s节点的名字需要唯一 · 默认使用 hostname · 可使用 或 修改 · k3s 会读取 或 作为节点 UUID · kubconfig 文件 · 部署 traefik 作为 ingress · k3s-io/k3s · 环境要求 · Linux 3.10+笔记:K3S |
| Stars | k0sproject/k0sGitHubk0sproject/k0s[k0s] 是什么? · 类似 k3s 的精简 k8s · 无系统依赖 - 静态 · 无外部依赖 · 支持 amd64 Windows · 支持 amd64, arm, arm64 · 网络 · kube-router - 默认 · 资源占用更少 - 比 calico 少 15%笔记:k0s | k3s-io/k3sGitHubk3s-io/k3s节点的名字需要唯一 · 默认使用 hostname · 可使用 或 修改 · k3s 会读取 或 作为节点 UUID · kubconfig 文件 · 部署 traefik 作为 ingress · k3s-io/k3s · 环境要求 · Linux 3.10+笔记:K3S |
| Issues | k0sproject/k0sGitHubk0sproject/k0s[k0s] 是什么? · 类似 k3s 的精简 k8s · 无系统依赖 - 静态 · 无外部依赖 · 支持 amd64 Windows · 支持 amd64, arm, arm64 · 网络 · kube-router - 默认 · 资源占用更少 - 比 calico 少 15%笔记:k0s | k3s-io/k3sGitHubk3s-io/k3s节点的名字需要唯一 · 默认使用 hostname · 可使用 或 修改 · k3s 会读取 或 作为节点 UUID · kubconfig 文件 · 部署 traefik 作为 ingress · k3s-io/k3s · 环境要求 · Linux 3.10+笔记:K3S |
| 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 | remotedialerGitHubrancher/remotedialerrancher/remotedialer · 使用 websocket 建立通道 · tcp over websocket · 内部会管理多个客户端 · 通过通道进行 - 相当于通过远程进行调用 · Adopter · k3s, rancher笔记: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笔记k0s[k0s] 是什么? · 类似 k3s 的精简 k8s · 无系统依赖 - 静态 · 无外部依赖 · 支持 amd64 Windows · 支持 amd64, arm, arm64 · 网络 · kube-router - 默认 · 资源占用更少 - 比 calico 少 15%打开:/notes/devops/kubernetes/distro/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笔记K3S节点的名字需要唯一 · 默认使用 hostname · 可使用 或 修改 · k3s 会读取 或 作为节点 UUID · kubconfig 文件 · 部署 traefik 作为 ingress · k3s-io/k3s · 环境要求 · Linux 3.10+打开:/notes/devops/kubernetes/distro/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 转发的负载均衡
- 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 | 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
- 改动更小
- 默认用到了 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
- 如果不想在 k8s 内 dind 可以映射 host docker.sock
组件简介
- kine笔记kinek3s-io/kine 是什么? · kine -> Kine Is Not Etcd · etcd 适配器, 支持部分 etcd 功能 - 满足 k8s 使用 · 后端支持 postgres, mysql, sqlite, dqlite · 可独立启动打开:/notes/devops/kubernetes/distro/kine
k3s 和 k0s 最核心组件
- 提供 etcd 能力
- 后端支持 etcd,sqlite,mysql,postgresql,dqlite
- traefik笔记Traefik IngressTraefik 的 K8S 分为 CRD 方式和标准的 IngressController · CRD 支持更多功能 - Helm 安装 · Traefik 支持非常多的功能 - ACME, SNI, Dashboard, Tracing, Metrics打开:/notes/devops/kubernetes/network/traefik-ingress
- 提供 Ingress 能力
- k3s-io/helm-controllerGitHubk3s-io/helm-controller
- 支持部署 helm chart
- 通过 CDR 控制
- CNI - 容器网络
- flannel笔记Flannelflannel-io/flannel · layer 2 · overlay network · 每个节点一个 CIDR 段 · 支持后端 · vxlan · 大多时候默认 · DirectRouting 可以在相同 subnet 时直连 - 类似 host-gw打开:/notes/devops/kubernetes/network/flannel
- calico笔记Calicoprojectcalico/calico · 提供 · 网络联通 · 管理 · 安全 · layer 3, BGP · Network policy · 可集成 istio 拦截流量 · 参考 · Node requirements打开:/notes/devops/kubernetes/network/calico
- kube-router笔记kube-routercloudnativelabs/kube-router · LVS/IPVS service proxy - IPVS+IPTables · Pod Networking - Router Controller - GoBGP+routing打开:/notes/devops/kubernetes/network/kube-router
- CSI - 容器存储
- local-path-provisioner笔记Local Path Provisionerrancher/local-path-provisioner · - · 自动创建目录 - /var/lib/rancher/k3s/storage · - · UUID=pvc.uid · PVCNAME= · helper-pod-create-pvc打开:/notes/devops/kubernetes/storage/local-path-provisioner
- 基于本地路径提供 volume
- openebs笔记OpenEBSopenebs/openebs · openebs.io · Jiva 源于 longhorn fork,在一些实现上有分歧 · 目前区别已经非常大 · 分歧点: Control Plane functionality, iSCSI Target implementation, Quorum, Backup / Restore, UI打开:/notes/devops/kubernetes/storage/openebs
- local-path-provisioner笔记Local Path Provisionerrancher/local-path-provisioner · - · 自动创建目录 - /var/lib/rancher/k3s/storage · - · UUID=pvc.uid · PVCNAME= · helper-pod-create-pvc打开:/notes/devops/kubernetes/storage/local-path-provisioner
- LoadBalancer
- k3s-io/klipper-lbGitHubk3s-io/klipper-lb
- 基于 iptable 提供 ClusterIP 能力
- metallb笔记MetalLBdanderson/metallb · 基于主机 L2 提供 LB 能力 - VIP/虚拟 IP/负载均衡 · 支持 L2 和 BGP 模式 · L2 使用 ARP/NDP - 配置简单 · 会监听所有网卡 · 流量只会到 一个节点 不是真正的负载均衡打开:/notes/devops/kubernetes/network/metallb
- k3s-io/klipper-lbGitHubk3s-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
- k0sctl
关联信息
反向链接、本文链接的其他页面和外部资料。
反向链接
- DevOps 常见问题笔记
ClickOps · Jenkins · AWX, SemaphoreUI · Gitlab CI manual trigger · Github Action manual trigger · | - | DevOps | OPS | · | 范围 | 覆盖开发、测试、运维等全生命周期 | 负责系统运营与维护 |
- K8S Awesome笔记 · K3S vs. K0S
cncf landscape · awesome-cloud-native · Service Mesh / Cloud Native · GoogleCloudPlatform/scion · Google Cloud Platform 相关的 Go 项目。
站内链接
- Calico笔记 · calico
projectcalico/calico · 提供 · 网络联通 · 管理 · 安全 · layer 3, BGP · Network policy · 可集成 istio 拦截流量 · 参考 · Node requirements
- Flannel笔记 · flannel
flannel-io/flannel · layer 2 · overlay network · 每个节点一个 CIDR 段 · 支持后端 · vxlan · 大多时候默认 · DirectRouting 可以在相同 subnet 时直连 - 类似 host-gw
- k0s笔记
[k0s] 是什么? · 类似 k3s 的精简 k8s · 无系统依赖 - 静态 · 无外部依赖 · 支持 amd64 Windows · 支持 amd64, arm, arm64 · 网络 · kube-router - 默认 · 资源占用更少 - 比 calico 少 15%
- K3S笔记
节点的名字需要唯一 · 默认使用 hostname · 可使用 或 修改 · k3s 会读取 或 作为节点 UUID · kubconfig 文件 · 部署 traefik 作为 ingress · k3s-io/k3s · 环境要求 · Linux 3.10+
- kine笔记 · kine
k3s-io/kine 是什么? · kine -> Kine Is Not Etcd · etcd 适配器, 支持部分 etcd 功能 - 满足 k8s 使用 · 后端支持 postgres, mysql, sqlite, dqlite · 可独立启动
- kube-router笔记 · kube-router
cloudnativelabs/kube-router · LVS/IPVS service proxy - IPVS+IPTables · Pod Networking - Router Controller - GoBGP+routing
- Local Path Provisioner笔记 · local-path-provisioner
rancher/local-path-provisioner · - · 自动创建目录 - /var/lib/rancher/k3s/storage · - · UUID=pvc.uid · PVCNAME= · helper-pod-create-pvc
- MetalLB笔记 · metallb
danderson/metallb · 基于主机 L2 提供 LB 能力 - VIP/虚拟 IP/负载均衡 · 支持 L2 和 BGP 模式 · L2 使用 ARP/NDP - 配置简单 · 会监听所有网卡 · 流量只会到 一个节点 不是真正的负载均衡
- OpenEBS笔记 · openebs
openebs/openebs · openebs.io · Jiva 源于 longhorn fork,在一些实现上有分歧 · 目前区别已经非常大 · 分歧点: Control Plane functionality, iSCSI Target implementation, Quorum, Backup / Restore, UI
- Traefik Ingress笔记 · traefik
Traefik 的 K8S 分为 CRD 方式和标准的 IngressController · CRD 支持更多功能 - Helm 安装 · Traefik 支持非常多的功能 - ACME, SNI, Dashboard, Tracing, Metrics
参考资料
GitHub5 条
- k0sproject/k0sgithub.com/k0sproject/k0s
- k3s-io/helm-controllergithub.com/k3s-io/helm-controller
- k3s-io/k3sgithub.com/k3s-io/k3s
- k3s-io/klipper-lbgithub.com/k3s-io/klipper-lb
- rancher/remotedialergithub.com/rancher/remotedialer
其他外链7 条
- get.k3s.ioget.k3s.io/
- img.shields.io/github/issues/k0sproject/k0simg.shields.io/github/issues/k0sproject/k0s
- img.shields.io/github/issues/k3s-io/k3simg.shields.io/github/issues/k3s-io/k3s
- img.shields.io/github/stars/k0sproject/k0simg.shields.io/github/stars/k0sproject/k0s
- img.shields.io/github/stars/k3s-io/k3simg.shields.io/github/stars/k3s-io/k3s
- kubernetes.io/docs/tasks/extend-kubernetes/setup-konnectivitykubernetes.io/docs/tasks/extend-kubernetes/setup-konnectivity
- landscape.cncf.io/card-mode?category=certified-kubernetes-installer&grouping=categorylandscape.cncf.io/card-mode?category=certified-kubernetes-installer&grouping=category