1.简介与历史
Kubernetes简称K8s,是Google于2014年6月基于其内部使用的Borg系统开源的容器编排平台,可用于大规模运行分布式应用和服务。2015年,Google、RedHat 等开源基础设施领域公司,共同牵头发起了一个名为 CNCF(Cloud Native Computing Foundation)的基金会,希望以Kubernetes项目为基础,建立一个由开源基础设施领域厂商主导的、按照独立基金会方式运营的平台级社区。Kubernetes可以说是Google 公司在容器化基础设施领域多年来实践经验的沉淀与升华,加上近几年不断壮大的开源社区对其贡献,现在已经基本成为容器编排调度框架的标准。
然而,在资源有限的边缘计算、物联网等场景下,由于Kubernetes本身会占用不少资源,且这些场景下大多不需要使用到Kubernetes的全部功能,Kubernetes显得臃肿。在当今边缘计算和物联网发展迅速的时候,需要一个应对这些场景的轻量级容器编排解决方案,于是K3s应运而生。
K3s 由Rancher公司于2019年3月发布,是首个进入 CNCF 沙箱项目的 K8s 发行版,同时也是当前全球用户量最大的 CNCF 认证轻量级 K8s发行版。Rancher希望发行版能做到安装后只需K8s一半的内存大小,Kubernetes由10个字母组成,简写为K8s,发行版只需一半大应为5个字母,因此取名K3s,K3s 没有全称,也没有官方的发音。
K3s满足日益增长的在边缘计算环境中运行在 x86、ARM64 和 ARMv7 处理器上的小型、易于管理的 Kubernetes 集群需求,自发布以来备受全球开发者们关注,至今GitHub Star数已超过 16000,是开源社区最受欢迎的边缘计算 K8s 解决方案。
2.架构和功能
K8s核心组件
- apiserver
提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制;
- controller manager
负责维护集群的状态,比如故障检测、自动扩展、滚动更新等; - kubelet
负责维护容器的生命周期,同时也负责 Volume(CSI)和网络(CNI)的管理; - etcd
保存了整个集群的状态; - scheduler
负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上; - kube-proxy
负责为 Service 提供 cluster 内部的服务发现和负载均衡; - container runtime
负责镜像管理以及 Pod 和容器的真正运行(CRI);
K8s架构图
K3s核心组件与功能的不同点
由于K3s只是轻量化的k8s,各组件设计理念都和k8s基本相同,为了获得更少的资源消耗,k3s组件有如下不同:
- 嵌入式SQLite数据库,作为可选的存储源,可外接SQLite / Mysql / PostgreSQL / DQlite和etcd作为外部数据库,但并非默认项。
- 移除过时的功能、Alpha功能、非默认功能,这些功能在大多数Kubernetes集群中已不可用。
- 删除内置插件(比如云供应商插件和存储插件),可用外部插件程序替换。K3s在默认状态下只会启动除自身进程之外的两个应用:coredns和traefik。
- 默认执行容器从docker换成了containerd。
- 增加基于websocket的tunnel-proxy,简化部署。
- 封装在简单的启动程序中,该启动程序处理很多复杂的 TLS 和选项。
- k3s server 只有一个进程体,单一进程包含kubelet、containerd等必须的组件,k3s agnet 分为两个进程体,其中一个是 Containerd,负责管理运行容器
- K3s server = API Server + Scheduler + Controller Manager + sqllite + Tunnel Proxy.
- K3s Agent = Tunnel Proxy + Kube Proxy + Flannel + Kubelet
- k3s支持ARM,很多K8s发行版无法支持ARM
K3s架构图

