轻量级k3s入门与实战

1. k3s介绍

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等组件

2. 边缘计算介绍

image-20240901161838686

边缘计算也称为边缘处理,是一种将服务器放置在本地设备附近的网络技术,解决数据传输的延迟问题。这样的处理方式是在传感器附近或者设备产生数据的位置进行的,因此称之为边缘。边缘特指计算资源在地理分布上更加靠近设备,而远离云数据中心的资源节点。

典型的边缘计算分为物联网(例如:智慧城市,智能家居,大型商店等)和非物联网(例如:游戏,CDN 等)场景。

边缘计算应用场景:

在城市路面检测中,在道路两侧路灯上安装传感器收集城市路面信息,检测空气质量+、光照强度、噪音水平等环境数据,当路灯发生故障时能够及时反馈至维护人员。

在智能交通中,边缘服务器上通过运行智能交通控制系统来实时获取和分析数据,根据实时路况来控制交通信息灯,以减轻路面车辆拥堵等。

在无人驾驶中,如果将传感器数据上传到云计算中心将会增加实时处理难度,并且受到网络制约,因此无人驾驶主要依赖车内计算单元来识别交通信号和障碍物,并且规划路径

3. 边缘计算应用场景

《福布斯》技术委员会的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.

4. k3s架构

4.1 单节点的k3s架构

image-20240901163358229

k3s server节点是运行k3s server命令的机器(裸机或者虚拟机),而k3s agent节点是运行k3s agent命令的机器

单点建构只有一个控制节点(在k3s里面叫做server node,相当于k8s的master node),而且k3s的数据存储使用sqlite并内置在了控制节点上

在这种配置中,每个agent节点都注册到了同一个server节点。k3s用户可以通过调用server节点上的k3s api来操作kubernetes资源

4.2 高可用的k3s架构

image-20240901165508765

高可用k3s集群组成部分:

  1. k3s server节点:两个或者更多的server节点将为kubernetes api提供服务并运行其他control-plane服务
  2. 外部数据库:外部数据存储(与单节点k3s设置中使用的嵌入式sqlite数据存储相反)

5. 安装k3s

5.1 要求与规划

  1. linux操作系统内核版本要在3.10以上
  2. 每台服务器至少要有512m的内存空间
  3. 硬盘中可用的存储空间必须大于500mb
k3s集群角色 IP 安装的组件
Server节点 192.168.106.11 K3s server
Agent节点 192.168.106.12 K3s agent

5.2 修改ip

serevr节点上:

1
2
3
hostnamectl set-hostname master
nmcli con add con-name eth0-static ifname eth0 type ethernet ipv4.method manual ipv4.addresses 192.168.106.11/24 ipv4.gateway 192.168.106.2 ipv4.dns 114.114.114.114 connection.autoconnect yes
nmcli con up eth0-static;nmcli con delete eth0

agent节点上:

1
2
3
hostnamectl set-hostname node
nmcli con add con-name eth0-static ifname eth0 type ethernet ipv4.method manual ipv4.addresses 192.168.106.12/24 ipv4.gateway 192.168.106.2 ipv4.dns 114.114.114.114 connection.autoconnect yes
nmcli con up eth0-static;nmcli con delete eth0

5.3 其它前提操作

关闭并禁用firewalld防火墙

关掉selinux

关掉swap分区

5.4 修改内核参数

1
2
3
4
5
cat > /etc/sysctl.d/k8s.conf<<END
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
END
sysctl --system

5.5 配置yum源

1
2
3
4
5
6
7
8
9
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

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

5.6 安装containerd

1
yum install  containerd.io-1.6.6 -y

5.7 修改配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml

sed -i s/"SystemdCgroup = false"/"SystemdCgroup = true"/ /etc/containerd/config.toml
sed -i s/'sandbox_image = "k8s.gcr.io\/pause:3.6"'/'sandbox_image = "repo.792588.xyz:8443\/k8s\/pause:3.6"'/ /etc/containerd/config.toml

systemctl enable containerd --now

VERSION="v1.31.1"
wget https://github.com/kubernetes-sigs/cri-tools/releases/download/$VERSION/crictl-$VERSION-linux-amd64.tar.gz
sudo tar zxvf crictl-$VERSION-linux-amd64.tar.gz -C /usr/local/bin
rm -f crictl-$VERSION-linux-amd64.tar.gz

cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF

systemctl restart containerd

mkdir -p /etc/rancher/k3s/
cat >/etc/rancher/k3s/registries.yaml<<END
mirrors:
docker.io:
endpoint:
- "https://repo.792588.xyz:8443"
END

5.8 安装k3s server节点

k3s下载链接[https://github.com/k3s-io/k3s/releases/download/v1.30.4%2Bk3s1/k3s]

1
2
scp -p k3s [email protected]:/usr/local/bin/
scp -p k3s [email protected]:/usr/local/bin/

master节点上:

1
INSTALL_K3S_SKIP_DOWNLOAD=true ./install.sh

5.9 集群中添加work节点

master节点上查看token

1
cat /var/lib/rancher/k3s/server/node-token

node节点上执行

1
INSTALL_K3S_SKIP_DOWNLOAD=true INSTALL_K3S_MIRROR=cn K3S_URL=https://192.168.106.11:6443 K3S_TOKEN=K104c9116ac20fbcb48cac0128531d52c01b78e3195a21a715b25931b2cd5ab44ae::server:3eb319836a183e5abc6ad8777a04af88 bash install.sh

5.10 查看集群状态

1
k3s kubectl get nodes

6. 卸载k3s集群

6.1 k3s server节点

1
/usr/local/bin/k3s-uninstall.sh

6.2 k3s agent节点

1
/usr/local/bin/k3s-agent-uninstall.sh

7. k3s高可用集群安装

将k3s进行高可用部署。官方提供了两种部署方式,一种是连接外部数据库如:mysql,然后部署多个k3s server端再进行负载均衡,还有一种是官方提供的高可用方式,参考:[https://docs.rancher.cn/docs/k3s/installation/ha-embedded/_index/]

要开始运行,首先启动一个 server 节点,使用cluster-init标志来启用集群,并使用一个标记作为共享的密钥来加入其他服务器到集群中。

1
curl -sfL https://get.k3s.io | INSTALL_K3S_SKIP_DOWNLOAD=true INSTALL_K3S_MIRROR=cn K3S_TOKEN=SECRET sh -s - server --cluster-init

启动第一台 server 后,使用共享密钥将第二台和第三台 server 加入集群。

1
curl -sfL https://get.k3s.io | INSTALL_K3S_SKIP_DOWNLOAD=true INSTALL_K3S_MIRROR=cn K3S_TOKEN=SECRET sh -s - server --server https://<ip or hostname of server1>:6443

现在你有了一个高可用的 controlplane。你可以在 --server 参数中使用任何集群 server,从而加入额外的 server 和 worker 节点。将额外的 worker 节点加入到集群中,步骤与单个 server 集群相同。