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

k3s 核心概念指南

K3s高可用-3台K3s控制节点部署+外挂pgsql数据库,

随着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

3. Node(节点)

  • k3s 核心概念 :运行容器的"物理机/虚拟机",k3s 集群由两类节点组成:
    • Server 节点:集群"大脑",负责管理集群(调度 Pod、监控状态、存储配置)。
    • Agent 节点:集群"工人",负责实际运行 Pod 中的容器。
  • 对比 Docker:Docker 仅能在"单台机器"运行容器(该机器相当于"孤立节点"),k3s 可将多台机器组成集群统一管理。

4. Deployment(部署)

  • k3s 核心概念 :Pod 的"自动化管理工具",确保 Pod 按预期运行,核心能力包括:
    1. 维持指定数量的 Pod 副本(如"始终运行 3 个 Nginx Pod")。
    2. 一键更新容器版本(如将 Nginx 从 1.21 升级到 1.25)。
    3. 故障自动回滚(升级失败时恢复到上一稳定版本)。
  • 对比 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)。
  • 对比 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. 最低资源需求:1核CPU + 512MB内存(单机部署),适合低配置设备。
    2. 部署方式:单条命令(curl -sfL https://get.k3s.io | sh -)即可完成服务器部署,5分钟内可启动集群。
  • k8s
    1. 最低资源需求:控制平面建议2核CPU + 4GB内存,节点建议1核CPU + 2GB内存,资源占用高。
    2. 部署方式:需手动配置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 节点(初始化集群)

    基础安装(默认配置):

    bash 复制代码
    curl -sfL https://get.k3s.io | sh -

    自定义配置(如禁用 Traefik、指定数据目录):

    bash 复制代码
    curl -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(集群令牌):

    bash 复制代码
    # 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 -

    返回示例

    plaintext 复制代码
    root@ubuntu:~# cat /var/lib/rancher/k3s/server/node-token
    K102a28c38a37cc242058eaa774d061968b4c59416e3c5e418402bef590e78e568a::server:144b7cb8304c99d03d246b56c3a6ea52

(2)卸载命令

  • Server 节点

    bash 复制代码
    /usr/local/bin/k3s-uninstall.sh
  • Agent 节点

    bash 复制代码
    /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 集群,操作步骤:

  1. 将远程 Server 节点的 k3s.yaml 复制到本地 ~/.kube/config
  2. 修改配置文件中的 server: https://127.0.0.1:6443 为远程 Server 节点的 IP(如 https://192.168.1.100:6443)。
  3. 执行 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 为例)

先更新系统包,确保依赖完整:

bash 复制代码
apt update && apt upgrade -y  # CentOS/RHEL 替换为 yum update -y

3. 安装 k3s(Server 节点,国内加速)

使用国内镜像源安装,避免网络问题,同时指定 Docker 为容器运行时(可选):

bash 复制代码
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \
INSTALL_K3S_MIRROR=cn \
sh -s - \
--docker

3.1 验证安装

查看 k3s 核心组件状态(所有组件状态为 Running 即安装成功):

bash 复制代码
kubectl get pods -n kube-system

4. 配置 kubectl(可选,简化命令)

默认需通过 k3s kubectl 执行命令,配置后可直接用 kubectl

bash 复制代码
# 1. 创建kubectl配置目录
mkdir -p $HOME/.kube
# 2. 复制k3s配置文件到用户目录
sudo cp /etc/rancher/k3s/k3s.yaml $HOME/.kube/config
# 3. 赋予文件读写权限(避免权限报错)
sudo chown $(id -u):$(id -g) $HOME/.kube/config

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 文件,内容如下(含详细注释):

yaml 复制代码
apiVersion: apps/v1  # API版本(Deployment属于apps组v1版本)
kind: Deployment     # 资源类型:Deployment
metadata:
  name: nginx        # Deployment名称
spec:
  replicas: 2        # 运行2个Pod副本(高可用)
  selector:
    matchLabels:     # 选择器:匹配标签为「app: nginx」的Pod
      app: nginx
  template:
    metadata:
      labels:        # Pod标签:与selector.matchLabels对应
        app: nginx
    spec:
      containers:    # 容器配置
      - name: nginx  # 容器名称
        image: nginx:latest  # 容器镜像(使用最新版Nginx)
        ports:
        - containerPort: 80  # 容器内部端口(Nginx默认端口)

5.2 部署 Nginx

执行配置文件创建 Deployment:

bash 复制代码
kubectl apply -f nginx-deployment.yaml

5.3 暴露 Nginx 服务(NodePort 类型)

