Skip to content
🗂️ 文章分类: 云原生  
🏷️ 文章标签: Kubernetes  
📅 文章创建时间: 2026-04-09
🕘️ 文章最后更新时间:2026-04-11

[toc]

K3s笔记1

使用的Linux系统是安装在windows11 wsl2 上的Ubuntu24.04

K3s 介绍

k8s_2026-04-16_164045_674.png

K3s中文官网 https://www.rancher.cn/k3s

K3s 是一个轻量级的 Kubernetes (k8s)发行版,专为边缘计算、物联网等资源受限场景设计。

它保留了 Kubernetes (k8s)的全部核心功能,同时通过裁剪非必要组件、内置依赖、优化资源占用,实现了轻量化部署。

为什么叫K3s ?

Kubernetes 是一个 10 个字母的单词,简写为 K8s。

而 K3s 作为 Kubernetes 的轻量版本,名字来源于 "Kubernetes 一半大小" 的概念(10字母的一半是5字母,Kubernetes → K8s,5字母的单词 → K3s)。

K3s 没有全称,也没有官方的标准发音。

K3s 和 Kubernetes(k8s)的区别

K3s 与 Kubernetes 并非两种不同技术,而是完整版与精简版的关系。

  • 核心功能:K3s 保留了 K8s 的全部核心能力
  • 使用方式:两者在使用层面完全一致(API、命令、YAML 语法相同)
  • 差异点:仅在底层使用的组件、安装方式、使用场景上存在差异

总结:K3s 它保留了 Kubernetes (k8s)的全部核心功能,同时通过裁剪非必要组件、内置依赖、优化资源占用,实现了轻量化部署、一键安装、极低资源消耗。

使用场景对比

场景类型推荐使用原因
企业级大规模生产集群K8s全功能、高度定制、成熟稳定
云厂商托管集群K8s完整的云厂商集成
边缘计算K3s轻量、资源占用低
IoT设备K3s极低资源需求、易于部署
开发测试环境K3s一键安装、快速部署
小型项目K3s简单易用、维护成本低

K3s 和 K8s 技术详细对比

对比维度K8s (标准 Kubernetes)K3s (轻量 Kubernetes)
定位工业级、全功能、可高度定制轻量、极简、开箱即用
发行方CNCF / 谷歌社区Rancher(SUSE)
二进制大小较大(百 MB 级别)< 100MB(超轻量)
内存要求高(至少 2GB+)极低(512MB 可跑)
安装难度复杂(多步、手动配置)极简(1 条命令)
容器运行时需自行安装(containerd/docker)内置 containerd
默认存储独立部署内置 SQLite 代替
网络插件需手动安装(Calico/Flannel)内置 CNI
Ingress网关需手动安装内置 Traefik
DNS需手动部署 CoreDNS内置 CoreDNS
负载均衡需手动配置内置 LoadBalancer
组件数量
高可用原生支持、复杂、成熟支持,但更简单
云厂商集成完整(AWS/GCP/ 阿里云)较少(偏自建)
适合学习不适合(太复杂)最适合入门
生产场景大型集群、核心业务、多节点边缘、IoT、小集群、轻量微服务
命令/YAML标准完整标准完整
学习成本极低

总结

  • K8s = 标准完整版 Kubernetes(企业生产、大规模集群)
  • K3s = 轻量版 Kubernetes(学习、边缘、小集群、IoT)

两者 100% 兼容 API、命令、YAML、概念。差异只在底层裁剪、组件、资源占用、安装方式上。

K8s 和 K3s 节点上的区别

K8s 只有两种节点类型

  • Master 节点:又称控制平面,负责集群管理、调度决策和API服务。一个集群至少 1 个 Master,高可用要 3 个。
  • Worker 节点:又称工作平面,主要负责运行容器化应用。一个集群可以有多个 Worker 节点。每个 Worker 节点上可以运行多个 Pod,每一个pod里面可以包含多个同类型容器。

K3s 只有两种节点类型

  • Server 节点:相当于 K8s 的 Master 节点。
  • Agent 节点:相当于 K8s 的 Worker 节点。

