本文转自 Escape,原文:https://www.escapelife.site/posts/754ba85c.html,版权归原作者所有。欢迎投稿,投稿请添加微信好友:cloud-native-yang

深入理解官方文档,轻松学会使用 K3s 工具!

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

  • CNCF 认证的 Kubernetes 发行版

  • 支持 X86_64, ARM64, ARMv7 平台

  • 单一进程包含 Kubernetes masterkubeletcontainerd

K3s 工具进阶指南

1. K3s 工具介绍

为你提供 k3s 的产品介绍

K3s 有以下增强功能:

  • 打包为单个二进制文件

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

  • 使用基于 sqlite3 的默认存储机制

    • 同时支持使用 etcd3MySQLPostgreSQL 作为存储机制。

  • 默认情况下是安全的

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

  • 功能强大的 batteries-included 功能

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

  • 所有 K8S control-plane 组件都封装在单个二进制文件和进程中

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

  • 最大程度减轻了外部依赖性

    • 即稍新一点的 Linux 内核就可以了 (需要 kernelcgroup 挂载)。

之所以叫做 K3s 是因为希望安装的 K8S 在内存占用方面只是一半的大小,而一半大的东西就是一个 5 个字母的单词,简写为 K3s

  • 生命周期

    • 同时支持 3K8s 版本,支持的生命周期与 K8s 相同

    • 可以参考 : Kubernetes 版本及版本偏差支持策略[1] 进行学习

  • 更新周期

    • K8s 更新新版本后,一般 K3s 在一周内同步更新

    • 可以通过 这个链接[2] 获取 latest/stable/testing 版本

    • 我们默认安装的是 stable 版本,可以运行通过命令进行查看

  • 命名规范

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

# K3s软件包需要的依赖项
containerd  # 容器运行时(可以使用docker替代)
Flannel     # 网络
CoreDNS     # DNS
CNI         # CNI
Traefik     # 默认的controller服务(apisix/ingress-controller)
iptables    # 主机实用程序
service load balancer     # 嵌入式服务负载均衡器
network policy controller # 嵌入式网络策略控制器# K3s适用于以下场景
CI
Development
ARM
嵌入 K8s
物联网-IoT
边缘计算-Edge

与此同时,Rancher 中国团队推出了一款针对 K3s 的效率提升工具:AutoK3s。只需要输入一行命令,即可快速创建 K3s 集群并添加指定数量的 master 节点和 worker 节点。

2. K3s 快速入门

原理就是,将 K8S 的相关组件封装到 K3s 的二进制文件中去!

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

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

K3s 架构

K8s 架构

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

3. K3s 安装事项

安装指南

理解 Server 节点的安装,以及注册 Agent 节点的步骤!

虽然可以通过下载二进制文件进行服务端和工作节点的运行 (./k3s server),但是一旦我们退出进程,之前创建的节点也就立即销毁了,所以还是建议使用脚本进行安装。

# 主节点
$ ./k3s server# 工作节点
$ ./k3s agent K3s_URL=xxx K3s_TOKEN=xxx# 清除垃圾文件
$ rm -rf /etc/rancher /var/lib/rancher
  • 镜像加速

# 添加配置
$ cat >> /etc/rancher/k3s/registries.yaml <<EOF
mirrors:"docker.io":endpoint:- "https://fogjl973.mirror.aliyuncs.com"- "https://registry-1.docker.io"
EOF# 重启服务
$ sudo systemctl restart k3s# 是否生效
$ sudo crictl info | grep -A 2 "endpoint"

K3s 提供了一个安装脚本,可以方便的在 systemdopenrc 的系统上将其作为服务安装。运行此安装后,K3s 服务将被配置为在节点重启后或进程崩溃或被杀死时自动重启。

  • 安装内容

    • kubectlcrictlctr

    • k3s-killall.shk3s-uninstall.sh

  • 执行操作

    • kubeconfig 文件写入到 /etc/rancher/k3s/k3s.yaml 里面

    • K3s 安装的 kubectl 工具将自动使用该文件的配置来运行

    • 其他机器可以通过复制这个配置文件并修改 server 地址来操作 K3s 集群