通过 Service 暴露 Nginx 端口,让外部可访问:

bash 复制代码
kubectl expose deployment nginx \
--type=NodePort \  # 服务类型:NodePort(通过节点IP+端口访问)
--port=80 \        # Service端口
--target-port=80 \ # 映射到容器的端口(与containerPort一致)
--name=nginx-service  # Service名称

5.4 查看 Pod 与 Service 状态

  • 查看 Nginx Pod 状态(确保 STATUS 为 Running):

    bash 复制代码
    kubectl get pods -l app=nginx  # -l 按标签筛选Pod
  • 查看 Service 暴露的端口(重点看 PORT(S) 列的"节点端口",如 80:30567/TCP 中的 30567):

    bash 复制代码
    kubectl get svc nginx-service

5.5 访问 Nginx 测试

在浏览器中输入 http://<节点IP>:<节点端口>(如 http://192.168.87.152:30112),看到 Nginx 欢迎页即成功。

7. 部署 apache2 测试

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: apache2
spec:
  replicas: 2
  selector:
    matchLabels:
      app: apache2
  template:
    metadata:
      labels:
        app: apache2
    spec:
      containers:
        - name: apache2
          image: httpd:latest  
          ports:
            - containerPort: 80

申请创建容器

bash 复制代码
kubectl apply -f apache.deployment.yaml

8.1 查看 Pod 状态

bash 复制代码
kubectl get pods -l app=apache2

创建暴露端口

bash 复制代码
kubectl expose deployment apache2 --type=NodePort --target-port=80 --name=apache2

查看暴露端口

bash 复制代码
kubectl get svc apache2

访问测试

7. 部署 MySQL 8.0 测试

yaml 复制代码
apiVersion: apps/v1
kind: StatefulSet  # MySQL为有状态应用,用StatefulSet部署
metadata:
  name: mysql
spec:
  serviceName: mysql  # 关联的Service名称
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:8.0.28-debian
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "202019"
        - name: MYSQL_DATABASE
          value: "k3s"                # 初始数据库名
        volumeMounts:
        - name: mysql-data
          mountPath: /var/lib/mysql
        args:
        - --default-authentication-plugin=mysql_native_password  # 兼容旧客户端
        - --bind-address=0.0.0.0                                 # 允许所有IP连接
  volumeClaimTemplates:
  - metadata:
      name: mysql-data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 10Gi
---
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  selector:
    app: mysql
  ports:
  - port: 3306
    targetPort: 3306
    nodePort: 30306
  type: NodePort

7.1 查看 Pod 状态

bash 复制代码
kubectl get pods -l app=mysql

7.2 查看服务状态

bash 复制代码
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

在此之前确保我们的主机名不同,或是重命名服务器

bash 复制代码
vim /etc/hosts

===添加以下内容===
127.0.0.1 ubuntu-agent

查看主节点token,我们需要凭借token加入集群

bash 复制代码
sudo cat /var/lib/rancher/k3s/server/node-token

计算节点执行

bash 复制代码
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \
  INSTALL_K3S_MIRROR=cn \
  INSTALL_K3S_VERSION=v1.33.5+k3s1 \
  K3S_URL=https://192.168.87.163:6443 \
  K3S_TOKEN=K102a28c38a37cc242058eaa774d061968b4c59416e3c5e418402bef590e78e568a::server:144b7cb8304c99d03d246b56c3a6ea52 \
  K3S_SKIP_TLS_SAN_VERIFY=true \
  K3S_NODE_NAME=ubuntu-agent \
  sh -s -

主节点视角

相关推荐
zz-zjx4 小时前
云计算产品-介绍--计算篇
阿里云·云计算
wanhengidc6 小时前
物理服务器都有哪些作用?
运维·服务器·安全·智能手机·云计算
网络精创大傻1 天前
在 AWS 上启动您的 AI 代理:Bedrock、Lambda 和 API 网关
人工智能·云计算·aws
观测云1 天前
阿里云 RDS PostgreSQL 可观测最佳实践
阿里云·postgresql·云计算
weixin_307779131 天前
破解遗留数据集成难题:基于AWS Glue的无服务器ETL实践
开发语言·云原生·云计算·etl·aws
xfmtznfl2165pv2 天前
如何验证Conda是否成功切换到阿里云源?
阿里云·云计算·conda
淡忘_cx2 天前
Dify 迁移后常见问题解决方案与使用腾讯云cos上传文件 FILES_URL缺失
云计算·腾讯云
王道长服务器 | 亚马逊云2 天前
AWS + 发财CMS:高效采集站的新形态
服务器·网络·云计算·音视频·aws