全面了解k3s

Gao
### 什么是 k3s? k3s 是微型的 kubernetes 发行版本 1. CNCF 认证的 Kubernetes 发行版 2. 50MB 左右二进制包,500MB 左右内存消耗 3. 单一进程包含 Kubernetes master, Kubelet, 和 containerd 4. 支持 SQLite/Mysql/PostgreSQL/DQlite 和 etcd 5. 同时为 x86_64, Arm64, 和 Armv7 平台发布 ### k3s 基本架构 #### 整体架构 ##### 部署架构 ![cc737ff7270d834dd8ca3e6efcc4509b.png](./k3s/cc737ff7270d834dd8ca3e6efcc4509b.png) 轻量化 相比 k8s 移除 - 删除旧的和非必要的组件 - alpha feature - In-tree cloud providers - In-tree storage strivers - Docker (optional) 增加 - 简单的安装 - etcd 默认使用 SQLite 做数据源 - TLS 管理 - 自动 helm chart 管理 - containerd、cordons、Flannel 集成 ##### k3s 代码结构 ![d7fece440f1c3f7c3a4333c3c924ebfd.png](./k3s/d7fece440f1c3f7c3a4333c3c924ebfd.png) 注意事项: - contaienrd 是独立进程,也可以使用 docker - Tunnel Proxy 负责维护 k3s server 和 k3s agent 之间的链接,采用 Basic Auth 的方 式来进行认证 ##### Demo k3s 进程 - server \# 6443 k3s server, 6444 api-server - agent ``` pstree -p -aT $pid ps -T $pid ``` ##### 参考链接 - [k3s 代码组织结构分析参考](https://mp.weixin.qq.com/s/1o9X0Dlv2WhUS6iC9P-KQA) - [k3s 部署参考](https://mp.weixin.qq.com/s/V-VyWrCZux5WXxD__QpEWQ) - [k3s 为何轻量](https://mp.weixin.qq.com/s/5aprEfYSWJyVoW4trDp4Hw) #### k3s 的高可用架构 ![efddb62fd824b694d539d686cbdf5cbd.png](./k3s/efddb62fd824b694d539d686cbdf5cbd.png) ![01a39ea3b8684c5889e69a1c625e8a95.png](./k3s/01a39ea3b8684c5889e69a1c625e8a95.png) ![983420ce2dbc3d812c68639fae050dee.png](./k3s/983420ce2dbc3d812c68639fae050dee.png) ##### 高可用 - 外置数据库 - PostgreSQL (v10.7、v11.5) ü - MySQL (v5.7) - etcd (v3.3.15) 实现方式: rancher/kine ![fb719eff62e7da623289c06cf66e9f2e.png](./k3s/fb719eff62e7da623289c06cf66e9f2e.png) ##### 高可用 - 分布数据库 **SQLite** - 软件库,无独立进程:C 语言编写 - 零管理配置:不需要服务管理进程 - 事务安全:兼容 ACID,可并发访问 - 标准 SQL 支持 - 单一磁盘文件 k3s 默认使用 `/var/lib/rancher/k3s/server/db/state.db` **Dqlite** - 软件库,无独立进程:C 语言编写 - 分布式一致:C-Raft 实现 - 兼容 SQLite Dqlite 原理 - 一个 k3sserver 进程内含 SQL 的 client 组 件和 server 组件 - client 仅连接一个 server - server 链接 SQLite 软件库 - 奇数个 k3sserver 进程 - client 需连接所有 server - server 链接 Dqlite 软件库 - server 通过 C-Raft 来选主 - client 发现 主 server - client 把请求都发送到主 server - 主 server 通过 C-Raft 给从 server 发送差分日志作为数据同步 ![e8387ec04f8c4c9843d12e1c2c5659fb.png](./k3s/e8387ec04f8c4c9843d12e1c2c5659fb.png) ##### 参考链接 - [SQLite 基础命令](https://www.runoob.com/sqlite/sqlite-commands.html) - [SQLite Go 语言驱动实现](https://github.com/mattn/go-sqlite3) - [CGO 的动静态链接介绍](https://books.studygolang.com/advanced-go-programming-book/ch2-cgo/ch2-06-static-shared-lib.html) - [Dqlite 讲解](https://fosdem.org/2020/schedule/event/dqlite/) - [Raft 协议介绍](https://raft.github.io/) - [k3s 社区高可用介绍](https://mp.weixin.qq.com/s/3by95UIJ7v41KXElt7uvGA) #### Containerd `Containerd`的设计目的是嵌入更大的系统 Docker 的历史 - 1.8 之前:docker -d - 2015 年,OCI 成立 - 1.8 - 1.11:docker daemon - runtime-spec 制定 - 1.11 以后:docker、dockerd - libcontainer -> runC - dockerd = docker engine + containerd + containerd-shim + runC ![a558aca87f7a8679d9fe1a2da820ec21.png](./k3s/a558aca87f7a8679d9fe1a2da820ec21.png) ![5471d6d59bbe3ba83a514e23af38dcef.png](./k3s/5471d6d59bbe3ba83a514e23af38dcef.png) ![1c7a968cb544086aaaa167819a26a1b0.png](./k3s/1c7a968cb544086aaaa167819a26a1b0.png) ![33bede9601ebd8546cd7de980cc55135.png](./k3s/33bede9601ebd8546cd7de980cc55135.png) ![1cc7615d71efe2799e6bbcd38bb3d718.png](./k3s/1cc7615d71efe2799e6bbcd38bb3d718.png) **操作** | 镜像操作 | Docker | ContainerD | | :------------- | :------------- | :----------------- | --------------------- | | 本地镜像列表 | docker images | crictl images | ctr images list | | 下载镜像 | docker pull | crictl pull | ctr (images) pull | | 上传镜像 | docker push | | ctr (images) push | | 删除本地镜像 | docker rmi | crictl rmi | ctr images remove | | 标记本地镜像 | docker tag | | ctr (images) tag | | 镜像详情 | docker inspect | crictl inspecti | | 容器列表 | docker ps | crictl ps | ctr containers list | | 创建容器 | docker create | crictl create | ctr containers create | | 运行容器 | docker start | crictl start | ctr (tasks) start | | 停止容器 | docker stop | crictl stop | ctr (tasks) pause | | 删除容器 | docker rm | crictl rm | ctr (tasks) rm | | 容器详情 | docker inspect | crictl inspect | | 连接容器 | docker attach | crictl attach | ctr (tasks) attach | | 容器内操作 | docker exec | crictl exec | ctr (tasks) exec | | 容器日志 | docker logs | crictl logs | | 容器状态 | docker stats | crictl stats | | 显示 POD 列表 | | crictl pods | | 查看 POD 详情 | | crictl inspectp | | 运行 POD | | crictl runp | | 停止 POD | | crictl stopp | | 删除 POD | | crictl rmp | | 转发端口到 POD | | crictl port-foward | k3s 内置 containerd - ctr : 单纯的容器管理 - crictl : 从 Kubernetes 视角出发,对 POD、容器进行管理 k3s 修改 containerd 配置修 改`/var/lib/rancher/k3s/agent/etc/containerd/config.toml`同目录 下`config.toml.tmpl`文件,重启 k3s contaienrd 日志 `/var/lib/rancher/k3s/agent/containerd/containerd.log` ##### 参考链接 - [cri 的演进史](https://zhuanlan.zhihu.com/p/87602649) - [runC 的介绍](https://www.infoq.cn/article/docker-standard-container-execution-engine-runc) - [k3s 社区 Containerd 使用介绍](https://mp.weixin.qq.com/s/EJqS7G36f7_srgxSZaCuPw) - [crictl 基本操作](https://github.com/kubernetes-sigs/cri-tools/blob/master/docs/crictl.md) - [Containerd CNI 插件配置介绍](https://github.com/containerd/cri/blob/master/docs/config.md) ### k3s 拓展功能概览 #### Helm Controller - k3s Helm Controller 同时支持 v2 与 v3 版本 - 从 v1.17.0+k3s1 or above 默认使用 helm_v3 - Helm v2 vs Helm v3 - 移除了 Tiller(from SA to kubeconfig) - 三方会谈 (Three-way Strategic merge patch) - 使用 Secret 作为默认存储 - crd-install hook 迁移到了 crds/路径等... - Helm Controller 的优势 - 更方便的用户体验 - HelmChart CRD 可以支持更丰富的拓展 **设计原理** 1. Helm-controller 运行在 master 节点并 list/watch HelmChart CRD 对象 2. CRD onChange 时执行 Job 更新 3. Job Container 使用 rancher/kilipper-helm 为 entrypoint 4. Killper-helm 内置 helm cli,可以安装/升级/删除对应的 chart ```yaml apiVersion: helm.cattle.io/v1 kind: HelmChart metadata: name: traefik namespace: kube-system spec: chart: stable/traefik set: rbac.enabled: 'true' ssl.enabled: 'true' ``` - K3s 会自动部署在/var/lib/rancher/k3s/server/manifests 路径下的 HelmChart - 通过 HelmChart CRD 部署的 chart 是兼容 helm v3 CLI 的 - 在 k3s 中管理和部署 Helm 应用 相关工具包 - rancher/helm-controller - rancher/kilipper-helm #### Traefik LB K3s 支持模块化的开启或关闭相关组件,例如 Traefik LB, Scheduler, servicelb 等 - curl -sfL https://get.k3s.io | sh -s - server --no-deploy=traefik - k3s server --no-deploy=traefik --no-deploy=servicelb - 也可通过修改 k3s.service 配置然后重启生效 ##### Service LB Controller 设计原理 Service LB 是 Rancher 针对 k3s 集群而设计的一种 service loadbalancer controller,用户可通过将 Service 的 type 类似配置为 LoadBalancer 来使用。 1. svc-controller watch 到 service 类型为 LoadBalancer 时,自动创建一个 Daemonset; 2. 默认 Daemonset 会部署到每个节点,如果任意 Node 设定了 label svccontroller.k3s.cattle.io/enablelb=true, 则只在拥有这个 label 的 node 上 创 建 DS 的 pod; 3. 对于某个部署的节点,一个 LB port 只会对应一个 POD, 端口不能重复使 用; 4. 若创建失败或无可用端口时,service 的状态为 Pending ##### 本地存储 - K3s 默认添加了 local path provisioner - Local path provisioner 是基于 Kubernetes Local Persistent Volume 功能实现的一 个本地动态存储管理器 - 默认 host path 路径为/var/lib/rancher/k3s/storage - 配置文件存放在 kube-system 下的 local-path-config configmap - 支持动态创建 host path volumes - 不支持 capacity limit ### k3s 与 GPU 结合使用 #### 从 AI 视角看计算的三个层次 云计算: - 最通用的计算 - 算力要求高,实时性要求低 - 执行复杂的认知计算和模型训练通用操作系统/海量 GPU 卡 边缘计算 - 连接云和端,针对端做特定 优化 - 执行推理和数据融合处理通用操作系统/数量有限的 GPU 卡/专业 AI 芯片 端计算 - 场景相关性强 - 极致效率,实时性要求高 - 主要面向推理实时操作系统/专业 AI 芯片 #### Kuberntes 正成为机器学习的主流基础设施平台 ![6d49f668d0984291ed581b816a9bf39a.png](./k3s/6d49f668d0984291ed581b816a9bf39a.png) k3s 的优势 - K3s 足够轻量,减小边缘基础设施服务的资源占用 - K3s 部署运维足够简单,用户可以专注 GPU 和计算框架的管理 #### Docker 容器中的 GPU ![63f55898dd5d0aef168da6dababbec7a.png](./k3s/63f55898dd5d0aef168da6dababbec7a.png) #### k3s 使用 GPU 设备的原理 1. 操作系统安装支持 Nvidia Driver 2. 安装容器运行时,并切换 runtime 到 nvidia 3. K8s 通过 gpu-device-plugin 来获取 GPU 资源并记录在 k8s 中 4. Pod 通过在 k8s 内申请 gpu 资源,kubelet 驱 动 runtime 把一定额度的 GPU 卡分配 给它 ```yaml resources: limits: nvidia.com/gpu: '1' ``` ##### Demo 演示 GPU - 准备 GPU 主机,安装 cuda-drivers - 安装 nvidia-docker2 - 安装 k3s - 安装 gpu-device-plugin - 测试 GPU workload #### 当前的问题和展望 ##### 容器中对 GPU 的资源分配还不太灵活 - GPU 资源分配只能整数增减(可通过 Tensorflow 间接细化显存资源分配) - NVIDIA docker 不支持 vGPU(kubevirt 虚拟化方式可支持) ##### AI 场景:云边文件传输的痛点 - 边缘 AI 训练特点:海量小文件 IO 性能要求 - 与云端同步数据的网络带宽消耗(断点续传) ### K3s 的 IoT 场景管理 #### 什么是边缘计算? 边缘计算是指在靠近智能设备或数据源头的一端,提供`网络`、 `存储`、`计算`、`应用`等能力,达到*更快的网络服务响应,更安 全的本地数据传输*。 #### 边缘场景的 k8s 用例正在不断涌现 - 1106 个有效问卷 - 15%的受访者表示,正在把 Kubernetes 应用在边缘计算场景中 - Chick-fil-A [Link](https://medium.com/@cfatechblog/bare-metal-k8s-clustering-at-chick-fil-a-scale-7b0607bd3541) #### 边缘计算的问题与挑战 - 边缘设备种类繁多 - 繁琐的版本管理 - 复杂的跨域环境 - 成百上千部署在边缘侧的应用 - 统一和可持续化迭代的管理 平台 - 继承了强大的 k8s 社区和生 态 - 边缘节点独立自制,云端系统统一管理 #### k3s 云边协作模式 ![a4bdfa2ed0fbef25adc5c819ddf132d8.png](./k3s/a4bdfa2ed0fbef25adc5c819ddf132d8.png) ![25851741f97501c67fef0e0a3c9551b0.png](./k3s/25851741f97501c67fef0e0a3c9551b0.png) #### k3s 案例 ![c219a97aa1e92f765e8c8c1662362845.png](./k3s/c219a97aa1e92f765e8c8c1662362845.png) ![db52d9567d5d3b9cbf97f98c24c4a0cf.png](./k3s/db52d9567d5d3b9cbf97f98c24c4a0cf.png) #### K3s 与 IoT 设备管理 ![638a2d821645ae0ccd4071ad63da136c.png](./k3s/638a2d821645ae0ccd4071ad63da136c.png) ![924c981a90322fe42990d2e538e46aa9.png](./k3s/924c981a90322fe42990d2e538e46aa9.png) 1. 创建并纳管边缘 k3s 集群 2. 部署 MQTT Broker 到 k3s 集群 3. 创建、部署 IoT 设备相关的应用 4. 基于 MQTT 实现设备联动 ### K3S 周边介绍 #### 实例化 k3s 集群的工具 - K3sup(https://github.com/alexellis/k3sup) - VM 实例中运行 k3s - 具备隔离型,但依赖公有云服务 - K3s-ansible(https://github.com/itwars/k3s-ansible) - 依赖用户对机器环境访问权限 - 依赖 ansible - Multipass-k3s - 依托 multipass 本身对虚拟机的管理 #### K3d - 依托 Docker 的 k3s 管理工具 [k3d 项目](https://github.com/rancher/k3d) - K3s 本身被置于容器中 - 容器中类似是 Docker-in-Docker 原理(https://hub.docker.com/_/docker) - 实际是 k3s(containerd)-in-Docker - K3d 整合各种 use cases,方便通过 CLI 创建 k3s 集群 K3d 带来的好处 - 管理容器一样管理 k3s 集群 - 给每个开发者本地 k3s 环境,方便调试应用 - https://github.com/rancher/k3d/tree/master/docs #### 不可变基础设施 Immutable Infrastructure ![2229583e9c091f989762212a1eab143a.png](./k3s/2229583e9c091f989762212a1eab143a.png) ##### VM 实现了早期的构想 - VM 镜像过于笨重,且无法做版本控制 - 对异构环境不友好 - 用户习惯无法被约束,依然会在线进行部分更新操作 ##### 不可变基础设施 1.0 --- 容器技术(Docker) - 解决环境间差异问题 - 快速回滚到老版本 - 更好的进行 CI - 更好的自动化 - 更容易进行大规模运维 ![6bdd28c497110a72bd3c98e694c0df9d.png](./k3s/6bdd28c497110a72bd3c98e694c0df9d.png) ##### 不可变基础设施 2.0 -- Immutable OS 硬件之上全部为 **“不可变”** 更复杂更高级的云原生应用的更新,不仅仅依赖 RootFS 变更,更需要内核的同步更新。 操作系统也应成为不可变基础设施的一部分,保证基础架构更高的一致性和可靠性,以及更 加方便运维管理。 ![6fa8948e140aa39a937f4a508db479c4.png](./k3s/6fa8948e140aa39a937f4a508db479c4.png) ##### Docker native 正在向 Kubernetes native 演变 Immutable OS 也紧跟趋势 Immutable OS for Docker: - RancherOS - Atomic - CoreOS - Photon OS Immutable OS for Kubernetes: - K3os - Bottlerocket-os - Talos ##### K3os – An Immutable OS For App ![0c5994ce907a7689185ec96b8b6d2f10.png](./k3s/0c5994ce907a7689185ec96b8b6d2f10.png) ###### system-upgrade-controller - 使用 Kubernets 方式管理 OS 升降级 - 未来会集成在 Rancher2.x 中 #### k3c - Classic Docker for a Kubernetes world 与 Docker 比 1. 相似的交互 2. singlebinary 3. 同样内置 containerd 4. 更加轻量化 与 Crictl 比 1. 满足 CRI 规范 2. 支持 image tag/push 3. 支持 image build