K3s简介

K3s是一个轻量级的Kubernetes发行版,它针对边缘计算、物联网等场景进行了高度优化。 K3s做了以下功能:

  • 将众多k8s组件打包成单个二进制文件,以简化部署,通过封装在简单的启动程序自动处理很多复杂的TLS配置,使K3s具有自动化和管理包括证书分发在内的复杂集群操作的能力
  • 默认使用轻量级别的存储后端sqlite3,同时又支持使用etcd3, MySQL, PostgreSQL作为存储后端
  • 默认提供的配置适用于轻量级场景且默认的配置是安全的
  • 默认安装集成了很多实用功能和组件,如local-path-provisioner, metrics-server, traefik ingress controller

运行K3s所需的资源相对较少,因此K3s适用于边缘计算、物联网等场景,当然也适用于开发和测试场景,使用K3s不仅能够缩短启动集群的时间,还能够减少集群需要消耗的资源。

K3s的架构

K3s集群在节点上分为K3s Server节点和K3s Agent节点。 K3s Server节点是K3s的控制节点,K3s集群在部署上支持K3s Server的单节点架构和多节点的高可用架构。

K3s单节点集群的架构如下图所示,该集群有一个内嵌SQLite数据库的单节点 K3s server。在这种配置中,每个agent节点都注册到同一个 server 节点。K3s用户可以通过调用server节点上的K3s API来操作Kubernetes资源。

k3s-architecture-single-server.png

K3s集群高可用架构如下图所示,需要部署多个K3s Server节点,同时需要使用外部数据库替换sqlite作为数据存储。

k3s-architecture-ha-server.png

部署前的准备工作

在安装之前,需要先做好如下准备。3台CentOS 7.9主机如下:

1
2
3
4
cat /etc/hosts
192.168.96.151    node1
192.168.96.152    node2
192.168.96.153    node3

从k3s的发布页面下载具体版本的k3s所需镜像tar文件和k3s的二进制文件,k3s二进制文件需要与离线镜像的版本一致,这里下载的是v1.21.5+k3s2版本的。

下面进行手动部署镜像操作,创建镜像目录,并将下载的镜像tar文件拷贝到镜像目录中:

1
2
mkdir -p /var/lib/rancher/k3s/agent/images/
cp ./k3s-airgap-images-amd64.tar /var/lib/rancher/k3s/agent/images/

将k3s二进制文件拷贝每个节点的/usr/local/bin/目录下,并确保其拥有可执行权限。

1
2
cp ./k3s /usr/local/bin
chmod +x /usr/local/bin/k3s

在每个节点上下载获取k3s的安装脚本到/usr/local/bin中,并确保其执行权限:

1
2
3
cd /usr/local/bin
curl -o install.sh https://get.k3s.io
chmod +x install.sh

离线部署k3s

可以在离线环境中执行单节点安装,在一个服务器节点上安装k3s,或高可用安装在多个服务器节点上安装k3s。 这里先体验单节点安装,现在node1上安装k3s,执行下面的命令:

1
2
3
4
5
6
7
cd /usr/local/bin
INSTALL_K3S_SKIP_DOWNLOAD=true ./install.sh
[INFO]  Skipping k3s download and verify
[INFO]  Skipping installation of SELinux RPM
[ERROR]  Failed to find the k3s-selinux policy, please install:
    yum install -y container-selinux selinux-policy-base
    yum install -y https://rpm.rancher.io/k3s/stable/common/centos/7/noarch/k3s-selinux-0.3-0.el7.noarch.rpm

根据提示错误安装selinux相关包:

1
2
yum install -y container-selinux selinux-policy-base
yum install -y https://rpm.rancher.io/k3s/stable/common/centos/7/noarch/k3s-selinux-0.3-0.el7.noarch.rpm

再次安装:

1
INSTALL_K3S_SKIP_DOWNLOAD=true ./install.sh

确认k3s启动:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
systemctl status k3s

kubectl get node
NAME    STATUS   ROLES                  AGE   VERSION
node1   Ready    control-plane,master   15s   v1.21.5+k3s2

kubectl get pod -A
NAMESPACE     NAME                                      READY   STATUS      RESTARTS   AGE
kube-system   local-path-provisioner-5ff76fc89d-thqnq   1/1     Running     0          115s
kube-system   metrics-server-86cbb8457f-hvvch           1/1     Running     0          115s
kube-system   coredns-7448499f4d-xnvs8                  1/1     Running     0          115s
kube-system   helm-install-traefik-crd-wv28f            0/1     Completed   0          115s
kube-system   helm-install-traefik-68967                0/1     Completed   1          115s
kube-system   svclb-traefik-7skbh                       2/2     Running     0          32s
kube-system   traefik-97b44b794-xzv92                   1/1     Running     0          32s

查看控制节点node1上的k3s token:

1
2
cat /var/lib/rancher/k3s/server/node-token
K10cdf421e686597c8b4ca470afb1d1dbe772522549624ac1c0c642a985d01907c8::server:8c23ba1711a7e8ed0121ef3bdf624067

添加node2和node3为k3s集群的agent,在每个节点上执行下面的操作:

1
2
cd /usr/local/bin
INSTALL_K3S_SKIP_DOWNLOAD=true K3S_URL=https://192.168.96.151:6443 K3S_TOKEN=K10cdf421e686597c8b4ca470afb1d1dbe772522549624ac1c0c642a985d01907c8::server:8c23ba1711a7e8ed0121ef3bdf624067 ./install.sh

查看启动是否正常:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
systemctl status k3s-agent

# 在控制节点node1上运行:
kubectl get node
NAME    STATUS   ROLES                  AGE     VERSION
node1   Ready    control-plane,master   29m     v1.21.5+k3s2
node2   Ready    <none>                 7m39s   v1.21.5+k3s2
node3   Ready    <none>                 105s    v1.21.5+k3s2

kubectl get pod -A
NAMESPACE     NAME                                      READY   STATUS      RESTARTS   AGE
kube-system   local-path-provisioner-5ff76fc89d-thqnq   1/1     Running     0          30m
kube-system   metrics-server-86cbb8457f-hvvch           1/1     Running     0          30m
kube-system   coredns-7448499f4d-xnvs8                  1/1     Running     0          30m
kube-system   helm-install-traefik-crd-wv28f            0/1     Completed   0          30m
kube-system   helm-install-traefik-68967                0/1     Completed   1          30m
kube-system   svclb-traefik-7skbh                       2/2     Running     0          29m
kube-system   traefik-97b44b794-xzv92                   1/1     Running     0          29m
kube-system   svclb-traefik-sfpg7                       2/2     Running     0          8m2s
kube-system   svclb-traefik-7wmdj                       2/2     Running     0          2m8s

参考