k3s教程:快速搭建生产级Kubernetes集群
在当今的云原生时代,Kubernetes 已成为容器编排的事实标准。然而,部署一个生产级的 Kubernetes 集群,特别是对于资源受限的环境或边缘计算场景,往往意味着复杂的配置和高昂的资源开销。这时,k3s 应运而生,它是一个轻量级、高度可用的 Kubernetes 发行版,专为边缘、IoT、CI/CD 和低资源服务器设计。
本文将详细介绍如何利用 k3s 快速搭建一个生产级的 Kubernetes 集群,并探讨其在生产环境中的最佳实践。
1. 什么是 k3s?为什么选择它?
k3s 是 Rancher Labs 开源的一个精简版 Kubernetes。它的名称来源于 Kubernetes (k8s) 减去 5 个字母 (k3s),寓意其极致的轻量化。
k3s 的核心特性和优势:
- 轻量级: 仅一个二进制文件,大小不足 100MB,内存占用极低。它移除了许多传统 Kubernetes 集群不常用的 Alpha 功能、遗留插件以及非必要的控制器。
- 易于安装和维护: 几分钟内即可启动一个完整的 Kubernetes 集群,安装脚本简单,升级方便。
- 高可用性 (HA): 原生支持嵌入式 etcd3 (基于 SQLite3/PostgreSQL/MySQL) 或外部数据库实现高可用。
- 内置组件: 默认集成了 Traefik (Ingress Controller)、CoreDNS (DNS 服务)、Containerd (容器运行时) 和 Flannel (CNI 插件),开箱即用。
- 安全性: 默认启用 TLS,并提供 FIPS 140-2 认证的加密模块(可选)。
- 边缘友好: 极低的资源需求使其非常适合边缘计算、ARM 设备和小型服务器。
为什么选择 k3s 用于生产?
对于许多生产场景,尤其是边缘站点、小型数据中心、CI/CD 环境或作为开发测试平台,传统 Kubernetes 的复杂性和资源消耗是巨大的负担。k3s 提供了:
- 更快的部署速度: 节省宝贵的部署时间。
- 更低的运营成本: 减少硬件资源和维护人员的投入。
- 简化管理: 专注于应用部署,而非集群本身的管理。
- 高可用性支持: 确保生产环境的稳定运行。
2. 前提条件
在开始安装之前,请确保您的服务器满足以下条件:
- 操作系统: 任何主流 Linux 发行版 (Ubuntu, CentOS, RHEL, openSUSE, Alpine, Raspbian 等)。
- 硬件要求 (最低):
- CPU: 1 核 (推荐 2 核以上)
- 内存: 512MB (推荐 1GB 以上)
- 存储: 5GB (推荐 10GB 以上)
- 网络: 节点之间网络连通。
- 用户权限: 需要
sudo权限来执行安装脚本。
为了实现高可用,您需要至少两个服务器节点(一个作为服务器节点,另一个作为额外的服务器节点或 agent 节点),以及一个外部数据库(如果选择非嵌入式 etcd HA 模式)。
3. k3s 集群安装与配置
k3s 采用主从架构,由一个或多个服务器节点 (server) 和多个工作节点 (agent) 组成。服务器节点运行 Kubernetes API Server、Controller Manager、Scheduler 等核心组件,并管理存储。工作节点运行 Kubelet 和 Containerd,执行容器工作负载。
推荐生产环境部署拓扑:
- HA 配置 with Embedded DB (推荐): 2+ 服务器节点(建议3个)使用嵌入式 SQLite (或外部 MySQL/PostgreSQL),以及 N 个 agent 节点。
- HA 配置 with External DB: 1+ 服务器节点,使用外部数据库(如 PostgreSQL/MySQL),以及 N 个 agent 节点。
3.1 部署第一个 k3s Server (Master)
步骤 1: 安装 k3s Server
登录到您的第一台服务器,执行以下命令:
bash
curl -sfL https://get.k3s.io | sh -
这个命令会下载并执行 k3s 安装脚本,它会:
- 安装
k3s服务。 - 设置
containerd作为容器运行时。 - 配置
kube-proxy和coredns。 - 默认使用
flannel作为 CNI 插件。 - 启动 k3s 服务。
安装完成后,k3s 服务会自动启动。
步骤 2: 验证集群状态
bash
sudo kubectl get nodes
sudo kubectl get pods -A
您应该能看到一个节点处于 Ready 状态,并且核心组件的 Pod 正在运行。
步骤 3: 获取节点 Token (用于加入 Agent 或其他 Server)
在服务器节点上,您需要获取一个用于加入其他节点的 Token。
bash
sudo cat /var/lib/rancher/k3s/server/node-token
请妥善保管这个 Token,它是您的集群密钥。
3.2 部署高可用 k3s Server (第二个及后续 Server)
为了生产环境的稳定性,强烈建议部署至少三个 k3s Server 节点以实现高可用。我们将使用 --cluster-init 和 --server 标志。
选择 HA 数据库方案:
- 嵌入式 SQLite (推荐用于中小规模,无需外部DB): k3s 将使用 SQLite 作为其数据存储,并利用 Dqlite 实现 Raft 共识协议,提供高可用性。这是最简单的高可用设置。
- 外部数据库 (MySQL/PostgreSQL,推荐用于大规模或已有DB): 如果您已经有外部数据库或需要更强大的数据库管理能力,可以选择此方案。
方案 A: 嵌入式 SQLite HA (推荐)
在第一台服务器上 (已经安装):
将第一个 Server 设置为集群的初始化节点。这会创建一个 node-token 并在 /var/lib/rancher/k3s/server/db/ 目录下生成嵌入式数据库文件。
“`bash
停止当前运行的k3s服务
sudo systemctl stop k3s
重新安装并初始化集群 (使用 –cluster-init)
注意:此操作会擦除之前单节点集群的数据,确保是全新部署或可以接受数据丢失
如果你已经有了一个运行的k3s,最好是从头开始用HA方式部署
curl -sfL https://get.k3s.io | sh -s – server –cluster-init
获取 `node-token`:bash
sudo cat /var/lib/rancher/k3s/server/node-token
``192.168.1.100`)。
记录下这个 Token 和第一个 Server 的 IP 地址(例如
在第二台、第三台服务器上:
登录到第二个服务器节点,执行以下命令,替换 K3S_TOKEN 和 K3S_URL:
“`bash
例如,K3S_URL=https://192.168.1.100:6443
curl -sfL https://get.k3s.io | sh -s – server \
–token YOUR_K3S_TOKEN \
–server https://FIRST_SERVER_IP:6443
“`
重复此步骤以加入第三个服务器节点。
方案 B: 外部数据库 HA (以 PostgreSQL 为例)
步骤 1: 准备外部数据库
在外部数据库服务器上创建一个数据库和用户,例如:
sql
CREATE DATABASE k3s;
CREATE USER k3s WITH PASSWORD 'your_secure_password';
GRANT ALL PRIVILEGES ON DATABASE k3s TO k3s;
步骤 2: 部署第一个 k3s Server (连接外部数据库)
登录到第一台服务器,执行以下命令,替换数据库连接信息:
“`bash
PostgreSQL 示例
–datastore-endpoint 参数用于指定外部数据库连接
curl -sfL https://get.k3s.io | sh -s – server \
–datastore-endpoint “postgres://k3s:your_secure_password@DB_HOST:5432/k3s” \
–cluster-init # 初始化集群
“`
步骤 3: 部署第二个及后续 k3s Server (连接外部数据库)
登录到第二个服务器节点,执行以下命令,替换 Token、URL 和数据库连接信息:
“`bash
例如,K3S_URL=https://192.168.1.100:6443 (第一个Server的IP)
curl -sfL https://get.k3s.io | sh -s – server \
–token YOUR_K3S_TOKEN \
–server https://FIRST_SERVER_IP:6443 \
–datastore-endpoint “postgres://k3s:your_secure_password@DB_HOST:5432/k3s”
“`
重复此步骤以加入第三个服务器节点。
3.3 部署 k3s Agent (Worker) 节点
Agent 节点只运行 Kubelet 和 Containerd,不存储集群数据。
登录到您的 Agent 服务器,执行以下命令,替换 K3S_TOKEN 和 K3S_URL (指向任一 Server 节点)。
“`bash
例如,K3S_URL=https://192.168.1.100:6443 (任一Server的IP)
curl -sfL https://get.k3s.io | sh -s – agent \
–token YOUR_K3S_TOKEN \
–server https://ANY_SERVER_IP:6443
“`
重复此步骤以加入所有 Agent 节点。
3.4 验证高可用集群
在任一 k3s Server 节点上执行:
bash
sudo kubectl get nodes
您应该能看到所有服务器和 Agent 节点都处于 Ready 状态。
此外,您可以通过停止一个 Server 节点的服务 (sudo systemctl stop k3s),然后尝试使用 kubectl 命令,如果集群仍然正常工作,则表示高可用性配置成功。
4. 生产级配置最佳实践
4.1 负载均衡器 (Load Balancer)
对于高可用 k3s Server 集群,强烈建议在所有 Server 节点前设置一个外部负载均衡器 (如 Nginx、HAProxy、云服务 LB)。负载均衡器应将流量转发到所有 Server 节点的 6443 端口。这样,您的 K3S_URL 可以指向负载均衡器的 IP/域名,Agent 节点和 kubectl 用户都能通过统一入口访问集群 API,而无需关心哪个 Server 实际在服务。
4.2 存储 (Storage)
k3s 默认不提供持久化存储解决方案,这对于生产应用是必需的。您需要部署一个 StorageClass。常见的选择包括:
- NFS Provisioner: 简单易用,适合小型或测试环境。
- Longhorn: Rancher 开源的分布式块存储,基于 Kubernetes 构建,功能强大,适合生产。
- Ceph/Rook: 成熟的开源分布式存储,通过 Rook 部署在 Kubernetes 上。
- 云提供商 CSI 驱动: 如果在公有云上运行,使用云提供商提供的 CSI 驱动 (如 AWS EBS CSI, Azure Disk CSI, GCP PD CSI)。
安装示例 (以 Longhorn 为例):
“`bash
kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/master/deploy/longhorn.yaml
等待Longhorn Pods 启动,然后设置Longhorn为默认StorageClass
kubectl patch storageclass longhorn -p ‘{“metadata”: {“annotations”:{“storageclass.kubernetes.io/is-default-class”:”true”}}}’
“`
4.3 网络 (Networking)
k3s 默认使用 Flannel 作为 CNI 插件。对于更高级的网络需求,您可以考虑其他 CNI:
- Calico: 提供网络策略、BGP 等高级功能,适合需要精细网络控制的生产环境。
- Cilium: 基于 eBPF,提供高性能网络、网络策略和可观测性。
更改 CNI 插件需要在安装 k3s Server 时指定,例如禁用默认 Flannel:
“`bash
curl -sfL https://get.k3s.io | sh -s – server –flannel-backend=none –cluster-init
然后手动安装 Calico 或 Cilium
“`
4.4 监控与日志 (Monitoring & Logging)
生产环境需要完整的监控和日志系统。
- 监控: 部署 Prometheus 和 Grafana。您可以考虑使用
kube-prometheus-stackHelm chart。 - 日志: 部署 EFK (Elasticsearch, Fluentd, Kibana) 或 Loki + Promtail + Grafana 栈。
4.5 备份与恢复 (Backup & Restore)
对于生产环境,数据备份至关重要。
- 外部数据库 HA 模式: 直接备份您的外部 PostgreSQL/MySQL 数据库。
- 嵌入式 SQLite HA 模式: k3s 提供了内置的备份机制。您可以定期备份
/var/lib/rancher/k3s/server/db/目录下的 SQLite 文件。 - Velero: 用于备份和恢复 Kubernetes 集群资源和持久卷。
4.6 安全性 (Security)
- 防火墙: 配置防火墙,只开放必要的端口 (6443 for API, 80/443 for Ingress, CNI 插件所需端口)。
- RBAC: 遵循最小权限原则,为用户和应用配置合适的 RBAC 策略。
- 镜像安全: 使用经过扫描的受信容器镜像。
- 定期更新: 及时更新 k3s 和操作系统,修补安全漏洞。
4.7 升级 (Upgrades)
k3s 提供了简单的升级机制。通常只需运行相同或更新版本的安装脚本即可。对于 HA 集群,需要按照滚动升级的策略,一次升级一个 Server 节点。
“`bash
在每个Server或Agent节点上执行
curl -sfL https://get.k3s.io | sh –
或者指定版本
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.28.5+k3s1 sh –
“`
5. 总结
k3s 提供了一个快速、轻量且高可用的 Kubernetes 解决方案,非常适合边缘计算、资源受限的环境以及需要快速部署和简化管理的场景。通过结合外部负载均衡器、持久化存储、监控日志和健全的备份策略,k3s 完全能够胜任生产级工作负载。
希望这篇教程能帮助您快速搭建和管理一个高效的 k3s 生产级 Kubernetes 集群!