K3s 快速了解:轻量级Kubernetes 入门指南 – wiki基地


K3s 快速了解:轻量级Kubernetes 入门指南

引言:Kubernetes 的挑战与 K3s 的应运而生

在当今容器化和云原生的浪潮中,Kubernetes (常简称为 K8s) 已成为容器编排的事实标准。它提供了强大的自动化部署、扩展和管理容器化应用的能力。然而,标准的 Kubernetes 发行版,如通过 kubeadm 或云服务商提供的托管服务,虽然功能强大,但也带来了显著的复杂性和资源开销。其庞大的体积、众多的组件、对资源的较高要求以及相对复杂的安装和配置过程,对于资源受限的环境(如边缘计算、物联网设备、树莓派集群),或是对于希望快速搭建开发/测试环境、构建 CI/CD 流水线,乃至个人学习和家庭实验室的使用者来说,可能显得过于“重量级”。

正是在这样的背景下,Rancher Labs (现已是 SUSE 的一部分) 推出了 K3s。K3s 的 Slogan 是 “The certified Kubernetes distribution built for the IoT & Edge”。顾名思义,它是一款专为物联网和边缘计算场景设计的轻量级 Kubernetes 发行版。但很快,人们发现 K3s 的价值远不止于此,它简洁、易用、资源占用低的特性使其成为许多其他场景下的理想选择。

本文将带您深入了解 K3s,包括它是什么、为什么选择它、它的独特之处、如何快速安装和入门使用,以及它适合哪些场景。无论您是 Kubernetes 的新手,还是希望在特定环境下使用更轻量级方案的资深用户,这篇指南都将为您提供有价值的参考。

第一部分:什么是 K3s?

K3s 是一个高度可用、经过 CNCC (Cloud Native Computing Foundation) 认证的 Kubernetes 发行版,专门设计用于生产环境中的小型、远程分支机构和边缘位置工作负载。它通过以下方式实现了“轻量级”:

  1. 精简组件: K3s 从标准的 Kubernetes 中移除了一些非必需的或者通常用不到的组件和功能,例如旧的、Alpha 阶段的 API、一些非默认的 Admission Controllers、以及大量的云服务提供商集成驱动(如果需要,可以通过外部插件补充)。
  2. 合并为单一二进制文件: 将主要的 Kubernetes 组件(如 API Server, Controller Manager, Scheduler, Kubelet, Kube-proxy, Containerd 等)以及一些常用的附加组件(如 CNI、Ingress Controller、DNS 等)打包到一个不到 100MB 的单一二进制文件中。这极大地简化了分发、安装和升级过程。
  3. 采用轻量级嵌入式数据库: 默认使用 dqlite(分布式 SQLite)作为数据存储,而非标准的 etcd。dqlite 是一个基于 SQLite 的高可用分布式数据库,它将 SQLite 嵌入到应用程序中,并通过 raft 协议实现分布式一致性。这使得 K3s 的控制平面在单节点时无需额外数据库,在多节点 HA 模式下也比外部 etcd 集群更容易管理。它也支持使用外部 PostgreSQL 或 MySQL/MariaDB 数据库。
  4. 默认捆绑常用附加组件: K3s 集成了 Containerd 作为容器运行时、Flannel 作为默认 CNI 网络插件、CoreDNS 用于服务发现、Traefik 作为默认 Ingress Controller,以及一个简单的 Local Path Provisioner 用于提供 StorageClass。这些都是生产环境中常用的组件,K3s 将它们预集成并默认启用(或可选启用),减少了用户自行安装配置的麻烦。

正是通过这些优化,K3s 在保持完全兼容标准 Kubernetes API 的同时,显著降低了资源消耗和运维复杂性。您可以像使用任何其他 Kubernetes 集群一样与 K3s 进行交互,使用 kubectl 命令和标准的 YAML 文件部署应用。

第二部分:为什么选择 K3s?K3s 的优势与用例

