k3s概述

什么是k3s

针对边缘计算、物联网等场景进行了高度优化。K3s 有以下增强功能:

  • 打包为单个二进制文件。
  • 使用基于 sqlite3 的轻量级存储后端作为默认存储机制。同时支持使用 etcd3、MySQL 和 PostgreSQL 作为存储机制。
  • 封装在简单的启动程序中,通过该启动程序处理很多复杂的 TLS 和选项。
  • 默认情况下是安全的,对轻量级环境有合理的默认值。
  • 添加了简单但功能强大的batteries-included功能,例如:本地存储提供程序,服务负载均衡器,Helm controller 和 Traefik Ingress controller。
  • 所有 Kubernetes control-plane 组件的操作都封装在单个二进制文件和进程中,使 K3s 具有自动化和管理包括证书分发在内的复杂集群操作的能力。
  • 最大程度减轻了外部依赖性,K3s 仅需要 kernel 和 cgroup 挂载。 K3s 软件包需要的依赖项包括:
    • containerd
    • Flannel
    • CoreDNS
    • CNI
    • 主机实用程序(iptables、socat 等)
    • Ingress controller(Traefik)
    • 嵌入式服务负载均衡器(service load balancer)
    • 嵌入式网络策略控制器(network policy controller)

适用场景

K3s 适用于以下场景:

  • 边缘计算-Edge
  • 物联网-IoT
  • CI
  • Development
  • ARM
  • 嵌入 K8s

由于运行 K3s 所需的资源相对较少,所以 K3s 也适用于开发和测试场景。在这些场景中,如果开发或测试人员需要对某些功能进行验证,或对某些问题进行重现,那么使用 K3s 不仅能够缩短启动集群的时间,还能够减少集群需要消耗的资源。与此同时,Rancher 中国团队推出了一款针对 K3s 的效率提升工具:AutoK3s。只需要输入一行命令,即可快速创建 K3s 集群并添加指定数量的 master 节点和 worker 节点。

image-20211226110750655

在 K3s server 上注册 agent 节点。

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

k3s架构

单节点

该集群有一个内嵌 SQLite 数据库的单节点 K3s server。

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

单节点k3s server的架构

Architecture

高可用架构

一个高可用 K3s 集群由以下几个部分组成:

  • K3s Server 节点:两个或更多的server节点将为 Kubernetes API 提供服务并运行其他 control-plane 服务
  • 外部数据库:与单节点 k3s 设置中使用的嵌入式 SQLite 数据存储相反,高可用 K3s 需要挂载一个external database外部数据库作为数据存储的媒介。

Architecture

固定 agent 节点的注册地址

在高可用 K3s server 配置中,每个节点还必须使用固定的注册地址向 Kubernetes API 注册,注册后,agent 节点直接与其中一个 server 节点建立连接,如下图所示:

k3s HA

注册 Agent 节点

Agent 节点用k3s agent进程发起的 websocket 连接注册,连接由作为代理进程一部分运行的客户端负载均衡器维护。

Agent 将使用节点集群 secret 以及随机生成的节点密码向 k3s server 注册,密码存储在 /etc/rancher/node/password路径下。K3s server 将把各个节点的密码存储为 Kubernetes secrets,随后的任何尝试都必须使用相同的密码。节点密码秘密存储在kube-system命名空间中,名称使用模板<host>.node-password.k3s

安装配置

get install.sh

1
2
curl -sfL https://get.k3s.io | sh -
curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -
1
2
3
# 复制安装版本的k3s到指定目录
cp k3s /usr/local/bin/k3s
chmod +x /usr/local/bin/k3s

默认install.sh会根据INSTALL_K3S_VERSION,INSTALL_K3S_CHANNEL下载对应的k3s

1
2
K3S_TOKEN='4807365324ccbdae8410b34724f3320a' INSTALL_K3S_SKIP_DOWNLOAD=true INSTALL_K3S_EXEC='server  --tls-san [本机ip] --node-external-ip [本机ip] --docker --cluster-cidr 10.42.0.0/16 --cluster-init' INSTALL_K3S_VERSION='v1.19.5-k3s2' ./install.sh

Environment Variable Description
INSTALL_K3S_SKIP_DOWNLOAD 如果设置为 “true “将不会下载 K3s 的哈希值或二进制。
INSTALL_K3S_VERSION 从 Github 下载 K3s 的版本。如果没有指定,将尝试从”stable”频道下载。
INSTALL_K3S_SYSTEMD_DIR 安装 systemd 服务和环境文件的目录,或者使用/etc/systemd/system作为默认目录。
INSTALL_K3S_CHANNEL 用于获取 K3s 下载 URL 的通道。默认值为 “stable”。选项包括:stable, latest, testing
K3S_CONFIG_FILE 指定配置文件的位置。默认目录为/etc/rancher/k3s/config.yaml
INSTALL_K3S_BIN_DIR 安装 K3s 二进制文件、链接和卸载脚本的目录,或者使用/usr/local/bin作为默认目录。
Flag 默认值 描述
--bind-address value 0.0.0.0 k3s 绑定地址
--https-listen-port value 6443 HTTPS 监听端口
--advertise-address value node-external-ip/node-ip apiserver 用来向集群成员发布的 IP 地址
--advertise-port value 0 apiserver 用于通告集群成员的端口(默认: listen-port)
--tls-san value N/A 在 TLS 证书中添加其他主机名或 IP 作为主题备用名称
--cluster-cidr value “10.42.0.0/16” 用于 Pod IP 的网络 CIDR

Agent 选项之所以存在,是因为 server 内嵌了 agent 进程

Flag 环境变量 描述
--node-ip value, -i value N/A 为节点发布的 IP 地址
--node-external-ip value N/A 对外发布节点的 IP 地址
--resolv-conf value K3S_RESOLV_CONF Kubelet resolv.conf 文件
--flannel-iface value N/A 覆盖默认的 flannel 接口
--flannel-conf value N/A 覆盖默认的 flannel 文件

AutoK3s

AutoK3s 是用于简化 K3s 集群管理的轻量级工具,您可以使用 AutoK3s 在任何地方运行 K3s 服务。

  • 通过 API、CLI 和 UI 等方式快速创建 K3s。
  • 云提供商集成(简化 CCM 设置)。
  • 灵活安装选项,例如 K3s 集群 HA 和数据存储(内置 etcd、RDS、SQLite 等)。
  • 低成本(尝试云中的竞价实例)。
  • 通过 UI 简化操作。
  • 多云之间弹性迁移,借助诸如 backup-restore-operator 这样的工具进行弹性迁移。

https://docs.rancher.cn/docs/k3s/autok3s/native/_index

1
2
3
autok3s create --provider native --help

autok3s create --provider native --cluster --k3s-channel stable --k3s-install-script http://xxx.xxx.xx.201:31080/install.sh --k3s-version v1.19.5+k3s2 --master-extra-args '--docker' --name test --ssh-key-path ~/.ssh/id_rsa --ssh-port 22088 --ssh-user root --worker-extra-args '--docker' --master-ips xxx.xxx.xx.205 --worker-ips xxx.xxx.xx.213
1
2
3
autok3s join --provider native --help

autok3s join --provider native --name test --ip xxx.xxx.xx.204 --k3s-install-script http://xxx.xxx.xx.201:31080/install.sh --k3s-version v1.19.5+k3s2 --master-extra-args '--docker' --name test --ssh-key-path ~/.ssh/id_rsa --ssh-port 22088 --ssh-user root --worker-extra-args '--docker' --master-ips xxx.xxx.xx.205 --worker-ips xxx.xxx.xx.213