总结:K8s的 Master 节点 = K3s的 Server 节点,K8s的 Worker 节点 = K3s的 Agent 节点。本质完全一样,只是名字换了,职责一模一样

K3s 架构和组件

K3s 相比标准 Kubernetes,采用了精简但功能完整的架构设计,它通过整合和优化组件,实现了轻量级部署。

K3s 架构图

如图是K3s 架构图 k8s_2026-04-13_221943_722.png

K3s 架构优势

  1. 轻量紧凑:所有组件整合到单个二进制文件,体积小于100MB
  2. 简化部署:一键安装,自动配置所有组件
  3. 资源高效:最低仅需512MB内存即可运行
  4. 内置依赖:包含所有必要的组件,无需额外安装
  5. 高度兼容:与标准Kubernetes API完全兼容
  6. 灵活存储:支持多种存储后端,适应不同场景

K3s的架构设计使其成为边缘计算、IoT设备、小型部署的理想选择,同时保持了与标准Kubernetes的完全兼容性。

节点

K3s 架构主要有两种节点。

Server 节点(控制平面节点)

  • 作用:集群的大脑,负责集群管理、调度决策和API服务。
  • 数量:一个完整的K3s集群至少需要 1 个 Server节点,高可用部署需要 3 个或更多。
  • 核心组件:包括 kube-apiserver、kube-scheduler、kube-controller-manager
  • 内置服务:Traefik、CoreDNS、Metrics Server

Agent 节点(工作节点)

  • 作用:负责运行容器化应用
  • 数量:根据需求而定。一个集群可以有多个 Agent 节点,每个节点上可以运行多个 Pod。每一个pod里面可以包含多个同类型容器。
  • 核心组件:kubelet、containerd、kube-proxy、Flannel
  • 内置服务:Local Path Provisioner

K3s 单节点架构

单节点架构是K3s最常见的部署方式,适合开发、测试和小型生产环境:

  • 特点:Server节点和Agent节点运行在同一台机器上
  • 优势:部署简单,资源占用低
  • 适用场景:开发环境、边缘设备、IoT设备

如图所示 k8s_2026-04-13_205331_109.png

K3s 多节点架构(高可用架构)

多节点架构提供更高的可用性和扩展性:

  • 特点:多个Server节点和多个Agent节点,运行在不同的服务器上。
  • 优势:高可用、负载均衡、更好的扩展性
  • 适用场景:生产环境、边缘集群、需要高可用性的场景

如图所示 k8s_2026-04-13_210046_719.png

组件

Server 节点组件

Server 节点(又称 master 主节点或控制平面)是 K3s 集群的核心,包含以下关键组件。

组件功能职责
kube-apiserver整个K3s的入口组件,提供API入口。处理所有API请求、认证授权、资源验证。为集群内组件提供服务发现机制。所有其他组件都只与它通信,不直接互访
kube-scheduler智能调度组件监控Pod状态,评估节点资源和负载情况,为Pod选择最佳运行节点
kube-controller-manager控制管理组件管理副本、节点、端点等控制器
etcd (可选)分布式键值存储存储集群状态和配置(高可用部署时使用)。K3s默认使用SQLite作为存储,仅在高可用部署时推荐使用etcd
k3s-server主进程整合上述核心组件
Traefik内置的Ingress控制器提供路由和负载均衡
CoreDNS内置的DNS服务为集群提供域名解析
Metrics Server监控服务提供资源使用指标,支持HPA等功能

Agent 节点组件

Agent 节点(又称 Worker 工作节点)负责实际运行容器,包含以下组件。

组件功能职责
kubelet节点代理组件管理Pod生命周期、与容器运行时交互
containerd容器运行时拉取镜像、创建和管理容器。提供容器运行环境
Flannel容器网络插件为Pod分配IP、实现Pod之间的网络通信
kube-proxy网络代理组件实现Service负载均衡,处理Pod与Service之间的通信
k3s-agent代理进程负责与Server节点通信
Local Path Provisioner存储服务提供本地存储卷支持

