轻量级k8s平台-边缘计算场景-k3s入门到实战
1.k3s核心技术解读
轻量级的Kubernetes,安装简单,占用资源少,只需要512M内存就可以运行起来,所有的二进制程序都不到100MB。
自2019年3月发布以来,备受全球开发者们关注。至今,GitHub Stars 数已超过 18,000,成为了开源社区最受欢迎的边缘计算K8S解决方案。
k3s 专为在资源有限的环境中运行 Kubernetes 的研发和运维人员设计,将满足日益增长的在边缘计算环境中运行在 x86、ARM64 和 ARMv7 处理器上的小型、易于管理的 Kubernetes 集群需求。k3s 的发布,为开发者们提供了以”Rancher 2.X + k3s”为核心的从数据中心到云到边到端的 K8S 即服务(Kubernetes-as-a-Service),推动 Kubernetes Everywhere。
2.为什么叫k3s?
我们希望安装的Kubernetes在内存占用方面只是原来一半的大小。Kubernetes是一个10个字母的单词,所以,有kubernetes一半大的东西就是一个5个字母的单词,简写为K3S,K3S没有全称,也没有官方的发音。
3.适用场景
- 边缘计算-Edge
- 物联网-Iot
- CI
- ARM
- 嵌入K8S
k3s相对比k8s裁剪了如下5个部分:
- 过时的功能和非默认功能
- Alpha功能
- 内置的云提供商插件
- 内置的存储驱动
- Docker(可选)
4.相对k8s优化部分
- 使用内嵌轻量级数据库SQLite作为默认数据存储替代etcd,当然etcd仍然是支持的。
- 内置了local storage provider、service load balancer、helm controller、Traefik ingress controller,开箱即用。
- 所有Kubernetes控制平面组件如apiserver、scheduler、controller manager等封装成为一个精简二进制程序,控制平面只需要一个进程即可运行。
- 删除内置插件(比如cloudprovider插件和存储插件)。
- 减少外部依赖,操作系统只需要安装较新的内核(centos7.6就可以,不需要升级内核)以及支持cgroup即可,k3s安装包已经包含了containerd、Flannel、CoreDNS,非常方便地一键式安装,不需要额外安装Docker、Flannel等组件。
5.k3s架构分析
5.1 单节点的k3s架构
上面的架构里K3S Server节点有一个内嵌SQLite数据库
在这种配置中,每个agent节点都注册到同一个server节点。k3s用户可以通过调用server节点的k3s API来操作Kubernetes资源。
5.2 高可用的k3s架构
一个HA K3S集群有以下几个部分组成:
1、两个或更多Server节点将为Kubernetes API提供服务并运行其他control-plane服务
2、外部数据存储(与单节点k3s 设置中使用的嵌入式SQLite数据存储相反)
6.K3S特点
1、上手无代价:
1)使用k3s与Kubernetes习惯完全一致,对于使用Kubernetes的人来讲使用k3s没有任何难度;
2)支持部署helm tiller服务端(helm tiller端会在helm 3.x版本中被干掉)
2、API server、Controller manager、Scheduler、kubelet、Flannel等组件都在一个进程中(通过指定是Server或者Agent选项来控制节点上需要启动哪些组件,Server相当于Kubernetes的Master节点,Agent相当于Worker节点),占用的内存更少了,整个k3s server进程需要的内存在500MB以下。
3、去除了Kubernetes中的一些实验特性、非必须的组件,例如云厂商的驱动、存储插件,k3s在默认状态下只会启动除自身进程之外的两个应用:
CoreDNS:提供集群内部的DNS解析服务。
Traefik:Ingress controller的角色。
4、占用资源少:k3s默认使用containerd(Server节点,不可更改)作为容器运行时,不再需要中间层的Docker Engine,占用资源更少。
5、 部署简单:对环境依赖少,可离线也可在线部署(不过国内的网络环境不推荐在线部署),离线部署时,只需要下载一个大约40MB的二进制文件和一个200MB不到的离线镜像包,启动k3s节点几乎是秒级的。
7.选择K3S的理由
- 完美适配边缘计算环境
k3s是一个高可用的、经过CNCF认证的Kubernetes发行版,专为无人值守、资源受限、偏远地区或物联网设备内部的生产工作负载而设计。
- 简单且安全
k3s被打包成单个小于60MB的二进制文件,从而减少了运行安装、运行和自动更新生产Kubernetes集群所需的依赖性和步骤。
- 针对ARM进行优化
ARM64和ARMv7都支持二进制文件和多源镜像。k3s在小到树莓派或大到 AWS a1.4xlarge 32GiB服务器的环境中均能出色工作。
7.云计算 VS 边缘计算
7.1 什么是云计算
对于到底什么叫云计算,有很多种说法。现阶段广为接受的是美国国家标准与技术研究院(NIST)定义:云计算是一种按使用量付费的模式,这种模式提供可用的、便捷的、按需的网络访问, 进入可配置的计算资源共享池(资源包括网络,服务器,存储,应用软件,服务),这些资源能够被快速提供,只需投入很少的管理工作,或与服务供应商进行很少的交互。
用通俗的话说,云计算就是通过大量在云端的计算资源进行计算,如:用户通过自己的电脑发送指令给提供云计算的服务商,通过服务商提供的大量服务器进行“核爆炸”的计算,再将结果返回给用户。
云计算部署模型分为三类:公有云、私有云、混合云;
服务模式有三种:Saas、PaaS、IaaS 。
7.2 什么是边缘计算
“边缘”特指计算资源在地理分布上更加靠近设备,而远离云数据中心的资源节点。典型的边缘计算分为物联网(例如:下一代工业自动化,智慧城市,智能家居,大型商超等)和非物联网(例如:游戏,CDN 等)场景。
边缘计算被称为“人工智能的最后一公里”,但它还在发展初期。相较于云计算,边缘计算有以下势。
1、更多的节点来负载流量,使得数据传输速度更快。
2、更靠近终端设备,传输更安全,数据处理更即时。
3、更分散的节点相比云计算故障所产生的影响更小。
7.3 小结
云计算是人和计算设备的互动,而边缘计算则属于设备与设备之间的互动,最后再间接服务于人。边缘计算可以处理大量的即时数据,而云计算最后可以访问这些即时数据的历史或者处理结果并做汇总分析。云计算和边缘计算是一种共生和互补的关系,并不会出现谁取代谁的问题,而是谁在哪些计算上更有优势,谁在哪些场景上更合适。
8.k3s和k8s如何选择
k8s和k3s各有优劣,若是你要进行大型的集群部署,建议你选择使用k8s;若是你处于边缘计算等小型部署的场景或仅仅要部署一些非核心集群运行开发/测试,那么选择k3s则是性价比更高的选择。
云计算场景用k8s
边缘计算场景用k3s
9.安装k3s集群
9.1 初始化环境
#1配置安装k8s需要的yum源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
EOF
#2安装依赖软件包
yum -y install wget net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack ntpdate yum-utils device-mapper-persistent-data lvm2 telnet
#3添加docker需要的yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#4关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
#5时间同步
echo '*/5 * * * * /usr/sbin/ntpdate time1.aliyun.com >/dev/null 2>&1' >>/var/spool/cron/root
#6关闭selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
#7修改内核参数
cat <<EOF >/etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
#8修改主机名
192.168.31.10 k3s-server
192.168.31.11 k3s-agent
192.168.31.10:
hostnamectl set-hostname k3s-server && bash
192.168.31.11:
hostnamectl set-hostname k3s-agent && bash
#9配置hosts文件
[root@k3s-server ~]# tail -2 /etc/hosts
192.168.31.10 k3s-server
192.168.31.11 k3s-agent
[root@k3s-server ~]#
#10配置两台主机免秘钥登录
[root@k3s-server ~]# ssh-keygen -t rsa
[root@k3s-server ~]# ssh-copy-id 192.168.31.11
9.2 安装k3s
安装k3s-server
[root@k3s-server ~]# yum install containerd -y
[root@k3s-server ~]# systemctl start containerd
[root@k3s-server ~]# systemctl enable containerd
[root@k3s-server ~]# curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -
[root@k3s-server ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k3s-server Ready control-plane,master 39m v1.21.5+k3s2
[root@k3s-server ~]#
安装k3s-agent
#获取sever端的token
[root@k3s-server ~]# cat /var/lib/rancher/k3s/server/node-token
K10138c598cd554aaea45d772ba2bd1996e5c421a4793ff7f0a78c81f66a87d0f11::server:6330d2f31bc77d978c1b709fd7222088
[root@k3s-agent ~]#
[root@k3s-agent ~]# yum install containerd -y
[root@k3s-agent ~]# systemctl start containerd
[root@k3s-agent ~]# systemctl enable containerd
[root@k3s-agent ~]# curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://192.168.31.10:6443 K3S_TOKEN=K10138c598cd554aaea45d772ba2bd1996e5c421a4793ff7f0a78c81f66a87d0f11::server:6330d2f31bc77d978c1b709fd7222088 sh -
验证work节点是否加入集群
[root@k3s-server ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k3s-agent Ready <none> 45s v1.21.5+k3s2
k3s-server Ready control-plane,master 50m v1.21.5+k3s2
[root@k3s-server ~]#
10.卸载k3s集群
在k3s server节点执行如下:
/usr/local/bin/k3s-uninstall.sh
在k3s agent节点执行如下:
/usr/local/bin/k3s-agent-uninstall.sh