K3s 之所以受到青睐,是因为它解决了标准 Kubernetes 在某些场景下的痛点,并提供了独特的优势:

  1. 极致的轻量化: 这是 K3s 最核心的特性。它可以在仅有 512MB RAM 的主机上运行(尽管推荐至少 1GB 以获得更好体验),磁盘空间占用也很小。这使得它非常适合部署在资源受限的设备上,如树莓派、工业PC、边缘网关等。
  2. 安装与部署极其简单快捷: K3s 的安装通常只需要执行一个 curl | sh 命令,几分钟内即可拥有一个功能完备的 Kubernetes 集群。这比 kubeadm 或从头搭建 Kubernetes 简单得多,非常适合快速原型开发、本地测试或自动化 CI/CD 环境。
  3. “开箱即用”的集成组件: 默认集成的 Containerd、Flannel、CoreDNS、Traefik、Local Path Provisioner 等组件,意味着您安装完 K3s 之后,无需额外配置就可以直接部署有状态应用、通过 Ingress 暴露服务、以及实现服务间的 DNS 解析。这为入门用户和需要快速搭建环境的用户提供了极大的便利。
  4. CNCF 认证的合规性: K3s 完全通过了 CNCF 的一致性测试,这意味着它是“真正的”Kubernetes。所有为标准 Kubernetes 设计的应用、Helm Charts、Operators 等,理论上都可以在 K3s 上无缝运行。这保证了生态系统的兼容性。
  5. 高可用 (HA) 支持: 尽管默认安装是单节点模式,K3s 通过支持外部数据库(PostgreSQL, MySQL/MariaDB)或嵌入式 dqlite 的集群模式,可以轻松实现高可用控制平面,满足生产环境的需求。
  6. 安全性: K3s 设计时考虑了安全性,例如默认使用较低权限的用户运行进程。其精简的特性也减少了攻击面。
  7. 社区活跃与良好文档: K3s 拥有一个活跃的社区,并且由 SUSE 提供商业支持(作为 Rancher 产品线的一部分)。官方文档也非常详尽,为用户提供了丰富的学习资源。

基于这些优势,K3s 的典型用例包括:

  • 边缘计算与物联网 (IoT): 在带宽受限、计算资源有限、网络不稳定的边缘设备或网关上运行容器化应用,K3s 的轻量和易部署特性是关键。
  • CI/CD 流水线: 在构建服务器上快速拉起一个临时的 Kubernetes 集群用于应用的自动化构建、测试和部署,K3s 的快速安装和低资源占用非常理想。
  • 开发与测试环境: 开发者可以在本地笔记本电脑或小型虚拟机上快速搭建一个 Kubernetes 环境进行应用开发和测试,无需庞大的资源或复杂的配置。
  • 家庭实验室与个人项目: 在树莓派集群或其他低成本硬件上搭建自己的私有云或学习环境。
  • 小型生产环境: 对于不需要大规模集群的场景,K3s 提供了构建可靠、高可用小型生产集群的简便方案。
  • 快速原型设计与演示: 需要快速向客户或团队演示基于 Kubernetes 的方案时,K3s 可以帮助您在短时间内搭建演示环境。

第三部分:K3s 工作原理概述