3.硬件需求
cpu和内存
K3s agent、具有工作负载的 K3s server的最低资源要求:
内存: 最低 512MB(建议至少为 1GB)
CPU: 最低 1
K3s server 中节点的最低 CPU 和内存要求:
| 部署规模 | 节点 | VCPUS | 内存 |
|---|---|---|---|
| Small | Up to 10 | 2 | 4 GB |
| Medium | Up to 100 | 4 | 8 GB |
| Large | Up to 250 | 8 | 16 GB |
| X-Large | Up to 500 | 16 | 32 GB |
| XX-Large | 500+ |
数据库
K3s 支持不同的数据库,包括 MySQL、PostgreSQL、MariaDB 和 etcd,以下是运行大型集群所需的数据库资源的大小指南:
| 部署规模 | 节点 | VCPUS | 内存 |
|---|---|---|---|
| Small | Up to 10 | 1 | 2 GB |
| Medium | Up to 100 | 2 | 8 GB |
| Large | Up to 250 | 4 | 16 GB |
| X-Large | Up to 500 | 8 | 32 GB |
| XX-Large | 500+ | 16 | 64 GB |
4.部署过程
K8s部署
K8s的部署原本比较麻烦,除了将各个组件编译成二进制文件外,用户还要负责为这些二进制文件编写对应的配置文件、配置自启动脚本,以及为 kube-apiserver 配置授权文件等等诸多运维工作。2017 年,Kubernetes社区才发起了一个独立的部署工具,名叫kubeadm,这个工具可以让用户通过两条命令完成一个k8s集群的部署:
- 创建一个Master节点:
kubeadm init - 将一个Node节点加入到当前集群中:
kubeadm join
kubeadm是使用容器进行部署k8s组件的,但是,由于kubelet配置容器网络、管理容器数据卷时,都需要直接操作宿主机,如果kubelet运行在一个容器里,那么直接操作宿主机就会变得很麻烦,kubeadm的部署方案是:把 kubelet 直接运行在宿主机上,然后使用容器部署其他的 Kubernetes 组件。
于是,部署k8s集群的步骤:
- 安装doceker,可手动下载docker-ce的安装包进行安装
- 禁止防火墙、关闭swap、禁止selinux
```
禁止防火墙
$ sudo ufw disable关闭swap
$ sudo swapoff -a永久关闭swap分区
$ sudo sed -i ‘s/.swap./#&/‘ /etc/fstab
禁⽌selinux
安装操控selinux的命令
$ sudo apt install -y selinux-utils # 禁⽌止selinux $ setenforce 0
重启启操作系统 $ shutdown -r now
查看selinux是否已经关闭 $ sudo getenforce Disabled(表示已经关闭)
3. 安装kubeadm、kubelet 和 kubectl
apt-get install kubeadm kubelet kubectl
4. 初始化master节点
为了让pod网络不与任何主机网络重叠,应使用一个合适的CIDR块来代替,然后在执行 kubeadm init 时使用 --pod-network-cidr参数:
kubeadm init —pod-network-cidr=10.244.0.0/16
5. 加入node节点。
kubeadm会为集群生成一个bootstrap token。在后面,只要持有这个token,任何一个安装了kubelet和kubadm的节点,都可以通过kubeadm join加入到这个集群当中。
<a name="q7zzf"></a>
## K3s部署
K3s提供了一个安装脚本,安装非常简单
1. Master节点上只需运行命令:
curl -sfL https://get.k3s.io | sh -
运行后,将安装其他实用程序,包括kubectl、crictl、ctr、k3s-killall.sh 和 k3s-uninstall.sh。
2. Node节点运行如下命令即可加入集群:
curl -sfL https://get.k3s.io | K3S_URL=https://myserver:6443 K3S_TOKEN=mynodetoken sh -
其中,K3S_TOKEN的位置为
cat /var/lib/rancher/k3s/server/node-token ```
5.数据库与存储
K8s的etcd
Etcd是Kubernetes集群中的一个十分重要的组件,存储的信息有:
- 存储flannel网络信息
- Kubernetes对象的状态信息
K3s的数据库
K3s 支持以下数据存储选项:
- 嵌入式 SQLite
- PostgreSQL (经过认证的版本:10.7 和 11.5)
- MySQL (经过认证的版本:5.7)
- MariaDB (经过认证的版本:10.3.20)
- etcd (经过认证的版本:3.3.15)
- 嵌入式 etcd 高可用
k3s默认使用SQLite存储,保证了本身的轻量快速运行和部署的能力。k3s提供了切换对接多种存储的方式,如果SQLite不满足需求,可以根据实际生产要求使用选择不同的存储,存储切换的方式可以参考如下文档:https://docs.rancher.cn/docs/k3s/installation/datastore/_index/
简单总结不同的存储的使用场景如下:
| 存储类型 | 存储HA | 使用场景 |
|---|---|---|
| SQLite | 不支持 | 单机部署,或者开发测试,一体机环境 |
| etcd | 多节点 | 期望更高的存储性能和兼容性,能接受其对计算资源的消耗 |
| MySQL | 主从/多主… | 团队不擅长运维etcd,偏向企业级数据库 |
| PostgreSQL | 主动/多主… | 同上 |
| DQLite | 多节点 | 不希望存储占用太多资源,足够轻量并且能够支持HA,一般可用于边缘场景 |
k3s 删除了 k8s 内置 cloud provider 以及 storage 插件(可通过手动安装这些插件),内置了 Local Path Provider。可以通过使用外部的存储插件解决 k3s 存储问题,一些文章中推荐使用Longhorn,Longhorn轻量级、可靠且功能强大。可以使用kubectl apply命令或使用Helm charts在现有的Kubernetes集群上安装Longhorn。安装Longhorn之后,它将为Kubernetes集群添加持久卷支持。
GitHub地址: https://github.com/longhorn/longhorn
6.通信
k3s 为了简化部署,用 SQLite 实现了 list/watch 接口,由此增加了master节点与worker节点通信用的tunnel-proxy,其本质是websocket, 这个功能现在用在简化部署上面。在k8s中, 如果worker节点连接到master节点之后, 当需要修改master节点的ip地址的时候, 我们的做法是手动的改变worker节点的配置实现,而 k3s就可以通过tunnel-proxy实现。
- Server 就是 Kubernetes 管理面组件 + SQLite 和 Tunnel Proxy,
- Agent 即 Kubernetes 的数据面 + Tunnel Proxy。
7.容器运行时
k3s默认并不安装docker,使用containerd作为容器运行时,减少运行时的开销。
docker 与 containerd的常用命令对照:
| 容器相关功能 | docker | containerd |
|---|---|---|
| 显示容器列表 | docker ps | crictl ps |
| 创建容器 | docker create | crictl create |
| 启动容器 | docker start | crictl start |
| 停止容器 | docker stop | crictl stop |
| 镜像相关功能 | docker | containerd |
|---|---|---|
| 显示本地镜像列表 | docker images | crictl images |
| 下载镜像 | docker pull | crictl pull |
| 上传镜像 | docker push | 无 |
| 删除本地镜像 | docker rmi | crictl rmi |
| 查看镜像详情 | docker inspect | crictl inspecti |
8.网络
CNI
K3s 默认以 flannel 作为 CNI 运行,使用 VXLAN 作为默认后端。
Flannel 的默认后端是 VXLAN。
| CLI Flag 和 Value | 描述 |
|---|---|
| —flannel-backend=vxlan (默认) | 使用 VXLAN 后端。 |
| —flannel-backend=ipsec | 使用 IPSEC 后端,对网络流量进行加密。 |
| —flannel-backend=host-gw | 使用 host-gw 后端。 |
| —flannel-backend=wireguard | 使用 WireGuard 后端,对网络流量进行加密。可能需要额外的内核模块和配置。 |
k3s 除了内置 Flannel 网络插件以外,还内置了 CoreDNS、Traefik Ingress Controller、Service Load Balancer,如果不使用默认的组件,用户也可以自己部署其他组件,比如使用 MetalLB 替代内置的 load balancer。
Traefik 是一个现代的 HTTP 反向代理和负载均衡器,它是为了轻松部署微服务而生的。在设计,部署和运行应用程序时,它简化了网络复杂性。
网络入站规则
| 协议 | 端口 | 源 | 描述 |
|---|---|---|---|
| TCP | 6443 | K3s agent 节点 | Kubernetes API Server |
| UDP | 8472 | K3s server 和 agent 节点 | 仅对 Flannel VXLAN 需要 |
| TCP | 2379-2380 | K3s server 节点 | 只有嵌入式 etcd 高可用才需要 |
9.其他
操作系统
K3s 有望在大多数现代 Linux 系统上运行:
- CentOS: 7.8, 7.9, 8.2, 8.3
- RHEL: 7.8, 7.9, 8.2, 8.3
- SLES: 15SP2
- Ubuntu: 16.04, 18.04, 20.04
