发布时间:2025-12-09 12:03:54 浏览次数:1
k3s是经过CNCF认证的由Rancher公司开发维护的一个轻量级的 Kubernetes 发行版,内核机制还是和 k8s 一样,但是剔除了很多外部依赖以及 K8s 的 alpha、beta 特性,同时改变了部署方式和运行方式,目的是轻量化 K8s,简单来说,K3s 就是**版 K8s,消耗资源极少。它主要用于边缘计算、物联网等场景。K3s 具有以下特点:
1、安装简单,占用资源少,只需要512M内存就可以运行起来;
2、apiserver 、schedule 等组件全部简化,并以进程的形式运行在节点上,把程序都打包为单个二进制文件,每个程序只需要占用100M内存;
3、使用基于sqlite3的轻量级存储后端作为默认存储机制。同时支持使用etcd3、MySQL 和PostgreSQL作为存储机制;
4、默认使用 local-path-provisioner 提供本地存储卷;
5、默认安装了Helm controller 和 Traefik Ingress controller;
6、所有 Kubernetes control-plane 组件的操作都封装在单个二进制文件和进程中,使 K3s 具有自动化和管理包括证书分发在内的复杂集群操作的能力。
7、减少外部依赖,操作系统只需要安装较新的内核(centos7.6就可以,不需要升级内核)以及支持cgroup即可,k3s安装包已经包含了containerd、Flannel、CoreDNS,非常方便地一键式安装,不需要额外安装Docker、Flannel等组件。
CNCF,英文全称为Cloud Native Computing Foundation,中文译为“云原生计算基金会”。成立于2015年12月11日。
CNCF是Linux基金会旗下的基金会,可以理解为一个非盈利组织。
当年谷歌内部一直用于编排容器的Borg项目开源了,为了该项目更好的发展,谷歌与Linux基金会一起创办了CNCF。同时,谷歌把Borg用Go语言重写,更名为Kubernetes并捐赠到CNCF。
成立这个组织的初衷:
1、推动云原生计算可持续发展;
2、帮助云原生技术开发人员快速地构建出色的产品。
CNCF托管的项目:
–kubernetes: 容器编排系统,可以跨主机管理容器化应用;
–Prometheus:开源的监控系统,专注于时间序列数据,主要用于对k8s和容器进行监控;
–CoreDNS:k8s中的DNS服务器;
– containerd:将容器运行时及其管理功能从 Docker Daemon 剥离的镜像管理和容器执行技术;
–Fluentd:日志收集组件;
– Linkerd:为微服务提供可靠性支持、自动化负载均衡、服务发现和运行时可恢复性的开源“服务网格”项目;
– gRPC:现代化高性能开源远程调用框架;
– rkt:帮助开发者打包应用和依赖包,简化搭环境等部署工作,提高容器安全性和易用性的容器引擎。
我们经常听说linux发行版,那什么是linux发行版?
Linux发行版与Windows或Mac OS(操作系统)一样,Linux由多种类型组成,称为分发,每个发行版都很相似,但是不完全一样。一般情况下,Linux发行版是各种应用程序(软件)的集合,从而来适应使用目的,除了在服务器上安装之外,其他还要提前设置,以便可以立即进行实际使用。
Linux发行版主要有Debian类型、Slackware系列、Red Hat
1.Debian类型:
Debian类型是高度发达的,但是Debian门槛比较高,对用户比较友好的,Debian拥有出色的性能,可用于嵌入式设备等众多应用。此外,它已经发展成为一种流行的Linux发行版,名为Ubuntu。
2.Slackware系列:
Slackware管理方法比其他线路更复杂,对于初学者来说相对困难,这是因为项强调稳定性和安全性的发展政策,并且没有优先考虑易用性。经过验证后是否有透露软件的立场,Slackware著名的发行版包括openSUSE,Plamo Linux和Puppy Linux。
3.Red Hat:
目前Red Hat大致分为两类,第一个是红帽企业Linux(RHEL),有些服务是要收费的。另一种是名为Fedora(Fedora)的免费发行版。
4、Centos
CentOS是Linux发行版之一,它是来自于Red Hat Enterprise Linux依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定性的服务器以CentOS替代商业版的Red Hat Enterprise Linux使用。
边缘计算也称为边缘处理,是一种将服务器放置在本地设备附近的网络技术,解决数据传输的延迟问题。这样的处理方式是在传感器附近或者设备产生数据的位置进行的,因此称之为边缘。“边缘”特指计算资源在地理分布上更加靠近设备,而远离云数据中心的资源节点。
典型的边缘计算分为物联网(例如:智慧城市,智能家居,大型商店等)和非物联网(例如:游戏,CDN 等)场景。
举个例子:原来咱们取钱存钱,必须去银行排队,那现在我们在住的附近有自动取款机,可以直接取钱,减少了排队等待时间,还能就近解决,更加安全
边缘计算应用场景:
在城市路面检测中,在道路两侧路灯上安装传感器收集城市路面信息,检测空气质量+、光照强度、噪音水平等环境数据,当路灯发生故障时能够及时反馈至维护人员。
在智能交通中,边缘服务器上通过运行智能交通控制系统来实时获取和分析数据,根据实时路况来控制交通信息灯,以减轻路面车辆拥堵等。
在无人驾驶中,如果将传感器数据上传到云计算中心将会增加实时处理难度,并且受到网络制约,因此无人驾驶主要依赖车内计算单元来识别交通信号和障碍物,并且规划路径
《福布斯》技术委员会的12位成员研究了一些企业的用例,在这些用例中,都使用了边缘计算:
应用一:改进医疗设备性能和数据管理
在医疗场景下,边缘计算主要帮助医疗保健体系的IT基础架构,具体来说,是防止医疗设备管理的应用程序发生延迟。在边缘计算的支持下,无需构建集中的数据中心,可对关键数据进行本地化,在安全性、响应速度和有效性上有更佳表现。
应用二:本地零售的实时数据分析
边缘计算的主要目的,是让运算尽可能接近数据源。在零售场景中,以往企业都是将各分支的数据汇总到中心位置进行分析,再进行决策和行动。而通过边缘计算,零售店铺可以在本地就进行数据处理和优化,这样组织的行动反馈就能更快更及时。
应用三:消费者数据隐私
处理高度敏感的消费者数据的公司发现,由于数据泄漏成本高昂,云计算很危险。因此,许多这类公司正在将边缘计算用于处理消费者数据,因为它为他们提供了更多的安全和控制选择。这可能会使企业工作流程复杂化,但它可以带来好处,特别是在医疗数据公司中。- Sean Byrnes, Outlier
应用四:物联网
物联网是企业为获得更好的数据、客户体验、现场营销和更智能的流程而实施的智能的重大转变。边缘计算使网络的运行水平能够为物联网提供高性能。接近实时的速度意味着用户体验可以非常出色,并且可以为企业带来更好、更有效的运营。-Frank Cittadino, QOS Networks
应用五:视频监控和分析
视频监控已经部署在边缘,以及视频分析。视频产生的数据是所有其他来源数据总和的10倍。这是一个很好的例子,说明您需要在数据中心之外开始处理的数据类型,以最大限度地减少通过网络移动和存储的数据量。此外,它还允许企业对可操作的数据做出实时决策- Bill Galloway,Pivot3 Inc.
应用六:工业操作
工厂车间处理等工业操作需要海量数据的快速响应。这些数据中的大部分被丢弃,但能够通过检测边缘数据中的异常来使工厂操作员能够及时对工厂车间的问题做出反应。这样可以间接减少停机从而提高生产率。- Randal Kenworthy,Cognizant
应用七:智能建筑
随着我们的会议室和设施变得越来越智能化,将会有一种把所有东西都放到云端的诱惑。考虑到安全性和稳定性,在站点上托管数据将会有一些好处。我们已经看到了基于云的照明在网络中断时可能会令人沮丧的问题,而工作场所的可靠性甚至更重要。 Luke Wallace, Bottle Rocket
应用八:无人驾驶汽车
汽车行业已投入数十亿资金开发边缘计算技术。为了安全运行,这些车辆需要收集和分析有关其周围环境,方向和天气状况的大量数据,以及与道路上的其他车辆进行通信。- Arnie Gordon,Arlyn Scales
应用九:机顶盒
Edge AI可以在机顶盒设备上运行一个低占用空间的智能引擎,可以实时分析数据,对AI进行编码,在本地解决问题并向上游服务器提供智能反馈。与基本自动化(边缘机器人流程自动化机器人)相结合,AI引擎可以自我修复并在本地解决许多问题。- Ankur Garg,Hotify Inc.
我们希望安装的 Kubernetes 在内存占用方面只是原来一半的大小。Kubernetes 是一个 10 个字母的单词,简写为k8s,所以, Kubernetes 一半大的东西就是有 5 个字母的单词,简写为 K3S。K3S没有全称,也没有官方的发音。
K3s 适用于以下场景:
1、边缘计算-Edge
2、物联网-IoT
3、CI:持续集成
4、Development:开发
5、ARM
6、嵌入 K8s
由于运行 K3s 所需的资源相对较少,所以 K3s 也适用于开发和测试场景。在这些场景中,如果开发或测试人员需要对某些功能进行验证,或对某些问题进行重现,那么使用 K3s 不仅能够缩短启动集群的时间,还能够减少集群需要消耗的资源。与此同时,Rancher 中国团队推出了一款针对 K3s 的效率提升工具:AutoK3s。只需要输入一行命令,即可快速创建 K3s 集群并添加指定数量的 master 节点和 worker 节点。
问题1:什么是ARM
ARM64和ARMv7都支持二进制文件和多源镜像。k3s在小到树莓派或大到 AWS a1.4xlarge 32GiB服务器的环境中均能出色工作。
k3s server节点是运行k3s server命令的机器(裸机或者虚拟机),而k3s Agent 节点是运行k3s agent命令的机器。
单点架构只有一个控制节点(在 K3s 里叫做server node,相当于 K8s 的 master node),而且K3s的数据存储使用 sqlite 并内置在了控制节点上
在这种配置中,每个 agent 节点都注册到同一个 server 节点。K3s 用户可以通过调用server节点上的K3s API来操作Kubernetes资源。
K3S高可用架构
虽然单节点 k3s 集群可以满足各种用例,但对于 Kubernetes control-plane 的正常运行至关重要的环境,可以在高可用配置中运行 K3s。一个高可用 K3s 集群由以下几个部分组成:
1、K3s Server 节点:两个或者更多的server节点将为 Kubernetes API 提供服务并运行其他 control-plane 服务
2、外部数据库:外部数据存储(与单节点 k3s 设置中使用的嵌入式 SQLite 数据存储相反)
背景:
在进行信息化、智能化改造的过程中,首先第一步,就是要获取底层系统的全方位的数据。因此需要部署大量的边缘设备来采集数据、分析数据,通过这些数据进行建模,大量的边缘设备一般离散的分布在不同机房、厂区、甚至是不同的地理区域。
需 求:
运维角度来讲:
1、管理这些边缘设备,保持边缘设备上运行的服务的高可用性;
2、快速的上线、升级;
3、配置的快速更改与应用
以上案例来自曾永杰,上海全应科技有限公司运维经理,曾在华为西安研究所云计算部门承担软件测试工程师、项目交付、线上运维等工作职责,当前工作主要为CI/CD流程的建设与维护、应用的容器化改革和容器云平台的运维管理
K8s和k3s各有优劣。若是你要进行大型的集群部署,建议你选择使用K8s;若是你处于边缘计算等小型部署的场景或仅仅须要部署一些非核心集群进行开发/测试,那么选择k3s则是性价比更高的选择。
云计算场景用k8s
边缘计算场景用k3s
Q:k3s和k8s具体有多大的差别?
A:在实际的应用部署中,几乎没有任何差异,至少到目前为止,我所遇到的场景,k8s能满足的,k3s也能满足,相信,通过不断的迭代,k3s在未来会更完善边缘场景。
Q:能直接学习k3s吗?
A: k3s的所有操作跟k8s无区别,但是学习还是以k8s为主,之后再扩展k3s
安装k3s服务的操作系统要求:
Linux 的内核版本在3.10以上
每台服务器上至少要有512MB的内存空间
硬盘中可用的存储空间必须大于500 MB
配置yum源关掉防火墙关掉selinux修改内核参数关掉swap交换分区 [root@localhost ~]# yum install containerd -y启动containerd [root@localhost ~]# systemctl start containerd国内用户可以用如下方法:安装速度会更快#执行如下命令安装:curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -看到如下,说明k3s已经启动了:
验证安装是否成功
k3s kubectl get nodes
显示如下,说明安装成功:
NAME STATUS ROLES AGE VERSION192.168.40.180 Ready control-plane,master 17s v1.20.6+k3s1 k3s kubectl get pods -n kube-system显示如下:NAME READY STATUS RESTARTS AGEcoredns-854c77959c-k74k6 1/1 Running 0 2mlocal-path-provisioner-5ff76fc89d-7q7pk 1/1 Running 0 2mmetrics-server-86cbb8457f-s8pl9 1/1 Running 0 2mhelm-install-traefik-26brw 0/1 Completed 0 2msvclb-traefik-6flmb 2/2 Running 0 57straefik-6f9cbd9bd4-95jcb 1/1 Running 0 57s
部署完成之后,上面所有的进程都由 k3s 这个 service 来创建管理。可以使用 systemctl status k3s 查看。
提取join token
我们想要添加一对worker节点。在这些节点上安装K3s,我们需要一个join token。Join token存在于master节点的文件系统上。让我们复制并将它保存在某个地方,稍后我们可以获取它:
cat /var/lib/rancher/k3s/server/node-token获取到一串token:K1048a0844cf602b7c96a4ea98a0a3531298e78262ba19875bd31a92ffc56686f63::server:698e6bc453d5871cbb1a4741387824b0
把work节点加入k3s:curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://192.168.40.180:6443 K3S_TOKEN=K1048a0844cf602b7c96a4ea98a0a3531298e78262ba19875bd31a92ffc56686f63::server:698e6bc453d5871cbb1a4741387824b0 sh -验证work节点是否加入集群:在192.168.40.180操作:k3s kubectl get nodes显示如下,说明工作节点成功加入k3s集群:NAME STATUS ROLES AGE VERSION192.168.40.181 Ready <none> 57s v1.20.6+k3s1192.168.40.180 Ready control-plane,master 5m36s v1.20.6+k3s1
在做下面实验之前需要先把离线镜像包上传到安装k3s的server和agent节点:
通过ctr解压镜像:
ctr images import frontend.tar.gzctr images import redis-master.tar.gzctr images import redis-slave.tar.gz
cat redis-master-deployment.yaml apiVersion: apps/v1 kind: Deploymentmetadata: name: redis-master labels: app: redisspec: selector: matchLabels: app: redis role: master tier: backend replicas: 1 template: metadata: labels: app: redis role: master tier: backend spec: containers: - name: master image: kubeguide/redis-master imagePullPolicy: IfNotPresent ports: - containerPort: 6379kubectl apply -f redis-master-deployment.yaml
cat redis-master-service.yaml apiVersion: v1kind: Servicemetadata: name: redis-master labels: app: redis role: master tier: backendspec: ports: - port: 6379 targetPort: 6379 selector: app: redis role: mastertier: backendkubectl apply -f redis-master-service.yaml
cat redis-slave-deployment.yaml apiVersion: apps/v1 kind: Deploymentmetadata: name: redis-slave labels: app: redisspec: selector: matchLabels: app: redis role: slave tier: backend replicas: 1 template: metadata: labels: app: redis role: slave tier: backend spec: containers: - name: slave image: kubeguide/guestbook-redis-slave env: - name: GET_HOSTS_FROM value: dns ports: - containerPort: 6379kubectl apply -f redis-slave-deployment.yaml
cat redis-slave-service.yaml apiVersion: v1kind: Servicemetadata: name: redis-slave labels: app: redis role: slave tier: backendspec: ports: - port: 6379 selector: app: redis role: slavetier: backendkubectl apply -f redis-slave-service.yaml
cat frontend-deployment.yaml apiVersion: apps/v1 kind: Deploymentmetadata: name: frontend labels: app: guestbookspec: selector: matchLabels: app: guestbook tier: frontend replicas: 1 template: metadata: labels: app: guestbook tier: frontend spec: containers: - name: php-redis image: kubeguide/guestbook-php-frontend env: - name: GET_HOSTS_FROM value: dns ports: - containerPort: 80kubectl apply -f frontend-deployment.yaml
cat frontend-service.yaml apiVersion: v1kind: Servicemetadata: name: frontend labels: app: guestbook tier: frontendspec: type: NodePort ports: - port: 80 targetPort: 80 nodePort: 30001 selector: app: guestbooktier: frontendkubectl apply -f frontend-service.yaml
浏览器访问:
http://192.168.40.130:30001/
在server节点执行如下:
/usr/local/bin/k3s-uninstall.sh
在agent节点执行如下:/usr/local/bin/k3s-agent-uninstall.sh