1.什么是K3s
K3s 被设计为小于 40MB 的单个二进制文件,完全实现了 Kubernetes API。为了实现这一目标,他们删除了许多不需要成为核心一部分的额外驱动程序,并且很容易被附加组件替换。
K3s 是完全 CNCF(云原生计算基金会)认证的 Kubernetes 产品。这意味着你可以编写你的 YAML 来对抗常规的“全脂”Kubernetes,它们也适用于 k3s 集群。由于其资源要求低,可以在 512MB 以上的 RAM 计算机上运行集群。这意味着我们可以允许 Pod 在主节点和节点上运行。
因为它是一个很小的二进制文件,这意味着我们可以在启动常规 Kubernetes 集群的一小部分时间内安装它!我们通常会在不到两分钟的时间里启动具有少量节点的 k3s 集群,这意味着您可以立即部署应用程序来学习/测试。它的声誉和采用率也在快速增长,自 17 年初推出以来,超过 2019k 颗 Github 明星,而它最近被 Stackshare 评为 1 年排名第一的新开发者工具。
2.K8s的痛点
尽管Kubernetes(K8s)是一个强大而广泛使用的容器编排平台,但在实际使用中仍然存在一些痛点和挑战,这些可能因组织的具体需求和环境而异。
- 复杂性: Kubernetes是一个非常强大的工具,但也因其复杂性而闻名。配置、管理和维护一个Kubernetes集群可能需要较长时间的学习曲线,尤其是对于初学者来说。
- 学习曲线: 对于新手来说,学习Kubernetes可能是一项庞大的任务。理解概念、资源对象和Kubernetes API的使用可能需要一些时间。
- 网络配置: Kubernetes的网络配置可能相对复杂,特别是对于需要跨多个集群、云提供商或边缘设备的复杂网络拓扑的组织。
由于上述等原因,轻量级的Kubernetes(K3s)应运而生。
3.K3s增强功能
K3s 是一个完全兼容的 Kubernetes 发行版,具有以下增强功能:
- 打包为单个二进制文件。
- 使用基于 sqlite3 作为默认存储机制的轻量级存储后端。同时支持使用 etcd3、MySQL 和 Postgres。
- 封装在简单的启动程序中,可以处理很多复杂的 TLS 和选项。
- 默认情况下是安全的,对轻量级环境有合理的默认值。
- 添加了简单但强大的 batteries-included 功能,例如:
-
- 本地存储提供程序
- service load balancer
- Helm controller
- Traefik ingress controller
- 所有 Kubernetes control plane 组件的操作都封装在单个二进制文件和进程中。因此,K3s 支持自动化和管理复杂的集群操作(例如证书分发等)。
- 最大程度减轻了外部依赖性,K3s 仅需要现代内核和 cgroup 挂载。K3s 打包了所需的依赖,包括:
-
- containerd
- Flannel (CNI)
- CoreDNS
- Traefik (Ingress)
- Klipper-lb (Service LB)
- 嵌入式网络策略控制器
- 嵌入式 local-path-provisioner
- 主机实用程序(iptables、socat 等)
3.K3s与K8s的相同点
- 容器编排: K3s和Kubernetes都是用于容器编排的平台。它们可以自动化和管理大量的容器应用程序,确保它们在集群中高效运行。
- 容器生态系统: 两者都建立在Docker等容器技术的基础上,可以轻松部署和管理容器化的应用程序。
- 伸缩性: K3s和Kubernetes都支持水平扩展,可以根据负载的变化动态调整集群中的资源分配。
- 服务发现和负载均衡: 两者都提供了服务发现和负载均衡的机制,使得应用程序能够相互通信并在多个实例之间均衡分配负载。
- 存储管理: K3s和Kubernetes都提供了存储卷的概念,允许容器访问持久化数据。
4.K3s与K8s区别
那么使用 k3 有什么区别呢?
首先,单个控制平面 k3s 集群中的默认数据库是 SQLite。性能对于小型集群来说很棒,但如果需要更大的集群,可能需要用更强大的东西替换,例如 etcd、MySQL 或 PostgreSQL!幸运的是,k3s 支持所有这些(而上游 Kubernetes 只支持 etcd)!
另一个真正的区别只适用于较大的云提供商之一,你可能已经在上游 Kubernetes 源代码中有很多扩展,因为 k3s 删除了所有这些扩展并依赖于标准接口(如容器存储接口 (CSI))来实现它们。不过,这对最终客户没有影响,只对服务提供商本身有影响。
如下表所示,我们分别从多个不同方面,对比了K3s与K8s的区别。
特征 | K3s | K8s |
大小 | 占用空间更小(小于 200MB) | 占用空间更大(数百 MB) |
依赖 | 更少的依赖关系 | 更多的依赖,包括 etcd、kube-proxy 等。 |
资源使用情况 | 使用更少的资源(CPU、RAM 等) | 使用更多资源,尤其是对于大型集群 |
部署 | 更易于部署和管理 | 更复杂的部署和管理 |
配置 | 简化配置,选项更少 | 具有许多选项的更复杂的配置 |
可扩展性 | 大型群集的可扩展性有限 | 可扩展到更大的集群和工作负载 |
高可用性 | 可能存在高可用性限制 | 强大的高可用性选项,包括群集级冗余、自动故障转移等。 |
特征 | 更少的内置功能和扩展 | 提供广泛的功能和扩展,包括服务发现、负载平衡、自动扩展等。 |
安全 | 由于代码库较小,攻击面更少 | 更大的代码库,具有更多潜在的攻击面 |
兼容性 | 与某些 Kubernetes 工具和扩展的兼容性有限 | 与各种 Kubernetes 工具和扩展的强大兼容性 |
使用案例 | 非常适合资源受限的小型部署、边缘计算和物联网 | 更适合具有高资源要求的大型复杂部署,例如大数据、机器学习和高性能计算 |
5.K3s的安装
K3s 提供了一个安装脚本,可以方便地将其作为服务安装在基于 systemd 或 openrc 的系统上。该脚本可在 https://get.k3s.io 获得。要使用这种方法安装 K3s,只需运行:
curl -sfL https://get.k3s.io | sh -
还可以使用以下方法加速安装
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh |
INSTALL_K3S_MIRROR=cn sh -
运行此安装后:
- K3s 服务将被配置为在节点重启后或进程崩溃或被杀死时自动重启。
- 将安装其他实用程序,包括 kubectl、crictl、ctr、k3s-killall.sh 和 k3s-uninstall.sh。
- kubeconfig 文件将写入到 /etc/rancher/k3s/k3s.yaml,由 K3s 安装的 kubectl 将自动使用该文件。
curl -sfL https://get.k3s.io |
K3S_URL=https://myserver:6443 K3S_TOKEN=mynodetoken sh -
还可使用以下方法加速安装
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh
| INSTALL_K3S_MIRROR=cn K3S_URL=https://myserver:6443 K3S_TOKEN=mynodetoken sh -
K3S_URL 参数会导致安装程序将 K3s 配置为 Agent 而不是 Server。K3s Agent 将注册到在 URL 上监听的 K3s Server。K3S_TOKEN 使用的值存储在 Server 节点上的 /var/lib/rancher/k3s/server/node-token 中。
注意:每台主机必须具有唯一的主机名。如果你的计算机没有唯一的主机名,请传递 3S JODEAE 环境变量,并为每个节点提供一个有效且唯一的主机名。
安装完成后,你可以使用以下命令检查K3s的状态:
sudo k3s kubectl get nodes
如果一切正常,你应该看到一个节点(Node)的列表,表示K3s集群已成功启动。