理解 K3s 的工作原理有助于更好地使用和排查问题。K3s 的核心在于将 Kubernetes 的复杂性隐藏在一个简单的模型背后。

  1. 单一二进制文件 k3s 这是 K3s 的心脏。这个二进制文件包含了运行一个 Kubernetes 集群所需的大部分组件。当您执行 k3s server 命令时,它会启动控制平面组件(API Server, Controller Manager, Scheduler)以及一个 Kubelet 和 Containerd。当您执行 k3s agent 命令时,它会启动 Kubelet 和 Containerd,并连接到 K3s server。
  2. 精简的控制平面: K3s 的控制平面移除了很多企业级 K8s 中常见的云提供商特定代码、存储驱动等,专注于核心的 Kubernetes 功能。
  3. 嵌入式数据库 (dqlite): K3s server 默认使用 dqlite 存储集群状态。dqlite 直接嵌入在 K3s 进程中,无需单独安装和管理数据库服务。在单节点模式下,它就是一个本地的 SQLite 文件 (/var/lib/rancher/k3s/server/db/state.db)。在多节点 HA 模式下,多个 K3s server 节点通过 dqlite 实现分布式一致性。
  4. 捆绑的附加组件: K3s 将一些关键的网络、存储、入口等组件的部署逻辑内置或默认启用:
    • Containerd: 作为容器运行时,负责管理容器的生命周期。
    • Flannel: 默认的 CNI (Container Network Interface) 网络插件,用于实现 Pod 之间的网络通信。它提供了一个简单的 overlay 网络。您也可以禁用 Flannel 并安装其他 CNI,如 Calico。
    • CoreDNS: 集群内部的服务发现 DNS 服务器。
    • Traefik: 默认的 Ingress Controller,用于将外部流量路由到集群内部的服务。
    • Local Path Provisioner: 提供一个简单的 StorageClass,可以将 PersistentVolumeClaim 绑定到节点上的本地目录。适合开发测试或简单的单节点应用。
    • ServiceLB (Klipper-lb): K3s 默认包含一个简单的基于 DaemonSet 的 Service Load Balancer 实现,可以为 LoadBalancer 类型的 Service 分配一个节点 IP 和端口(NodePort 的变种),方便在没有云提供商集成时暴露服务。
  5. 自动配置: 安装脚本和 K3s 本身会负责设置必要的系统服务(systemd 或 OpenRC)、配置 Kubelet 参数、设置 KUBECONFIG 文件等,将复杂的配置过程自动化。

通过这种设计,K3s 提供了一个高度集成和简化的 Kubernetes 栈,让用户可以更快地开始使用,而无需深入了解其底层复杂的相互依赖关系。

第四部分:快速入门 – 安装 K3s 单节点集群

K3s 的安装是其最大的亮点之一。以下是安装一个单节点 K3s 集群的最快方式。

前提条件:

  • 一台运行 Linux 的服务器(物理机、虚拟机、云主机均可)。支持多种 Linux 发行版,推荐 Ubuntu, CentOS/RHEL, openSUSE 等。
  • 推荐至少 1GB RAM 和 1 核 CPU。
  • 需要 root 权限或通过 sudo 执行命令。
  • 需要能够访问互联网以下载 K3s 二进制文件和容器镜像。

安装步骤:

K3s 官方提供了一个非常方便的安装脚本。只需一行命令即可完成安装:

bash
curl -sfL https://get.k3s.io | sh -

这行命令做了什么?

  • curl -sfL https://get.k3s.io:从 K3s 官方网站下载安装脚本。-sfLcurl 的选项,-s 静默模式(不显示进度和错误),-f 失败时立即报错,-L 遵循重定向。
  • | sh -:将下载的脚本通过管道传递给 sh 命令执行。

脚本执行后,会自动检测您的系统架构,下载对应的 K3s 二进制文件,将其安装到 /usr/local/bin/k3s,创建必要的目录,配置 systemd 服务(或 OpenRC),启动 k3s 服务,并自动配置 KUBECONFIG。

验证安装:

安装完成后,您可以验证 K3s 服务是否正在运行:

bash
sudo systemctl status k3s

理论上,它应该显示服务处于 active (running) 状态。

接着,您可以验证 Kubernetes 集群是否正常工作,例如检查节点状态:

bash
sudo kubectl get nodes

首次运行 kubectl 可能需要一些时间来下载必要的镜像(如 CoreDNS、Traefik 等)。稍等片刻后,您应该会看到类似以下的输出:

NAME STATUS ROLES AGE VERSION
your-hostname Ready control-plane,master 2m vX.Y.Z+k3s1

其中 your-hostname 是您的服务器主机名,Ready 状态表示节点已经准备就绪,control-plane,master 表示这是控制平面节点。版本号会显示 K3s 对应的 Kubernetes 版本。

访问集群:

安装脚本会自动将 KUBECONFIG 文件放在 /etc/rancher/k3s/k3s.yaml。如果您当前用户不是 root,需要使用这个文件来访问集群。您可以这样做:

bash
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
kubectl get nodes

或者更方便的做法是,将其复制到您的用户目录下(如果 /etc/rancher/k3s/k3s.yaml 的权限允许):