主节点 - 192.168.100.100

# 安装脚本
# https://get.k3s.io
$ curl -sfL https://get.k3s.io | sh -# 建议使用这个安装脚本(国内化了)
$ curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \INSTALL_K3s_MIRROR=cn K3s_NODE_NAME=k3s1 \K3s_KUBECONFIG_OUTPUT=/home/escape/.kube/config \INSTALL_K3s_EXEC="--docker" sh -
# 查找stable分支版本信息
[INFO]  Finding release for channel stable
[INFO]  Using v1.23.6+k3s1 as release# 获取国内镜像版本地址
[INFO]  Downloading hash https://rancher-mirror.rancher.cn/k3s/v1.23.6-k3s1/sha256sum-amd64.txt
[INFO]  Downloading binary https://rancher-mirror.rancher.cn/k3s/v1.23.6-k3s1/k3s
[INFO]  Verifying binary download# 安装k3s二进制工具并链接相关工具(内置)
[INFO]  Installing k3s to /usr/local/bin/k3s
[INFO]  Skipping installation of SELinux RPM
[INFO]  Creating /usr/local/bin/kubectl symlink to k3s
[INFO]  Creating /usr/local/bin/crictl symlink to k3s
[INFO]  Skipping /usr/local/bin/ctr symlink to k3s, command exists in PATH at /usr/bin/ctr# 安装清除和卸载k3s生成的配置和工具
[INFO]  Creating killall script /usr/local/bin/k3s-killall.sh
[INFO]  Creating uninstall script /usr/local/bin/k3s-uninstall.sh# 常见了两个systemd的配置
[INFO]  env: Creating environment file /etc/systemd/system/k3s.service.env
[INFO]  systemd: Creating service file /etc/systemd/system/k3s.service
[INFO]  systemd: Enabling k3s unit
Created symlink /etc/systemd/system/multi-user.target.wants/k3s.service → /etc/systemd/system/k3s.service.# 启动k3s服务
[INFO]  systemd: Starting k3s

工作节点 - 192.168.100.101

# 工作节点上安装并将它们添加到集群
# https://docs.rancher.cn/docs/k3s/architecture/_index#注册-agent-节点
$ curl -sfL https://get.k3s.io | \K3s_URL=https://myserver:6443 \K3s_TOKEN=mynodetoken sh -# 建议使用这个安装命令(国内化了)
# K3s_URL: 会使K3s以worker模式运行
# K3s_TOKEN: 使用的值存储在你的服务器节点上
# K3s_NODE_NAME: 为每个节点提供一个有效且唯一的主机名
$ curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \INSTALL_K3s_MIRROR=cn K3s_NODE_NAME=k3s2 \K3s_KUBECONFIG_OUTPUT=/home/escape/.kube/config \K3s_URL=https://192.168.100.100:6443 \K3s_TOKEN=mynodetoken sh -# mynodetoken
$ sudo cat /var/lib/rancher/k3s/server/token
# 查找stable分支版本信息
[INFO]  Finding release for channel stable
[INFO]  Using v1.23.6+k3s1 as release# 获取国内镜像版本地址
[INFO]  Downloading hash https://rancher-mirror.rancher.cn/k3s/v1.23.6-k3s1/sha256sum-amd64.txt
[INFO]  Downloading binary https://rancher-mirror.rancher.cn/k3s/v1.23.6-k3s1/k3s
[INFO]  Verifying binary download# 安装k3s二进制工具并链接相关工具(内置)
[INFO]  Installing k3s to /usr/local/bin/k3s
[INFO]  Creating /usr/local/bin/kubectl symlink to k3s
[INFO]  Creating /usr/local/bin/crictl symlink to k3s
[INFO]  Skipping /usr/local/bin/ctr symlink to k3s# 安装清除和卸载k3s生成的配置和工具
[INFO]  Creating killall script /usr/local/bin/k3s-agent-killall.sh
[INFO]  Creating uninstall script /usr/local/bin/k3s-agent-uninstall.sh# 常见了两个systemd的配置
[INFO]  env: Creating environment file /etc/systemd/system/k3s-agent.service.env
[INFO]  systemd: Creating service file /etc/systemd/system/k3s-agent.service
[INFO]  systemd: Enabling k3s-agent unit
Created symlink /etc/systemd/system/multi-user.target.wants/k3s-agent.service → /etc/systemd/system/k3s-agent.service.# 启动k3s服务
[INFO]  systemd: Starting k3s-agent