各个组件的通信流程

  1. 用户请求流程

    • 用户通过kubectl命令行工具发送命令
    • 请求到达kube-apiserver组件
    • kube-apiserver组件开始验证请求并处理,然后转发给相关控制器
    • 相关控制器执行相应操作
  2. Pod创建流程

    • kube-apiserver组件接收创建Pod的请求
    • kube-scheduler组件为Pod选择节点
    • kube-apiserver组件通知目标节点的kubelet组件
    • kubelet组件通过containerd容器运行时组件创建容器
    • kubelet组件向kube-apiserver组件报告Pod状态
  3. 服务发现流程

    • Service创建后,CoreDNS组件记录服务信息
    • Pod通过服务名访问其他服务
    • kube-proxy组件维护网络规则实现负载均衡

安装K3s

注意:无论是 Kubernetes 还是K3s都是要安装在Linux操作系统中的。无法直接安装在windows系统上。

在Linux系统中,执行如下命令。下面三个安装命令,根据实际情况选择一个即可。

sh
# 官方标准(最主流)即可一键快速安装 K3s(下载速度慢)
curl -sfL https://get.k3s.io | sh -

# 国内镜像加速(推荐),并安装特定版本的k3s
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn INSTALL_K3S_VERSION=v1.35.2+k3s1 sh -

# 带有配置的安装命令(主要配置了pause镜像的下载地址 和 iptables模式等)
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn INSTALL_K3S_VERSION=v1.35.2+k3s1 sh -s server --pause-image registry.aliyuncs.com/google_containers/pause:3.6 --kube-proxy-arg proxy-mode=iptables

# 验证安装是否成功 ,显示 Ready → 成功 ✅ 
sudo kubectl get node

# 查看 K3s 服务状态,显示 active (running) → 成功 ✅
sudo systemctl status k3s

# 查看各个pod的状态信息,各个pod都显示 Running状态 → 成功 ✅
sudo kubectl get pods -n kube-system

# 查看集群信息
sudo kubectl cluster-info

该命令会自动下载并安装启动 K3s服务,并配置开机自启等。无需手动配置。

如图所示 k8s_2026-04-11_213027_961.png

常见问题与解决方案

各个pods始终无法启动运行(pod 不是Running状态)的问题?

如图所示,一键安装并启动K3s的时候,之后使用sudo kubectl get pods -n kube-system命令查询pod状态,发现各个pod处于ContainerCreating状态。

k8s_2026-04-16_164900_016.png

对于一个正常安装并运行的K3s服务来说。各个pod应该是Running状态,并且都是Ready。

解决方案

① 第一步 查询pod的详细信息,找出问题

sh
# 查询pod的详细信息
$ sudo kubectl describe pods <pod名> -n kube-system

# 例如 查询coredns这个pod的详细信息
$ sudo kubectl describe pods coredns-7566b5ff58-jddcn -n kube-system

# 将会返回pod的详细信息,主要看其中的Events信息。
Name:                 coredns-7566b5ff58-jddcn
Namespace:            kube-system
Priority:             2000000000
Priority Class Name:  system-cluster-critical
Service Account:      coredns
Node:                 desktop-u7n8te2/172.22.111.149
Start Time:           Thu, 16 Apr 2026 15:59:31 +0800
Labels:               k8s-app=kube-dns
                      pod-template-hash=7566b5ff58
............
............
............

Events:
  Type     Reason                  Age                   From               Message
  ----     ------                  ----                  ----               -------
  Normal   Scheduled               13m                   default-scheduler  Successfully assigned kube-system/coredns-7566b5ff58-jddcn to desktop-u7n8te2
  Warning  FailedCreatePodSandBox  13m                   kubelet            Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox "6cc93938aa0ae017638381ecff493db9172b325a5ce8a995f4f133563ca04330": plugin type="flannel" failed (add): failed to load flannel 'subnet.env' file: open /run/flannel/subnet.env: no such file or directory. Check the flannel pod log for this node.
  Warning  FailedCreatePodSandBox  12m                   kubelet            Failed to create pod sandbox: rpc error: code = DeadlineExceeded desc = failed to start sandbox "6b7d045f7671b55042c87c794ec620930ec118a3b5f3ad425415df9c8c69c907": failed to get sandbox image "rancher/mirrored-pause:3.6": failed to pull image "rancher/mirrored-pause:3.6": failed to pull and unpack image "docker.io/rancher/mirrored-pause:3.6": failed to resolve reference "docker.io/rancher/mirrored-pause:3.6": failed to do request: Head "https://registry-1.docker.io/v2/rancher/mirrored-pause/manifests/3.6": dial tcp 104.244.43.35:443: i/o timeout
  ..............
  ..............
  ..............
  Warning  FailedCreatePodSandBox  33s (x18 over 6m45s)  kubelet            (combined from similar events): Failed to create pod sandbox: rpc error: code = Unknown desc = failed to start sandbox "d59979400144b49aa83f123afaf3c46f1b9269fb552dda70200cf48ad8abeee4": failed to get sandbox image "rancher/mirrored-pause:3.6": failed to pull image "rancher/mirrored-pause:3.6": failed to pull and unpack image "docker.io/rancher/mirrored-pause:3.6": failed to resolve reference "docker.io/rancher/mirrored-pause:3.6": failed to do request: Head "https://registry-1.docker.io/v2/rancher/mirrored-pause/manifests/3.6": dial tcp 122.10.85.4:443: connect: connection refused