“`bash
mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $(id -u):$(id -g) ~/.kube/config

现在可以直接使用 kubectl 了

kubectl get nodes
“`

自定义安装:

安装脚本支持多种环境变量来自定义安装,例如:

  • INSTALL_K3S_VERSION=vx.y.z+k3sN:安装指定版本的 K3s。
  • INSTALL_K3S_BIN_DIR=/opt/k3s:指定 K3s 二进制文件的安装目录。
  • K3S_URL, K3S_TOKEN:用于将 Agent 节点连接到 Server 节点。
  • K3S_NO_TRAEFIK="true":禁用默认的 Traefik Ingress Controller。
  • K3S_NO_LOCAL_STORAGE="true":禁用默认的 Local Path Provisioner。
  • K3S_NO_FLANNEL="true":禁用默认的 Flannel CNI。
  • K3S_ARGS="...":向 K3s server 或 agent 传递额外的命令行参数。

例如,安装一个不包含 Traefik 和 Local Storage 的 K3s server:

bash
curl -sfL https://get.k3s.io | INSTALL_K3S_NO_TRAEFIK="true" INSTALL_K3S_NO_LOCAL_STORAGE="true" sh -

更多选项请参考 K3s 官方文档。

卸载 K3s:

K3s 安装脚本也会在 /usr/local/bin/ 下创建卸载脚本:

  • 卸载 Server 节点:sudo /usr/local/bin/k3s-uninstall.sh
  • 卸载 Agent 节点:sudo /usr/local/bin/k3s-agent-uninstall.sh

这些脚本会停止 K3s 服务,移除相关文件和服务定义,清理 iptables 规则等。

第五部分:基本使用 – 部署第一个应用

安装好 K3s 集群后,您就可以像使用任何标准 Kubernetes 集群一样来部署应用了。这里以部署一个简单的 Nginx 应用为例。

  1. 创建 Deployment YAML 文件:
    创建一个名为 nginx-deployment.yaml 的文件,内容如下:

    yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx-deployment
    labels:
    app: nginx
    spec:
    replicas: 3
    selector:
    matchLabels:
    app: nginx
    template:
    metadata:
    labels:
    app: nginx
    spec:
    containers:
    - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80

    这个文件定义了一个名为 nginx-deployment 的 Deployment,它会创建 3 个 Nginx Pod 的副本。

  2. 应用 Deployment:
    使用 kubectl apply 命令将 Deployment 部署到 K3s 集群中:

    bash
    kubectl apply -f nginx-deployment.yaml

    如果您的 KUBECONFIG 环境变量已正确设置,或者您已将配置文件复制到 ~/.kube/config,则直接运行即可。

  3. 检查 Pod 状态:
    查看 Pod 是否已经创建并运行:

    bash
    kubectl get pods -l app=nginx

    您应该会看到 3 个 Pod,状态最终会变为 Running

    NAME READY STATUS RESTARTS AGE
    nginx-deployment-abcdefg-hijkl 1/1 Running 0 1m
    nginx-deployment-abcdefg-mnop 1/1 Running 0 1m
    nginx-deployment-abcdefg-qrst 1/1 Running 0 1m

  4. 创建 Service:
    要从外部访问 Nginx Pod,需要创建一个 Service。创建一个名为 nginx-service.yaml 的文件:

    “`yaml
    apiVersion: v1
    kind: Service
    metadata:
    name: nginx-service
    spec:
    selector:
    app: nginx
    ports:
    – protocol: TCP
    port: 80
    targetPort: 80

    可以在这里指定 type,例如 NodePort 或 LoadBalancer (K3s 默认支持 ServiceLB)

    type: NodePort

    type: LoadBalancer

    “`

    为了让外部能够访问,您可以选择 Service 类型。K3s 默认带有 ServiceLB,您可以尝试使用 type: LoadBalancer。如果没有外部 LoadBalancer 提供者,K3s 的 ServiceLB 会将其暴露在一个节点端口上(类似于 NodePort 的行为)。或者直接使用 type: NodePort。我们先使用默认的 ClusterIP,然后通过 Ingress 暴露。

    bash
    kubectl apply -f nginx-service.yaml

    检查 Service 状态:

    bash
    kubectl get svc nginx-service

    您会看到 Service 的 CLUSTER-IPPORT

  5. 通过 Ingress 暴露服务 (使用 K3s 默认的 Traefik):
    因为 K3s 默认安装了 Traefik Ingress Controller,我们可以创建一个 Ingress 资源来将外部请求路由到 nginx-service。创建一个名为 nginx-ingress.yaml 的文件:

    yaml
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    name: nginx-ingress
    annotations:
    ingress.kubernetes.io/router.entrypoints: web # Traefik 特定 annotation,指定入口点
    spec:
    rules:
    - http:
    paths:
    - path: /
    pathType: Prefix # 或 ImplementationSpecific 或 Exact
    backend:
    service:
    name: nginx-service
    port:
    number: 80

    注意:如果您使用的是 K3s 较旧的版本(v1.18 或更早),apiVersion 可能是 extensions/v1beta1networking.k8s.io/v1beta1,并且 annotations 可能不同。这里使用较新的 API 版本。

    bash
    kubectl apply -f nginx-ingress.yaml

    检查 Ingress 状态:

    bash
    kubectl get ingress nginx-ingress

    您应该会看到 Ingress 资源被创建,并且通常会有一个 ADDRESS 列显示 K3s Server 节点的 IP 地址(或者 K3s ServiceLB 提供的地址)。

  6. 访问应用:
    现在,您可以通过访问 K3s Server 节点的 IP 地址来访问 Nginx 服务了。如果您没有配置域名或 DNS,可以直接访问 http://<K3s Server 节点 IP 地址>。默认情况下,Traefik 会监听 80 和 443 端口(如果未被占用)。

    如果您的服务器有防火墙,请确保 80 (或 443) 端口是开放的。您也可以查看 Traefik 的 Pod 日志或 Traefik Dashboard(如果启用)来排查问题。

    至此,您已经在 K3s 集群上成功部署并访问了您的第一个容器化应用!