配置要求

理解 Server 节点的安装,以及注册 Agent 节点的步骤!

先决条件

  • 选择上,两个节点不能有相同的主机名

  • 不修改主机名可以通过添加随机后缀或指定主机名

# 为每个节点添加随机后缀
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \INSTALL_K3s_MIRROR=cn K3s_URL=https://192.168.100.100:6443 \K3s_TOKEN=xxx sh -s - --with-node-id# 为每个节点指定主机名
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \K3s_NODE_NAME="k3s2" INSTALL_K3s_MIRROR=cn \K3s_URL=https://192.168.64.3:6443 K3s_TOKEN=xxx sh -# 为每个节点指定主机名
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \INSTALL_K3s_MIRROR=cn K3s_URL=https://192.168.64.3:6443 \K3s_TOKEN=xxx sh -s - --node-name k3s2

硬件信息

  • 操作系统:可以在大多数现代 Linux 系统上运行

  • 磁盘设备:K3s 的性能取决于数据库的性能 (建议使用 SSD 硬盘)

  • 网络相关:K3s Server 节点的入站规则,所有出站流量都是允许的

协议 端口 描述
TCP 6443 K3s agent 节点 Kubernetes API Server
UDP 8472 K3s server 和 agent 节点 仅对 Flannel VXLAN 需要
TCP 10250 K3s server 和 agent 节点 Kubelet metrics
TCP 2379-2380 K3s server 节点 只有嵌入式 etcd 高可用才需要

