K3s-基础:基础概念、单机部署、集群化部署-Docker-运行配置与安装笔记

K3s-基础:基础概念、单机部署、集群化部署-Docker-运行配置与安装笔记
28.7的博客k3s 核心概念指南
随着Kubernetes技术的发展,越来越多的开发者和运维人员开始接触和使用Kubernetes。但对于资源受限的环境,传统的Kubernetes部署显得过于复杂和资源密集。K3s,作为一个轻量级的Kubernetes发行版,为这些场景提供了完美的解决方案。本教程将带领K3s新手一步步搭建自己的Kubernetes集群。
K3s是Rancher Labs开发的轻量级Kubernetes发行版,专为边缘计算、IoT和小型部署环境设计。它通过减少资源消耗和简化安装流程,使得在单机或少数几台机器上快速部署Kubernetes成为可能。
一、k3s 与 Docker 的核心区别
Docker 与 k3s 的定位不同,前者聚焦“单节点容器运行”,后者聚焦“多节点容器集群管理”,核心差异可概括为:
- Docker:像「单个快递员」,仅负责在单台机器上打包、运行容器(如 Nginx、MySQL 容器),无法跨机器管理。
- k3s:像「快递公司调度系统」,可管理多台机器(节点) 上的容器,负责任务分配、故障重启、高可用保障,让多容器协同工作并保持稳定。
二、k3s 关键概念(对比 Docker)
k3s 基于 Kubernetes 精简而来,核心概念围绕“集群管理”设计,与 Docker 的单节点逻辑差异显著:
1. 容器(Container)
- Docker 中:容器是独立运行的应用打包单元,通过
docker run nginx直接启动,是 Docker 的核心操作对象。 - k3s 中:容器仍是应用运行载体,但不允许直接管理,必须封装到“Pod”中才能部署(类比:Docker 直接指挥“快递员”,k3s 先把“快递员”编为“小组”再指挥)。
2. Pod(豆荚)
- k3s 核心概念:k3s 最小部署单元,可包含 1 个或多个“关系紧密”的容器(如“应用容器 + 日志收集容器”)。
同一 Pod 内的容器共享网络和存储(类比:小组共用一张办公桌和电话)。 - 对比 Docker:Docker 直接运行单个容器(
docker run),k3s 必须通过 Pod 部署容器,示例:- Docker 启动 Nginx:
docker run nginx - k3s 启动 Nginx:先定义 Pod 配置文件(如 pod.yaml),再执行
k3s kubectl apply -f pod.yaml。
- Docker 启动 Nginx:
3. Node(节点)
- k3s 核心概念:运行容器的“物理机/虚拟机”,k3s 集群由两类节点组成:
- Server 节点:集群“大脑”,负责管理集群(调度 Pod、监控状态、存储配置)。
- Agent 节点:集群“工人”,负责实际运行 Pod 中的容器。
- 对比 Docker:Docker 仅能在“单台机器”运行容器(该机器相当于“孤立节点”),k3s 可将多台机器组成集群统一管理。
4. Deployment(部署)
- k3s 核心概念:Pod 的“自动化管理工具”,确保 Pod 按预期运行,核心能力包括:
- 维持指定数量的 Pod 副本(如“始终运行 3 个 Nginx Pod”)。
- 一键更新容器版本(如将 Nginx 从 1.21 升级到 1.25)。
- 故障自动回滚(升级失败时恢复到上一稳定版本)。
- 对比 Docker:Docker 需手动执行
docker run多次创建多副本,容器挂了需手动重启;k3s 可通过 Deployment 全自动管理。
5. Service(服务)
- k3s 核心概念:Pod 的“稳定访问入口”。
因 Pod 可能重启(IP 变化)或被调度到其他节点(IP 变化),直接访问 Pod IP 不稳定。Service 类似“固定前台电话”,无论 Pod 如何变动,都能通过 Service 找到目标 Pod。 - 对比 Docker:Docker 通过
docker run -p 8080:80 nginx映射端口,容器重启后需重新配置;k3s Service 自动跟踪 Pod 变化,访问入口始终可用。
6. Namespace(命名空间)
- k3s 核心概念:集群内的“资源隔离工具”,可将集群划分为多个“虚拟子集群”,示例:
- dev 命名空间:存放开发环境的 Pod/Service。
- prod 命名空间:存放生产环境的 Pod/Service。
不同命名空间的资源互不干扰,便于权限管理和环境隔离。
- 对比 Docker:Docker 无类似功能,所有容器共享单节点资源,需手动通过网络/存储隔离(操作复杂)。
7. k3s 服务管理(systemctl 命令)
- k3s 中:k3s 以系统服务形式运行,Server/Agent 节点的服务名不同:
- Server 节点:服务名 k3s(如
systemctl start k3s)。 - Agent 节点:服务名 k3s-agent(如
systemctl start k3s-agent)。
- Server 节点:服务名 k3s(如
- 对比 Docker:与 Docker 服务管理逻辑一致,Docker 服务名通常为 docker(如
systemctl start docker)。
k3s是轻量级 Kubernetes 发行版,核心差异在于为边缘计算、小集群场景做了极致简化,而k8s是完整版,面向企业级大规模生产环境。
1. 目标场景与定位
两者的设计初衷完全不同,这是所有差异的根源。
- k3s:聚焦轻量化场景,如边缘计算设备(路由器、物联网设备)、单机/小集群(3-5节点)、开发测试环境、CI/CD流水线。
- k8s(标准Kubernetes):面向企业级生产环境,用于大规模集群(数十到数千节点)、复杂业务部署(微服务、高并发应用),追求功能全面性和稳定性。
2. 架构与组件简化
k3s通过合并、替换组件大幅降低复杂度,k8s则组件独立且完整。
| 对比维度 | k3s | k8s(标准版) |
|---|---|---|
| 核心组件合并 | 控制平面组件(API Server、Controller Manager等)打包成单个二进制文件,减少进程数量 | 控制平面组件独立部署(多进程),需单独维护 |
| 默认存储 | 用轻量级的SQLite作为默认存储,无需额外部署etcd | 依赖etcd(需单独部署,需3/5节点保证高可用) |
| 附加工具整合 | 内置容器网络(Flannel)、Ingress(Traefik)、CSI存储,开箱即用 | 需手动部署或集成第三方网络、Ingress、存储插件 |
| 节点通信 | 支持通过“server-agent”模式简化节点注册,无需手动配置证书 | 需手动配置节点与控制平面的证书、网络通信 |
3. 资源占用与部署难度
k3s对硬件要求极低,部署速度远快于k8s。
- k3s:
- 最低资源需求:1核CPU + 512MB内存(单机部署),适合低配置设备。
- 部署方式:单条命令(
curl -sfL https://get.k3s.io | sh -)即可完成服务器部署,5分钟内可启动集群。
- k8s:
- 最低资源需求:控制平面建议2核CPU + 4GB内存,节点建议1核CPU + 2GB内存,资源占用高。
- 部署方式:需手动配置etcd、证书、网络等,或依赖工具(如kubeadm、kops),部署流程复杂,耗时较长。
4. 功能完整性
k3s默认移除部分不常用功能以简化,k8s功能全面无删减。
- k3s:默认禁用或移除部分企业级功能,如PodSecurityPolicy(已废弃)、NodeRestriction、部分alpha/beta特性,需手动开启。
- k8s:包含全部官方功能,支持alpha/beta特性(需配置)、完整的RBAC权限控制、节点亲和性/反亲和性等复杂调度策略,满足生产环境的复杂需求。
选择建议
- 选k3s:如果你需要在边缘设备部署、搭建小型测试集群,或追求快速部署、低资源占用。
- 选k8s:如果你需要搭建企业级生产集群、运行大规模复杂业务,或依赖k8s的完整功能(如高级调度、全量权限控制)。
三、k3s 常用命令(分类整理)
k3s 兼容 Kubernetes 核心命令,同时新增自身服务管理命令,按“服务管理、安装卸载、集群操作”分类如下:
1. k3s 服务管理(Server/Agent 节点)
通过 systemctl 管理 k3s 服务生命周期,适用于启动、停止、查看状态等操作:
| 命令 | 用途 | 备注 |
|---|---|---|
| sudo systemctl start k3s | 启动 k3s Server 服务 | 仅 Server 节点使用 |
| sudo systemctl stop k3s | 停止 k3s Server 服务 | 仅 Server 节点使用 |
| sudo systemctl restart k3s | 重启 k3s Server 服务 | 仅 Server 节点使用 |
| sudo systemctl status k3s | 查看 k3s Server 运行状态 | 可查看是否正常启动、报错信息 |
| sudo systemctl enable k3s | 设置 k3s Server 开机自启 | 避免重启机器后手动启动 |
| sudo systemctl disable k3s | 关闭 k3s Server 开机自启 | 仅需临时使用时配置 |
| sudo systemctl start k3s-agent | 启动 k3s Agent 服务 | 仅 Agent 节点使用,替换 k3s 为 k3s-agent 即可 |
2. k3s 安装与卸载
(1)安装命令
Server 节点(初始化集群):
基础安装(默认配置):1
curl -sfL https://get.k3s.io | sh -
自定义配置(如禁用 Traefik、指定数据目录):
1
2
3curl -sfL https://get.k3s.io | sh -s - \
--disable=traefik \ # 禁用内置的Traefik ingress控制器
--data-dir /var/lib/my-k3s # 指定k3s数据存储目录Agent 节点(加入集群):
需先获取 Server 节点的 K3S_URL(API 地址)和 K3S_TOKEN(集群令牌):1
2
3
4
5
6# 1. 在Server节点获取令牌:cat /var/lib/rancher/k3s/server/node-token
# 2. 替换<server-ip>和<token>后执行:
curl -sfL https://get.k3s.io | \
K3S_URL=https://<server-ip>:6443 \
K3S_TOKEN=<token> \
sh -返回示例
1
2root@ubuntu:~# cat /var/lib/rancher/k3s/server/node-token
K102a28c38a37cc242058eaa774d061968b4c59416e3c5e418402bef590e78e568a::server:144b7cb8304c99d03d246b56c3a6ea52
(2)卸载命令
- Server 节点:
1
/usr/local/bin/k3s-uninstall.sh
- Agent 节点:
1
/usr/local/bin/k3s-agent-uninstall.sh
3. 集群与资源操作(兼容 kubectl)
k3s 内置 kubectl 工具,可通过 k3s kubectl 操作集群(配置环境变量后可简化为 kubectl),核心命令如下:
(1)集群基础信息
| 命令 | 用途 |
|---|---|
| k3s kubectl cluster-info | 查看集群基本信息(API 地址、核心组件状态) |
| k3s kubectl get nodes | 查看集群节点列表(状态、角色、版本) |
| k3s kubectl get nodes -o wide | 查看节点详细信息(IP、容器运行时、内核版本) |
| k3s kubectl describe node <节点名> | 查看单个节点详情(资源使用、标签、污点) |
(2)Pod 操作
| 命令 | 用途 |
|---|---|
| k3s kubectl get pods | 查看当前命名空间的 Pod 列表(默认 default 命名空间) |
| k3s kubectl get pods -n <命名空间> | 查看指定命名空间的 Pod(如 -n kube-system 查看系统组件) |
| k3s kubectl get pods –all-namespaces | 查看所有命名空间的 Pod |
| k3s kubectl describe pod <Pod名> | 查看单个 Pod 详情(事件、容器配置、挂载存储) |
| k3s kubectl logs <Pod名> | 查看 Pod 日志(默认查看第一个容器) |
| k3s kubectl logs <Pod名> -f | 实时跟踪 Pod 日志(类似 tail -f) |
| k3s kubectl delete pod <Pod名> | 删除指定 Pod(Deployment 管理的 Pod 会自动重建) |
(3)Service 操作
| 命令 | 用途 |
|---|---|
| k3s kubectl get svc | 查看当前命名空间的 Service 列表 |
| k3s kubectl get svc -n <命名空间> | 查看指定命名空间的 Service |
| k3s kubectl describe svc <Service名> | 查看 Service 详情(端口映射、后端 Pod 列表) |
| k3s kubectl expose deployment <部署名> –type=NodePort –port=80 –target-port=80 –name=<Service名> | 从 Deployment 创建 NodePort 类型的 Service(暴露端口供外部访问) |
(4)Deployment 操作
| 命令 | 用途 |
|---|---|
| k3s kubectl get deploy | 查看当前命名空间的 Deployment 列表 |
| k3s kubectl get deploy -n <命名空间> | 查看指定命名空间的 Deployment |
| k3s kubectl apply -f <YAML文件> | 通过 YAML 文件创建/更新 Deployment(如 nginx-deployment.yaml) |
| k3s kubectl delete -f <YAML文件> | 通过 YAML 文件删除 Deployment |
| k3s kubectl scale deploy <部署名> –replicas=<数量> | 调整 Deployment 的 Pod 副本数(如 –replicas=3 扩容到 3 个副本) |
(5)其他常用操作
| 命令 | 用途 |
|---|---|
| k3s kubectl get ns | 查看所有命名空间 |
| k3s kubectl create ns <命名空间名> | 创建新命名空间(如 kubectl create ns dev) |
| k3s kubectl get configmaps | 查看当前命名空间的 ConfigMap(存储配置信息) |
| k3s kubectl get secrets | 查看当前命名空间的 Secret(存储敏感信息,如密码) |
| k3s kubectl top nodes | 查看节点资源使用情况(CPU/内存使用率) |
| k3s kubectl top pods | 查看 Pod 资源使用情况(CPU/内存使用率) |
4. 配置文件相关
k3s 集群配置文件默认路径:/etc/rancher/k3s/k3s.yaml
若需通过本地 kubectl 连接远程 k3s 集群,操作步骤:
- 将远程 Server 节点的 k3s.yaml 复制到本地
~/.kube/config。 - 修改配置文件中的
server: https://127.0.0.1:6443为远程 Server 节点的 IP(如https://192.168.1.100:6443)。 - 执行
kubectl cluster-info验证连接。
四、k3s 实操:安装与 Nginx 测试
1. 系统要求
确保 Linux 服务器满足以下基础条件:
- 硬件:至少 1GB 内存、1 个 CPU 核心(生产环境建议 2GB+ 内存、2 核+ CPU)。
- 架构:支持 x86_64、ARMv7 或 ARM64(如树莓派 4B 可安装 ARM64 版本)。
- 环境:未占用容器运行时(k3s 内置轻量级运行时,无需提前安装 Docker,若需用 Docker 需额外配置)。
2. 环境准备(以 Debian/Ubuntu 为例)
先更新系统包,确保依赖完整:
1 | apt update && apt upgrade -y # CentOS/RHEL 替换为 yum update -y |
3. 安装 k3s(Server 节点,国内加速)
使用国内镜像源安装,避免网络问题,同时指定 Docker 为容器运行时(可选):
1 | curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \ |
3.1 验证安装
查看 k3s 核心组件状态(所有组件状态为 Running 即安装成功):
1 | kubectl get pods -n kube-system |
4. 配置 kubectl(可选,简化命令)
默认需通过 k3s kubectl 执行命令,配置后可直接用 kubectl:
1 | # 1. 创建kubectl配置目录 |
5. 部署 Nginx 测试
通过 Deployment 部署 Nginx,并暴露端口供外部访问。
5.1 创建 Deployment 配置文件
5.1.1 常见的资源类型
| 资源名称(Resource) | 核心用途 | 关键特点 | 典型场景 |
|---|---|---|---|
| StatefulSet | 部署有状态应用 | 1. Pod有固定名称和网络标识(DNS),重建后不变; 2. 支持稳定持久化存储(每个Pod对应独立存储卷); 3. 按顺序部署/删除Pod,保证状态一致 |
MySQL主从集群、ZooKeeper、Elasticsearch |
| DaemonSet | 确保指定节点运行相同Pod | 1. 所有目标节点(或指定节点)必运行一个Pod; 2. 新增节点自动创建Pod,删除节点自动清理Pod |
日志收集(Fluentd、Logstash)、监控代理(Prometheus Node Exporter)、网络插件(Calico、Flannel节点代理) |
| Job | 运行一次性任务 | 1. 任务完成后Pod自动终止,状态变为Completed; 2. 支持配置失败重试次数 |
数据备份、批量计算 |
| CronJob | 定时执行周期性任务 | 1. 基于Job扩展,支持类似Linux cron的时间规则; 2. 按预设时间重复执行任务 |
定时数据备份、日志清理、周期性报表生成 |
| ReplicaSet | 维护指定数量的Pod副本 | 1. 确保集群中始终有N个Pod运行; 2. 是Deployment的底层依赖,通常不直接使用 |
配合Deployment管理无状态应用副本(不单独使用) |
| Pod | 容器的基础封装单位 | 1. K8s最小资源单位,可包含多个容器; 2. 直接创建的Pod重启后可能换节点,IP会变化 |
临时测试场景(不推荐用于正式业务,需通过工作负载间接管理) |
| ReplicationController | 早期管理Pod副本的资源 | 1. 功能类似ReplicaSet,用于维护Pod副本数量; 2. 现已被ReplicaSet替代,功能更弱 |
legacy旧集群兼容场景(建议优先用ReplicaSet或Deployment) |
新建 nginx-deployment.yaml 文件,内容如下(含详细注释):
1 | apiVersion: apps/v1 # API版本(Deployment属于apps组v1版本) |
5.2 部署 Nginx
执行配置文件创建 Deployment:
1 | kubectl apply -f nginx-deployment.yaml |
5.3 暴露 Nginx 服务(NodePort 类型)
通过 Service 暴露 Nginx 端口,让外部可访问:
1 | kubectl expose deployment nginx \ |
5.4 查看 Pod 与 Service 状态
查看 Nginx Pod 状态(确保 STATUS 为 Running):
1
kubectl get pods -l app=nginx # -l 按标签筛选Pod
查看 Service 暴露的端口(重点看 PORT(S) 列的“节点端口”,如 80:30567/TCP 中的 30567):
1
kubectl get svc nginx-service
5.5 访问 Nginx 测试
在浏览器中输入 http://<节点IP>:<节点端口>(如 http://192.168.87.152:30112),看到 Nginx 欢迎页即成功。
7. 部署 apache2 测试
1 | apiVersion: apps/v1 |
申请创建容器
1 | kubectl apply -f apache.deployment.yaml |
8.1 查看 Pod 状态
1 | kubectl get pods -l app=apache2 |
创建暴露端口
1 | kubectl expose deployment apache2 --type=NodePort --target-port=80 --name=apache2 |
查看暴露端口
1 | kubectl get svc apache2 |
访问测试
7. 部署 MySQL 8.0 测试
1 | apiVersion: apps/v1 |
7.1 查看 Pod 状态
1 | kubectl get pods -l app=mysql |
7.2 查看服务状态
1 | kubectl get svc mysql |
远程连接成功
8.0 部署集群
| 服务器 | IP | 角色 |
|---|---|---|
| Ubuntu 22.0.4 | 192.168.87.163 | Controller |
| Ubuntu 22.0.4 | 192.168.87.165 | Worker |
在此之前确保我们的主机名不同,或是重命名服务器
1 | vim /etc/hosts |
查看主节点token,我们需要凭借token加入集群
1 | sudo cat /var/lib/rancher/k3s/server/node-token |
计算节点执行
1 | curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \ |
主节点视角