② 第二步 分析问题

分析Events信息,可以发现主要原因就是国内网络无法访问 Docker Hub → mirrored-pause镜像拉取失败 → Pod 永远卡在 ContainerCreating 状态。

rancher/mirrored-pause:3.6 镜像是 Kubernetes 启动 Pod 必须的 “基础沙箱镜像”。

③ 解决方式 修改K3s的镜像配置,将其换成国内能够访问的。

sh
# 创建 K3s 配置目录
sudo mkdir -p /etc/rancher/k3s

# 写入国内docker镜像配置
sudo tee /etc/rancher/k3s/registries.yaml <<EOF
mirrors:
  docker.io:
    endpoint:
      - https://docker.xuanyuan.me
      - https://docker.1ms.run
      - https://docker.1panel.live
      - https://hub.uuukey.com
      - https://docker.m.daocloud.io
  k8s.gcr.io:
    endpoint:
      - https://registry.aliyuncs.com/google_containers
  gcr.io:
    endpoint:
      - https://registry.aliyuncs.com/google_containers
  quay.io:
    endpoint:
      - https://quay.1panel.live
EOF

# 重启K3
sudo systemctl restart k3s

# 重启查看各个pod的状态信息
sudo kubectl get pods -n kube-system

④ 查询结果

k8s_2026-04-16_165433_926.png

如图,所有pod都已经处于Running状态。

为什么有两个pod的是 Completed 状态?

其中有两个Pod 是 Completed 状态。这两个是 K3s 安装 Traefik 时需要的Job 类型的 Pod(一次性任务),执行完就会自动退出,属于正常现象。完全不影响整个K3s集群运行。

Traefik 真正需要的长期服务是下面这两个 Running 的 Pod:

  • svclb-traefik-xxx(负载均衡代理)
  • traefik-xxx(入口网关本体)

k3s 初次安装K3s后各个Pod的介绍

k8s_2026-04-16_165433_926.png

Pod 名称作用状态说明
coredns-xxxK3s 内置的 DNS 服务,为集群内所有 Pod、Service 提供域名解析,是集群服务发现的核心组件,确保 Pod 之间能通过 Service 名互相通信。Running表示正常运行
helm-install-traefik-crd-xxx用于安装 Traefik 所需的CRD,是 Traefik 能在 K8s 中正常运行的前置依赖。一次性任务。状态 Completed 代表安装成功
helm-install-traefik-xxx在 CRD 安装完成后,执行 Traefik 本身的部署流程,完成 Ingress控制器的初始化。一次性任务。状态 Completed 代表部署成功
local-path-provisioner-xxx提供本地存储卷支持,适合单节点,轻量集群使用。Running表示正常运行
metrics-server-xxx集群监控指标服务,采集资源使用数据Running表示正常运行
svclb-traefik-xxxTraefik 的 Service LoadBalancer 辅助 Pod。Traefik 的负载均衡代理Running表示正常运行
traefik-xxxK3s 默认的 Ingress Controller,作为集群的入口网关,负责将外部 HTTP/HTTPS 请求转发到集群内对应的 Service,实现集群服务的对外暴露。Running表示正常运行