安装选项

  • 官方安装参数文档[4]

  • [安装选项示例演示](https://github.com/kingsd041/k3s-tutorial/blob/main/03-安装-要求及选项 /README.md "安装选项示例演示")

Environment Variable Description
INSTALL_K3s_EXEC 用于在服务中启动 K3s 的后续子命令
K3s_CONFIG_FILE 指定配置文件的位置
K3s_TOKEN 用于将 server/agent 加入集群的共享 secret
K3s_TOKEN_FILE 用于将 server/agent 加入集群的共享 secret 文件
INSTALL_K3s_VERSION 指定下载 K3s 的版本
K3s_TOKEN_FILE 指定  cluster-secret/token 的文件目录
INSTALL_K3s_SKIP_START 将不会启动 K3s 服务
INSTALL_K3s_SKIP_DOWNLOAD 用于离线安装;设置之后不会下载远程工具
# 其实就把对应参数加到systemd配置文件里面去了
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \INSTALL_K3s_MIRROR=cn \INSTALL_K3s_EXEC="--docker" sh -# 自动化部署(不用获取token值了)
# 主节点和工作节点使用我们指定的key来通信
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \INSTALL_K3s_MIRROR=cn \K3s_TOKEN=rancher-k3s sh -
$ sudo cat /var/lib/rancher/k3s/server/token

其他说明

  • 运行 agent 时还必须设置 K3s_TOKEN

  • K3s_ 开头的环境变量将被保留,供 systemd/openrc 使用

  • 没有明确设置 exec 并设置 K3s_URL 的话会将命令默认为工作节点

命令参数

理解 Server 节点的安装,以及注册 Agent 节点的步骤!

在整个 K3s 文档中,你会看到一些选项可以作为命令标志和环境变量传递进来,那该如何使用标志和环境变量呢?

使用标志和环境变量

# 使用标志
$ curl -sfL https://get.k3s.io | K3s_KUBECONFIG_MODE="644" sh -s -
$ curl -sfL https://get.k3s.io | sh -s - --write-kubeconfig-mode 644# 环境变量
$ curl -sfL https://get.k3s.io | \INSTALL_K3s_EXEC="--flannel-backend none" sh -s -
$ curl -sfL https://get.k3s.io | \sh -s - server --flannel-backend none

K3s Server/Agent - 常用配置

# write-kubeconfig
# 将管理客户端的kubeconfig写入这个文件
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \INSTALL_K3s_MIRROR=cn \K3s_KUBECONFIG_OUTPUT=/root/.kube/config \sh -
# 使用docker作为容器运行时
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \INSTALL_K3s_MIRROR=cn \INSTALL_K3s_EXEC="--docker" sh -# 指定运行时工具
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \INSTALL_K3s_MIRROR=cn \INSTALL_K3s_EXEC="--container-runtime-endpoint containerd" \sh -# 设置私有镜像仓库配置文件
# 默认配置文件: /etc/rancher/k3s/registries.yaml
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \INSTALL_K3s_MIRROR=cn \INSTALL_K3s_EXEC="--private-registry xxx" \sh -
# 针对多网卡主机安装K3s集群
# 默认多网卡会使用默认网关的那个卡
$ rout -n# K3s server
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \INSTALL_K3s_MIRROR=cn \INSTALL_K3s_EXEC="--node-ip=192.168.100.100" \sh -# K3s agent
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \INSTALL_K3s_MIRROR=cn \K3s_URL=https://192.168.99.211:6443 K3s_TOKEN=xxx \INSTALL_K3s_EXEC="--node-ip=192.168.100.100" \sh -
# --tls-san
# 在TLS证书中添加其他主机名或IP作为主机备用名称
# 即在公网环境下允许通过公网IP访问控制、操作远程集群
# 或者部署多个Server并使用LB进行负责,就需要保留公网地址
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \INSTALL_K3s_MIRROR=cn \INSTALL_K3s_EXEC="--tls-san 1.1.1.1"  \sh -# 获取配置
$ kubectl get secret k3s-serving -n kube-system -o yaml# 然后本机复制公网主节点对应的yaml文件即可本地操作了
$ scp ci@1.1.1.1:/etc/rancher/k3s/k3s.yaml ~/.kube/config
# 修改启动的服务对应配置(调整节点的启动的最大Pod数量)
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \INSTALL_K3s_MIRROR=cn \INSTALL_K3s_EXEC='--kubelet-arg=max-pods=200' \sh -# 修改启动的服务对应配置(使用ipvs作为服务调度工具)
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \INSTALL_K3s_MIRROR=cn \INSTALL_K3s_EXEC='--kube-proxy-arg=proxy-mode=ipvs' \sh -# 修改启动的服务对应配置(调整服务启动的端口范围)
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \INSTALL_K3s_MIRROR=cn \INSTALL_K3s_EXEC='--kube-apiserver-arg=service-node-port-range=40000-50000' \sh -# kubelet-arg     --kubelet-arg
# kube-apiserver  --kube-apiserver-arg
# kube-proxy-arg  --kube-proxy-arg
# kube-proxy-arg  --kube-proxy-arg=proxy-mode=ipvs
# --data-dir
# 修改K3s数据存储目录
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \INSTALL_K3s_MIRROR=cn \INSTALL_K3s_EXEC='--data-dir=/opt/k3s-data' \sh -
# 禁用组件
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \INSTALL_K3s_MIRROR=cn \INSTALL_K3s_EXEC='--disable traefik' \sh -# 自己加自己需要的服务
$ ls /var/lib/rancher/k3s/server/manifests
$ kubectl get pods -A | grep traefik
# 添加label和taint标识
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \INSTALL_K3s_MIRROR=cn \INSTALL_K3s_EXEC='--node-label foo=bar,hello=world \--node-taint key1=value1:NoExecute'sh -# 查看一下
$ kubectl describe nodes

K3s Server/Agent - 数据库选项

# 指定数据源名称
# 标志位: --datastore-endpoint&nbsp;value
# 环境变量: K3s_DATASTORE_ENDPOINT
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \INSTALL_K3s_MIRROR=cn \INSTALL_K3s_EXEC='--datastore-endpoint&nbsp;etcd' \sh -
# cron规范中的快照间隔时间
# --etcd-snapshot-schedule-cron&nbsp;value
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \INSTALL_K3s_MIRROR=cn \INSTALL_K3s_EXEC='--etcd-snapshot-schedule-cron *&nbsp;*/5&nbsp;*&nbsp;*&nbsp;*' \sh -

网络选项

理解 Server 节点的安装,以及注册 Agent 节点的步骤!

默认情况下,K3s 将以 flannel 作为 CNI 运行,使用 VXLAN 作为默认后端,CNI 和默认后端都可以通过参数修改。要启用加密,请使用下面的 IPSecWireGuard 选项。

# 默认安装K3s之后的网络配置
$ sudo cat /var/lib/rancher/k3s/agent/etc/flannel/net-conf.json
{"Network": "10.42.0.0/16","EnableIPv6": false,"EnableIPv4": true,"IPv6Network": "::/0","Backend": {"Type": "vxlan"}
}
CLI Flag 和 Value 描述
--flannel-backend=vxlan 使用 VXLAN 后端 (默认)
--flannel-backend=host-gw 使用 host-gw 后端
--flannel-backend=ipsec 使用 IPSEC 后端;对网络流量进行加密
--flannel-backend=wireguard 使用 WireGuard 后端;对网络流量进行加密

配置 Flannel 选项

这样,我就可以在安装 K3s 或者之后修改对应配置文件,来修改 Flannel 默认的后端网络配置选项 (重启会覆盖不生效) 了。下面,我们演示下,如何修改为 host-gw 模式。

# 主节点
# flannel-backend使用host-gw
# 该模式会把对端主机的IP当做默认网管(多Server情况)
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \INSTALL_K3s_MIRROR=cn \INSTALL_K3s_EXEC='--flannel-backend=host-gw' \sh -# 工作节点
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \INSTALL_K3s_MIRROR=cn K3s_URL=https://192.168.100.100:6443 \K3s_TOKEN=xxx sh -
# 默认的路由信息
$ route -n
0.0.0.0         172.16.64.1     0.0.0.0         UG    100    0        0 enp0s2
10.42.1.0       172.16.64.9     255.255.255.0   UG    0      0        0 enp0s2# 查看配置之后的网络配置
$ sudo cat /var/lib/rancher/k3s/agent/etc/flannel/net-conf.json
{"Network": "10.42.0.0/16","Backend": {"Type": "host-gw"}
}

启用 Directrouting 特性

Flannel 自身的特性:当主机在同一子网时,启用 direct routes(如 host-gw)。vxlan 只用于将数据包封装到不同子网的主机上,同子网的主机之间使用  host-gw,默认值为  false

要添加我们就不能修改其对应的网络配置文件,因为重新安装或者重启都会把这个配置冲掉 (变成默认配置),所以需要折中下。我们自建一个网络配置文件,然后在启动的时候执行从哪个配置文件里面加载对应配置。

# k3s的master和agent
$ sudo cat /etc/flannel/net-conf.json
{"Network": "10.42.0.0/16","Backend": {"Type": "vxlan","Directrouting": true}
}# k3s master
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \INSTALL_K3s_MIRROR=cn \INSTALL_K3s_EXEC='--flannel-backend=host-gw' \sh -

自定义 CNI

使用  --flannel-backend=none(禁用) 运行 K3s,然后在安装你选择的 CNI。按照 Calico CNI 插件指南[5] 来修改 CalicoYAML 配置文件,在 container_settings 部分中允许 IP 转发。

# 加到Calico的YAML文件中
# 允许IP转发(这个是K3s的一个限制;需要开启)
"container_settings": {"allow_ip_forwarding": true
}- name: CALICO_IPV4POOL_CIDRvalue: "192.168.200.0/24"
# 通过在主机上运行以下命令,确保设置已被应用(true)
$ sudo cat /etc/cni/net.d/10-canal.conflist# calico
# 其中--cluster-cidr可不设置
$ curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | \INSTALL_K3s_MIRROR=cn \INSTALL_K3s_EXEC='--flannel-backend=none \--cluster-cidr=192.168.200.0/24"' \sh -# 启动网络服务
$ kubectl apply -f ./calico.yaml

外部数据库

理解 Server 节点的安装,以及注册 Agent 节点的步骤!

使用外部数据库实现高可用安装