第六部分:K3s 的一些独特之处和高级话题(简述)

除了基本的安装和使用,了解 K3s 的一些独特配置和功能有助于更深入地利用它。

  • 配置数据库: 默认的 dqlite 适合单节点或简单的 HA。对于更严格的生产 HA 场景,您可以配置 K3s 使用外部 PostgreSQL 或 MySQL/MariaDB 数据库。这需要在安装时通过环境变量或配置文件指定数据库连接信息。
  • 高可用 (HA) 集群: K3s 支持多节点 HA 配置。您可以使用外部数据库(推荐)或嵌入式 dqlite 的集群模式。构建 HA 集群需要多个 Server 节点连接到同一个共享数据库,并且通常需要在这些 Server 节点前放置一个负载均衡器来分发流量到 API Server。Agent 节点则连接到这个负载均衡器的地址。
  • 配置选项: K3s 提供了大量的命令行参数和配置文件 (/etc/rancher/k3s/config.yaml) 来定制其行为,例如更改默认端口、禁用特定组件、配置网络参数、指定容器镜像仓库等。例如,要在 Server 上禁用 Traefik 和 ServiceLB,可以创建 /etc/rancher/k3s/config.yaml 文件:

    yaml
    disable:
    - traefik
    - servicelb

    然后重启 k3s 服务。
    * 网络 (CNI): 虽然默认使用 Flannel,您可以通过 --flannel-backend=none 禁用 Flannel 并在 K3s 安装后手动安装 Calico、Cilium 或其他 CNI 插件。
    * 存储 (CSI): Local Path Provisioner 适合简单场景。对于需要更强大、更灵活的存储方案(如分布式存储、云存储),您需要安装对应的 CSI (Container Storage Interface) 驱动。K3s 完全兼容标准的 CSI 规范。
    * 离线安装: K3s 提供了离线安装的支持,您可以提前下载好 K3s 二进制文件、相关的容器镜像 tar 包以及安装脚本,然后在没有互联网连接的环境中进行安装。这对于边缘计算和 air-gapped 环境非常重要。
    * 自动更新: K3s 提供了一个实验性的自动更新功能,可以通过配置通道来实现指定版本的自动升级,这在边缘设备数量庞大时非常有用。