卸载K3s(彻底干净)

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

# 额外清理残留(彻底重装)
sudo rm -rf /etc/rancher 
sudo rm -rf /var/lib/rancher
sudo rm -rf ~/.kube/config

# 验证是否卸载完成。若无输出 → 卸载成功 ✅
which k3s
which kubectl

K3s 入门案例 - 部署Nginx 集群服务

部署一个 Nginx Web 服务,用 K3s 运行,外部可以访问。

① 安装K3s

② 创建部署文件

创建文件 nginx-k3s.yaml。文件内容如下

yaml
# 1. 部署:负责启动并维持 Nginx 容器运行
apiVersion: apps/v1   # 告诉 K3s:我用的是哪个版本的 API
kind: Deployment      # 告诉 K3s:我要创建一个长期服务应用。必须用 Deployment
metadata:               
  name: nginx-deploy    # 给服务应用起名字
spec:
  replicas: 2           # 表示该服务应用会启动 2 个实例
  selector:
    matchLabels:
      app: nginx       # 给该服务应用打标签。标签为nginx
  template:
    metadata:
      labels:
        app: nginx          # Pod 的模板
    spec:
      containers:
      - name: nginx             # 容器名称。一个 Pod 可以有多个容器,必须区分名字。
        image: nginx:alpine     # 容器镜像。
        ports:
        - containerPort: 80     # 容器使用的端口。此处使用 80 端口

---
# 2. 服务的作用是 提供一个固定 IP + 固定端口,自动代理到后端 Pod。相当于负载均衡器 + 稳定入口
apiVersion: v1      # 告诉 K3s:我用的是哪个版本的 API
kind: Service       # 告诉 K3s:创建一个服务
metadata:
  name: nginx-svc       # 起名字
spec:
  type: NodePort        # 相当于在服务器上开一个端口,供外部访问
  selector:             # 作用是 Service 通过标签找到 Pod
    app: nginx          # 找到所有标签为 nginx 的 Pod
  ports:
  - port: 80                # Service 自己的端口
    targetPort: 80          # 容器使用的端口
    nodePort: 30080         # 外部访问端口 30080

文件说明

这个YAML文件定义了两个资源:

  • Deployment:负责运行2个Nginx容器实例
  • Service:负责为这些容器提供网络访问

通过这个配置,Kubernetes会:

  1. 创建2个运行Nginx的Pod
  2. 监控这些Pod的状态,确保始终有2个副本运行
  3. 创建一个服务,将外部请求转发到这些Pod
  4. 在每个节点上开放30080端口,允许外部访问

③ 开始部署(执行命令)

将该文件放到安装有K3s服务的Linux系统中,然后执行下面命令。

这段命令的作用是根据 YAML 文件,创建 Deployment 控制器和 Service服务。

sh
# 若终端与文件是同一目录中,则执行下面命令。否则文件地址需要绝对路径。
# 部署应用
sudo kubectl apply -f nginx-k3s.yaml

# 输出下面,表示部署成功
# deployment.apps/nginx-deploy created
# service/nginx-svc created

④ 验证部署

sh
# 查看部署状态
sudo kubectl get deployments

# 查看 Pod 状态
sudo kubectl get pods

# 查看 Service 状态
sudo kubectl get services

# 查询当前Linux系统的IP地址
hostname -I  或者 ip a

# 访问服务(在浏览器中打开)
# http://<IP地址>:30080

# 查看 Pod 详细信息
sudo kubectl describe pod <pod-name>

# 查看 Service 详细信息
sudo kubectl describe service nginx-svc

# 查看日志
sudo kubectl logs <pod-name>

如果看到Nginx欢迎页面,说明部署成功!

k8s_2026-04-16_173213_063.png

K3s YAML 文件详解

YAML文件的作用

YAML 是Kubernetes(包括K3s)中用于定义和管理资源的配置文件格式。它的核心作用包括:

  1. 资源定义:通过YAML文件定义各种Kubernetes资源(Pod、Deployment、Service等)
  2. 配置管理:集中管理配置信息,实现配置与代码分离
  3. 部署编排:描述应用的部署方式、副本数量、网络配置等
  4. 版本控制:YAML文件可以纳入版本控制系统,实现配置的可追溯性
  5. 声明式配置:只需要描述期望的状态,Kubernetes会自动实现状态转换

