K3S搭建

K3s介绍

简介

官网 Github

K3s 是轻量级的 Kubernetes。K3s 易于安装,仅需要 Kubernetes 内存的一半,所有组件都在一个小于 100 MB 的二进制文件中。

它适用于

  • Edge
  • IoT
  • CI
  • Development
  • ARM
  • 嵌入 K8s
  • 不去学习那么多的 Kubernetes 高深知识也能上手使用

什么是 K3s

K3s 是一个完全兼容的 Kubernetes 发行版,具有以下增强功能:

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

为什么叫 K3s

我们希望安装的 Kubernetes 只占用一半的内存。Kubernetes 是一个 10 个字母的单词,简写为 K8s。Kubernetes 的一半就是一个 5 个字母的单词,因此简写为 K3s。K3s 没有全称,也没有官方的发音。

K3s 工具介绍

K3s 有以下增强功能:

  • 打包为单个二进制文件

    • 把 K8S 相关的组件,比如 kube-api/ kube-manager 都打包到同一个二进制文件里面,这样的话,只需要启动这个文件就可以快速的启动对应的组件。
  • 使用基于 sqlite3 的默认存储机制

    • 同时支持使用 etcd3、MySQL 和 PostgreSQL 作为存储机制。
  • 默认情况下是安全的

    • 在 K3s 中有一个默认的证书管理机制(默认一年有效期),也有一个可以轮转证书的功能(就是在小于九十天之内重启 K3s 的话,就会自动续一年)。
  • 功能强大的 batteries-included 功能

    • 就是虽然有些服务本身这个二进制文件并没有提供,但是可以通过内置的服务,将配置文件放到指定的目录下面,就可以在启动的时候一并将该服务启动或替换默认组件。
  • 所有 K8S control-plane 组件都封装在单个二进制文件和进程中

    • 因为封装在二进制文件中,所以启动的时候只有一个进程。好处在于只需要管理这个单一进程就可以了,同时也具备操作复杂集群的能力。
  • 最大程度减轻了外部依赖性

    • 即稍新一点的 Linux 内核就可以了(需要 kernel 和 cgroup 挂载)。 之所以叫做 K3S 是因为希望安装的 K8S 在内存占用方面只是一半的大小,而一半大的东西就是一个 5 个字母的单词,简写为 K3S。
  • 生命周期

  • 更新周期

    • 当 K8s 更新新版本后,一般 K3s 在一周内同步更新
    • 可以通过 这个链接 获取 latest/stable/testing 版本
    • 我们默认安装的是 stable 版本,可以运行通过命令进行查看
  • 命名规范

    • v1.29.5+k3s1: v1.29.5 为 K8s 版本,k3s1 为补丁版本

K3s 快速入门

原理就是,将 K8S 的相关组件封装到 K3S 的二进制文件中去,然后启动这二进制文件就可以启动一个成熟的 K8S 集群。 我们可以看到 K3S 和 K8S 的架构基本差不多,其中 k3s-server 对应这个 control-plane,而 k3s-agent 对应着 node 节点。

可以看到 k3s 中使用的默认存储是 SQLite(自带),且默认的网络使用的是 Flannel(自带)。 当服务端和客户端都启动之后,通过 Tunnel-Proxy 这个组件进行通信,通过这个通道去管理网络流量。 在 agent 节点中,通过 kubelet 操作 contaninerd 来创建对应 Pod。

  • K3s 架构 img
  • K8s 架构 img

国内的话,建议使用官方提供的 镜像地址,这样不但可以加速本地 K3s 的时候,而且方便部署和更新服务。 这也是为什么建议国内使用 k3s-install.sh 部署服务的原因,因为其内部使用的地址都是从国内去获取的。


K3s 安装

软件环境

软件 版本
操作系统 Ubuntu 11.4.0-1ubuntu1~22.04
K3s v1.29.5+k3s1

服务器角色

角色 IP
home-host 192.168.31.20
home-node 192.168.31.30

配置说明

官方安装参数文档

参数名 描述
INSTALL_K3S_VERSION 指定下载 K3s 的版本
INSTALL_K3S_SKIP_START 将不会启动 K3s 服务
INSTALL_K3S_NAME systemd 服务名称
K3S_NODE_NAME 节点名称,不启用默认获取主机名
INSTALL_K3S_EXEC 用于在服务中启动 K3s 的后续子命令

master部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
export INSTALL_K3S_VERSION=v1.29.5+k3s1
export INSTALL_K3S_SKIP_START=true
export INSTALL_K3S_NAME=server
export K3S_NODE_NAME=home-host

export DISABLE_COMMAND='--disable=traefik --disable=servicelb'
export WG_SERVER_IP='192.168.31.20'
export EXTERNAL_COMMMAND="--node-ip=$WG_SERVER_IP --node-external-ip=$WG_SERVER_IP --advertise-address=$WG_SERVER_IP --flannel-iface=eth0"
export INSTALL_K3S_EXEC="$DISABLE_COMMAND $EXTERNAL_COMMMAND --service-node-port-range=22-32767 --prefer-bundled-bin"
# 使用国内镜像源脚本安装
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -

#启动服务并设置开机自动
systemctl enable --now k3s-server
systemctl status k3s-server
systemctl restart k3s-server
#查看启动日志
journalctl -f -u k3s-server.service

#shell提示
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
echo "alias ll='ls -lh'" >> ~/.bashrc

node部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
export INSTALL_K3S_VERSION=v1.29.5+k3s1
export INSTALL_K3S_SKIP_START=true
export INSTALL_K3S_NAME=node
export K3S_NODE_NAME=home-node

export WG_SERVER_IP='192.168.31.20'
export EXTERNAL_COMMMAND="--node-ip=$WG_SERVER_IP --node-external-ip=$WG_SERVER_IP --flannel-iface=eth0"
export INSTALL_K3S_EXEC="$EXTERNAL_COMMMAND --prefer-bundled-bin"
export K3S_URL="https://192.168.31.20:6443"

# 用于将 server 或 agent 加入集群的共享 secret
# 在主节点上获取:cat /var/lib/rancher/k3s/server/node-token
export K3S_TOKEN=xxx::server:xxx
# 使用国内镜像源脚本安装
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -

#启动服务并设置开机自动
systemctl enable --now k3s-node
systemctl status k3s-node
systemctl restart k3s-node

#查看启动日志
journalctl -f -u k3s-node.service