这些高级特性使得 K3s 不仅适用于入门和测试,也能够满足许多生产环境的需求。当然,构建生产级的 HA 集群或配置复杂的存储/网络仍需要一定的 Kubernetes 知识,但 K3s 极大地简化了基础环境的搭建。

第七部分:K3s 的局限性与何时选择标准 K8s

尽管 K3s 有诸多优点,但它并非万能的,在某些场景下,标准的 Kubernetes 或其他发行版可能更适合:

  1. 移除的组件或功能: K3s 为了轻量化移除了一些组件,虽然大部分用户用不到,但如果您明确依赖于某个被 K3s 移除的 Admission Controller、特定的云服务提供商集成、或者一些实验性/旧的 API,那么 K3s 可能不适合您。
  2. 默认组件的选择: K3s 默认集成的组件(如 Flannel、Traefik、Local Path Provisioner、dqlite)是为通用和简单场景设计的。在大型或复杂的生产环境中,您可能对 CNI、Ingress Controller、Storage 方案、数据库有特定的偏好(例如更成熟的外部 etcd 集群、功能更强大的 Nginx Ingress、企业级存储解决方案)。虽然 K3s 允许您禁用默认组件并安装自己的,但这会增加配置的复杂性,可能不如从头使用 kubeadm 构建或使用对组件选择更灵活的发行版。
  3. 大规模集群: K3s 主要针对小型到中型集群(几十到几百个节点)。虽然理论上可以构建更大规模的集群,但在超大规模场景下,标准 Kubernetes 发行版(特别是云提供商托管的 K8s 服务,如 GKE, EKS, AKS)在控制平面扩展性、管理平面健壮性以及与云基础设施的深度集成方面通常更具优势。
  4. 对特定基础设施的深度依赖: 如果您的应用重度依赖于某个云平台特有的服务(如 AWS EBS CSI、Azure Load Balancer 集成等),并且这些集成未在 K3s 中内置或没有对应的外部插件,那么使用云提供商自己的 K8s 服务可能更直接。
  5. 需要细粒度控制每一个组件: 如果您需要从头到尾完全控制 Kubernetes 的每一个组件、参数和版本,或者需要进行非常底层的定制和调优,那么使用 kubeadm 或手动搭建 Kubernetes 可能更适合您,尽管这需要更高的技术门槛。

总而言之,K3s 是“轻量级”和“易用性”的专家,它在资源受限、需要快速部署、或对运维复杂度敏感的场景下表现卓越。但在需要极致扩展性、对底层组件有特定要求、或重度依赖特定云基础设施的大型复杂生产环境,标准的 Kubernetes 或其他企业级发行版可能更为合适。

结论

K3s 作为一款轻量级、易安装、功能完备且经过认证的 Kubernetes 发行版,极大地降低了 Kubernetes 的使用门槛。它将复杂的安装过程简化为一行命令,将庞大的组件集精简并集成到一个单一二进制文件,并通过嵌入式数据库和默认集成的附加组件提供了开箱即用的体验。

无论您是希望在树莓派上搭建家庭实验室、在笔记本电脑上快速启动本地开发环境、在 CI/CD 流水线中集成轻量级 Kubernetes 测试、还是在边缘设备上部署容器化应用,K3s 都是一个非常出色的选择。它的轻量、快速和简洁特性,使得 Kubernetes 不再仅仅是大型数据中心的专属,而是可以触达更多场景和设备。

通过本文的介绍,相信您对 K3s 有了一个全面的认识,并了解了如何快速开始您的 K3s 之旅。Kubernetes 的世界广阔而精彩,而 K3s 提供了一条通往这个世界的快速通道。现在,是时候亲手尝试一下了!请访问 K3s 官方文档(https://k3s.io/)获取更详细的信息和最新的安装指南,开始您的轻量级 Kubernetes 探索之旅吧!

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部