YAML文件的基本结构

一个完整的Kubernetes YAML文件通常包含以下部分:

yaml
# 1. API版本
apiVersion: apps/v1  # API版本,不同资源使用不同版本

# 2. 资源类型
kind: Deployment  # 资源类型,如Deployment、Service、Pod等

# 3. 元数据
metadata:
  name: nginx-deploy  # 资源名称
  labels:
    app: nginx  # 标签,用于资源选择

# 4. 规格
spec:
  replicas: 2  # 副本数量
  selector:
    matchLabels:
      app: nginx  # label选择器,用于匹配Pod
  template:
    metadata:
      labels:
        app: nginx  # Pod模板标签
    spec:
      containers:
      - name: nginx  # 容器名称
        image: nginx:alpine  # 容器镜像
        ports:
        - containerPort: 80  # 容器端口

如何编写YAML文件

第一步:确定资源类型和API版本

不同的资源类型对应不同的API版本:

资源类型API 版本
PodapiVersion: v1
DeploymentapiVersion: apps/v1
ServiceapiVersion: v1
ConfigMapapiVersion: v1
SecretapiVersion: v1
IngressapiVersion: networking.k8s.io/v1

第二步:定义元数据

元数据部分包含资源的基本信息:

  • name:资源的唯一名称
  • labels:用于资源选择的标签
  • namespace:资源所属的命名空间(可选)

第三步:编写规格部分

规格部分是YAML文件的核心,定义了资源的具体配置:

  • Pod:定义容器、端口、卷等
  • Deployment:定义副本数、选择器、Pod模板等
  • Service:定义服务类型、端口、选择器等
  • ConfigMap:定义配置数据
  • Secret:定义敏感信息

第四步:多资源定义

一个YAML文件可以包含多个资源定义,使用---分隔:

yaml
# 第一个资源:Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deploy
spec:
  # ...

---

# 第二个资源:Service
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  # ...

为什么要使用YAML文件

前因

在Kubernetes出现之前,容器管理主要依靠命令行工具和脚本,存在以下问题:

  • 配置分散:配置信息分散在各种脚本和命令中
  • 难以版本控制:配置变更无法有效追踪
  • 手动操作复杂:部署和管理需要大量手动操作
  • 环境一致性差:不同环境的配置容易出现差异

后果

使用YAML文件带来了以下好处:

  1. 声明式配置:只描述目标状态,Kubernetes负责实现
  2. 配置集中化:所有配置集中在YAML文件中
  3. 版本控制友好:YAML文件可以纳入Git等版本控制系统
  4. 环境一致性:相同的YAML文件可以在不同环境中使用
  5. 自动化部署:支持CI/CD流水线自动化部署
  6. 可复用性:配置可以被复用和共享

YAML文件的总结

YAML文件是Kubernetes和K3s中管理资源的核心工具,它通过声明式的方式定义了集群中各种资源的期望状态。理解YAML文件的结构和编写方法,对于有效管理Kubernetes集群至关重要。

通过合理编写YAML文件,你可以:

  1. 模块化:将不同功能的配置分离到不同的YAML文件中
  2. 使用标签:合理使用标签组织和管理资源
  3. 版本控制:将YAML文件纳入版本控制系统
  4. 环境分离:为不同环境(开发、测试、生产)创建不同的配置
  5. 配置验证:使用kubectl apply --dry-run验证配置
  6. 注释:添加适当的注释提高可读性
  7. 使用Helm:对于复杂应用,使用Helm管理配置模板

YAML文件不仅是配置工具,更是Kubernetes思想的体现。通过声明式配置实现自动化管理,让容器编排变得更加简单和可靠。

K3s组件安装与资源管理详解

K3s安装后包含的组件

当你安装K3s后,以下组件会被自动安装和启动:

核心组件

  • kube-apiserver:集群的API入口,处理所有API请求
  • kube-scheduler:负责Pod的调度
  • kube-controller-manager:管理各种控制器
  • kubelet:节点代理,管理容器生命周期
  • kube-proxy:网络代理,实现Service的负载均衡
  • containerd:容器运行时,负责容器的创建和管理

内置服务

  • CoreDNS:提供集群内部的DNS服务
  • Traefik:作为Ingress控制器,提供路由功能
  • Metrics Server:提供资源使用指标
  • Local Path Provisioner:提供本地存储卷支持
  • Flannel:容器网络插件,实现Pod间通信

存储

  • SQLite:默认的轻量级存储,适用于单节点部署
  • 可选的外部存储:支持MySQL、PostgreSQL、etcd等

K3s启动的节点

当你安装K3s时,根据安装方式不同,会启动不同类型的节点:

单节点部署

  • Server节点:同时作为控制平面和工作节点
  • Agent节点:在单节点模式下,Server节点同时扮演Agent节点的角色

多节点部署

  • Server节点:负责控制平面功能,至少需要1个,高可用部署需要3个
  • Agent节点:负责运行容器,数量根据需求而定

为什么需要Deployment和Service

Deployment的作用

Deployment是Kubernetes中最常用的控制器,主要作用包括:

  1. 副本管理:确保指定数量的Pod副本运行
  2. 自愈能力:当Pod失败时自动重启或重建
  3. 滚动更新:支持无停机的应用更新
  4. 版本回滚:当更新失败时可以回滚到之前的版本
  5. 扩缩容:根据需求调整Pod数量

为什么需要Deployment?

  • 直接创建Pod时,Pod失败后不会自动重建
  • 无法实现滚动更新和版本回滚
  • 无法方便地进行扩缩容

Service的作用

Service是Kubernetes中用于暴露应用的资源,主要作用包括:

  1. 稳定访问入口:为Pod提供固定的访问地址
  2. 负载均衡:在多个Pod副本之间分配流量
  3. 服务发现:通过服务名实现集群内部的服务发现
  4. 外部访问:通过NodePort、LoadBalancer等方式暴露服务

为什么需要Service?

  • Pod的IP地址是动态的,会随着Pod的创建和销毁而变化
  • 无法直接在集群外部访问Pod
  • 无法在多个Pod副本之间实现负载均衡

完整的应用部署流程

在K3s中部署一个应用的完整流程通常包括以下步骤:

  1. 创建Deployment:定义应用的运行方式、副本数量等
  2. 创建Service:为应用提供稳定的访问入口
  3. 可选:创建Ingress:提供更高级的路由和域名管理
  4. 可选:创建ConfigMap/Secret:管理应用配置

各个组件之间的关系

  • DeploymentPod:Deployment管理Pod的生命周期
  • ServicePod:Service通过标签选择器找到并访问Pod
  • IngressService:Ingress将外部请求路由到Service
  • ConfigMap/SecretPod:为Pod提供配置信息

实际案例分析

Nginx部署流程

  1. 创建Deployment

    • 定义2个Nginx副本
    • 指定容器镜像和端口
    • 配置资源限制
  2. 创建Service

    • 选择NodePort类型,允许外部访问
    • 配置端口映射
    • 通过标签选择器关联到Deployment
  3. 访问服务

    • 通过http://<节点IP>:30080访问Nginx

最佳实践

  1. 使用Deployment管理应用:确保应用的高可用性和可维护性
  2. 为每个应用创建Service:提供稳定的访问方式
  3. 合理使用标签:便于资源管理和选择
  4. 使用命名空间:隔离不同环境的资源
  5. 配置资源限制:避免资源竞争

通过理解这些组件的作用和关系,你可以更有效地管理K3s集群和部署应用。

总结

K3s 作为 Kubernetes 的轻量版本,为边缘计算、IoT 设备和小型部署场景提供了理想的解决方案。它保留了 Kubernetes 的全部核心功能,同时通过优化和精简,实现了更低的资源占用和更简单的部署方式。

对于学习 Kubernetes 的初学者来说,K3s 是一个绝佳的起点。它提供了与标准 Kubernetes 完全相同的使用体验,但配置更简单、资源需求更低,让你能够更快地掌握容器编排的核心概念和实践技能。

在实际使用中,你可以根据具体场景的需求,灵活运用 K3s 的各种特性,构建适合自己的容器化解决方案。