Skip to content

零基础入门与集群原理

版本: K3s v1.35.4+k3s1 | Rancher Prime 管理 集群: 3 Master + 1 Worker 最后更新: 2026-08-31 前置要求: 会基本 Linux 命令 (ssh / vi / curl), 不需要任何 Kubernetes 基础


目录


1. 十分钟搞懂这些名词

刚接触这套东西,最容易被一堆名词绕晕。先用人话解释:

名词一句话解释
Kubernetes (K8s)容器编排系统,负责把一堆容器(应用)自动部署、扩缩容、自愈到一组机器上
K3sSUSE/Rancher 出品的轻量级 K8s 发行版。功能与标准 K8s 兼容,但单个二进制文件、内存占用小一半以上,适合边缘和小集群
v1.35.4+k3s1K3s 的版本号。前半段 v1.35.4 表示对应的 Kubernetes 版本,k3s1 是 K3s 自己的补丁号
Rancher一个 Web 管理平台,装在某个 K8s 集群里,用浏览器统一管理多个 K8s/K3s 集群:看资源、发应用、管权限
Rancher PrimeRancher 的企业版发行版(SUSE 官方维护),镜像经过加固签名、附带商业支持和扩展目录,功能界面与开源 Rancher 基本一致
Master / Server集群的"大脑"节点,运行 API 服务和数据库 (etcd)。K3s 官方叫法是 Server
Worker / Agent集群的"干活"节点,真正运行你的业务容器。K3s 官方叫法是 Agent
etcd集群的数据库,存所有资源的配置和状态。丢了它集群就"失忆"了,所以要备份
纳管 / 导入 (Import)把一个已存在的集群注册到 Rancher,让 Rancher 能看到并管理它

它们的关系一图看懂:

┌────────────────────────────────────────────────────────────┐
│                    Rancher Prime (管理平面)                  │
│   浏览器 UI / 用户权限 / 多集群管理 / 应用商店 / 监控告警        │
└─────────────┬──────────────────────┬──────────────────────┘
              │ 管理                  │ 管理
      ┌───────▼───────┐       ┌──────▼────────┐
      │  其他集群      │       │  本手册的集群   │
      │ (RKE2/EKS...) │       │  K3s v1.35.4  │
      └───────────────┘       │  3M + 1W      │
                              └───────────────┘

本手册的故事线:一套 K3s 集群(3 台 Master + 1 台 Worker)负责跑业务, Rancher Prime 作为统一管理平台,通过 Web UI 来管理这套集群。


2. Kubernetes 核心概念速览

不需要背,先混个脸熟,后面 UI 操作时会反复遇到。

概念是什么类比
Node一台加入集群的机器一台服务器
PodK8s 最小调度单位,包一个或多个容器一个"应用进程"
Deployment声明"我要 N 个某镜像的副本",自动保持数量并支持滚动升级应用的托管管家
Service给一组 Pod 一个固定访问入口(ClusterIP / NodePort / LoadBalancer)应用的固定门牌号
Ingress按域名/路径把外部 HTTP 流量路由到 ServiceNginx 反向代理规则
Namespace集群内的逻辑隔离分区文件夹
ConfigMap / Secret配置 / 敏感信息(密码、证书)与镜像解耦配置文件 / 保险箱
PV / PVC / StorageClass持久存储:PV 是盘,PVC 是申请,StorageClass 是自动供给策略磁盘 / 磁盘申请单
kubeconfig访问集群 API 的凭证文件(含地址、证书)门禁卡
RBAC基于角色的权限控制(谁能对哪个 Namespace 做什么)权限系统
Label / Selector资源标签与筛选器,Service 靠它找到 Pod便签 + 过滤器

💡 零基础提示:前两周只需要牢记 Pod、Deployment、Service、Ingress、Namespace 这 5 个词,其余用到再查。


3. Rancher Prime 是什么

3.1 定位

Rancher Prime 是 SUSE 提供的企业级 Kubernetes 管理平台(Rancher 的官方加固发行版), 核心能力:

  • 多集群统一管理:一个 UI 纳管任意数量的 K8s / K3s / RKE2 / 托管集群 (EKS、GKE、AKS)。
  • 统一认证与授权:对接 LDAP / OIDC / GitHub 等,集中管理用户和集群权限。
  • 应用商店 (Charts):一键安装 Prometheus 监控、日志、备份、PaaS 等组件。
  • 集群生命周期:创建、升级、备份、证书轮换都能在 UI 完成。

3.2 与开源 (社区版) Rancher 的区别

对比项开源 RancherRancher Prime
支持社区SUSE 商业订阅支持
镜像来源Docker Hub 等registry.rancher.com (签名加固镜像)
Helm 仓库releases.rancher.comcharts.rancher.io
扩展目录基础Prime 专属扩展 (更多认证插件与功能)
安全性常规镜像签名、SBOM、加固基线
界面功能基本一致基本一致 (本手册 UI 讲解两者通用)

⚠️ 气隙环境注意:Prime 镜像默认从 registry.rancher.com 拉取, 内网部署前需要先把镜像同步到 Harbor(参考 ../sync-images.sh 的做法, 以及 Rancher 气隙部署手册)。

3.3 版本号怎么看

登录 Rancher Prime 后,点左上角菜单 → About,可以看到形如 v2.1x.x 的版本。 Prime 的版本号与 Rancher 大版本对齐,UI 布局在不同版本间高度一致, 本手册的操作在 v2.8+ 版本均适用(个别菜单位置略有差异,文中会提示)。

4. 本集群架构原理 (3 Master + 1 Worker)

4.1 K3s 的两种进程

K3s 把所有控制面组件打包进一个二进制文件 k3s,按启动参数分化为两种角色:

角色进程包含的组件职责
Server (Master)k3s serverkube-apiserver、kube-scheduler、kube-controller-manager、内嵌 etcd、Flannel、Traefik、CoreDNS、ServiceLB 等集群大脑:接收所有请求、调度决策、保存状态
Agent (Worker)k3s agentkubelet、containerd、kube-proxy集群手脚:接收指令,在本机拉起/销毁容器

与标准 K8s(kubeadm)最大的不同:标准 K8s 每个组件是独立的容器/进程, K3s 全部塞进一个进程,所以轻量、启动快(< 30 秒)。

4.2 本集群拓扑

   kubectl / Rancher UI / 客户端


   ┌─────────────────────┐
   │ API VIP .43:6443    │  ← 建议: keepalived/自研 VIP 漂移
   └────┬────┬────┬──────┘
        ▼    ▼    ▼
   ┌────────┐┌────────┐┌────────┐     内嵌 etcd 集群
   │ .38 M1 ││ .39 M2 ││ .40 M3 │     (3 成员, 互相同步)
   │ server ││ server ││ server │◄───► etcd: 2379/2380
   └───┬────┘└───┬────┘└───┬────┘     (仅本机/节点间)
       │         │         │
       │   apiserver 6443  │
       └─────────┼─────────┘

           ┌──────────┐
           │ .41 W1   │  k3s agent: kubelet + containerd
           │ worker   │  业务 Pod 运行在这里
           └──────────┘
  • 3 台 Server 都运行完整的控制面,任何一台都能响应 API 请求
  • Agent(Worker)只连接 Server 的 6443 端口获取指令;
  • 客户端(kubectl、Rancher)建议走 VIP,VIP 漂移到当前健康的 Master 上。

4.3 内嵌 etcd 与法定人数 (Quorum) —— 为什么要 3 个 Master

K3s HA 模式下使用内嵌 etcd(无需单独部署 etcd 集群),3 个 Server 自动组成 etcd 集群。etcd 使用 Raft 协议,写入必须获得多数派(过半)确认

etcd 节点数法定人数 (多数派)可容忍故障数说明
110单点,挂了集群只读/不可写
220⚠️ 比 1 个还糟,一台挂就失多数派
321✅ 本集群:挂 1 台 Master 仍正常
532更大规模才需要

结论

  • 3 台 Master 挂掉任意 1 台,etcd 仍有 2 台 ≥ 法定人数 2,集群照常工作
  • 挂掉 2 台时集群进入"只读保命"模式:已有业务 Pod 继续运行,但无法创建/删除资源;
  • 所以不要同时重启/关机 2 台以上 Master,运维时必须逐台操作。

💡 挂 2 台后的恢复方法见 03-日常运维手册 第 6 节(etcd 恢复)。

4.4 注册地址 (Registration Address) 与 VIP

新节点加入集群时,需要告诉它"去哪里找组织",即 --server https://<地址>:6443

  • 最简方案(本手册教学路径):直接写第一台 Master 的 IP .38。 缺点:.38 宕机后,新节点无法加入、agent 断线重连会失败(已运行的业务不受影响)。
  • 生产推荐:准备一个 VIP(如 .43),用 keepalived 或自研脚本让它始终 漂移到健康的 Master 上,所有节点和客户端都指向 VIP。 本环境 RKE2 集群的 VIP 管理脚本可直接复用,参考 rancher-deploy-192.168.122.32.md §2。

证书方面:K3s 的 API 证书默认为节点地址签发,客户端通过 VIP/其他地址访问时需 在启动参数加 --tls-san <VIP或域名>,否则会出现证书校验错误。

4.5 一次请求的完整路径

以"浏览器访问业务网站"为例,理解各组件如何协作:

用户浏览器
   │  http://app.example.com (解析到任一节点 IP)

节点 :80/:443  ←── Traefik (K3s 内置 Ingress Controller, 以 DaemonSet 运行)
   │  按 Ingress 规则匹配域名/路径

Service (虚拟 IP, 由 kube-proxy/iptables 转发)
   │  按 Label 选择

Pod (运行在 Worker .41 上的业务容器)
  • ServiceLB (klipper-lb):K3s 内置的轻量负载均衡。当 Service 类型为 LoadBalancer 时,它用节点端口模拟外部 LB,无需额外部署云厂商组件。
  • CoreDNS:集群内 DNS,Pod 里访问 svc-name.namespace.svc.cluster.local 靠它。
  • Flannel (VXLAN):默认网络插件,给每个 Pod 分配 10.42.0.0/16 内的地址, 通过 VXLAN 隧道让跨节点 Pod 互通。

4.6 K3s 内置组件一览 (对照镜像清单)

以下组件全部由 K3s 自动部署,镜像已同步到 Harbor(见 ../k3s-images-harbor.txt):

组件镜像作用故障影响
kube-apiserver/scheduler/...编译进 k3s 二进制控制面核心Master 级故障
内嵌 etcd编译进 k3s 二进制集群数据库见 4.3
CoreDNSmirrored-coredns-coredns:1.14.2集群 DNS新 Pod 解析失败
Traefikmirrored-library-traefik:3.6.13Ingress 入口域名访问失效
ServiceLBklipper-lb:v0.4.15LoadBalancer 模拟LB 型 Service 失效
Local Path Provisionerlocal-path-provisioner:v0.0.35本地磁盘动态供应新 PVC 无法绑定
Metrics Servermirrored-metrics-server:v0.8.1CPU/内存指标kubectl top / HPA 失效
Helm Controllerklipper-helm:v0.9.17-build20260422以 CRD 方式管理 HelmChart内置 Helm 部署失效
Pausemirrored-pause:3.6Pod 沙箱占位所有新 Pod 无法启动

4.7 网络地址规划 (默认值)

网络网段说明
Pod CIDR10.42.0.0/16每个 Pod 一个地址,每节点 /24 (254 个)
Service CIDR10.43.0.0/16Service 虚拟地址,首个 .1 是 kubernetes
节点网络192.168.122.0/24物理/虚拟网络
NodePort 范围30000-32767Service type=NodePort 使用

若与公司其他网段冲突,可在第一台 Server 启动时用 --cluster-cidr / --service-cidr 修改,事后不可更改。


5. K3s 被 Rancher Prime 纳管的原理

5.1 两种接入方式

方式说明适用场景
导入 (Import)集群先用命令行建好,再在 Rancher 里生成一段注册命令粘贴执行✅ 本手册采用;最灵活,集群不受 Rancher 生命周期影响
Rancher 托管创建在 Rancher UI 里选 K3s,由 Rancher 下发安装命令到节点适合全新机器、想让 Rancher 负责升级编排

5.2 导入后集群里多了什么

执行导入命令后,Rancher 在集群的 cattle-system 命名空间部署两个组件:

组件类型作用
cattle-cluster-agentDeployment (1 副本)集群级代理:由集群主动向外连接 Rancher (wss),转发 API 请求
cattle-node-agentDaemonSet (每节点一个)节点级代理:执行节点上的特权操作(升级、清理等)

关键理解点(新手最容易误会)

  1. 方向是反的:不是 Rancher 主动连你的集群,而是 agent 主动外连 Rancher。 所以集群不需要给 Rancher 开入站端口,只要节点能访问 Rancher 的地址即可。
  2. Rancher 挂了 ≠ 集群挂了:cattle-agent 断连期间,K8s 控制面照常工作, 业务 Pod 不受影响,只是 UI 上看不到/操作不了集群;Rancher 恢复后自动重连。
  3. 删除纳管 ≠ 删除集群:在 Rancher 里"删除集群"(导入类型)只是解除注册, 不会销毁节点上的 K3s。

6. 环境准备

6.1 节点规划(回顾)

角色IP主机名规格
Master-1192.168.122.38szb1220384C/8G/50G
Master-2192.168.122.39szb1220394C/8G/50G
Master-3192.168.122.40szb1220404C/8G/50G
Worker-1192.168.122.41szb1220418C/16G/100G
API VIP192.168.122.43可选, 生产建议

6.2 端口要求

端口协议所在节点用途
6443TCPMasterKubernetes API
8472UDP全部Flannel VXLAN
80 / 443TCP全部Traefik Ingress / ServiceLB
30000-32767TCP全部NodePort 服务
53TCP/UDP全部CoreDNS (集群内)

防火墙处理(二选一):

bash
# 方式 A:实验环境直接关闭 (Rocky 9)
systemctl disable --now firewalld

# 方式 B:生产环境放行端口
firewall-cmd --permanent --add-port={6443,80,443,30000-32767}/tcp
firewall-cmd --permanent --add-port=8472/udp
firewall-cmd --reload

6.3 节点基础初始化 (4 台都执行)

bash
# 1. 主机名 (按节点替换)
hostnamectl set-hostname szb122038

# 2. hosts 解析 (4 台一致)
cat >> /etc/hosts <<'EOF'
192.168.122.38 szb122038
192.168.122.39 szb122039
192.168.122.40 szb122040
192.168.122.41 szb122041
192.168.122.43 k3s-api              # VIP, 可选
EOF

# 3. 时间同步 (已有 chrony 则跳过)
systemctl enable --now chronyd && chronyc sources

# 4. 内核参数
cat > /etc/sysctl.d/99-k3s.conf <<'EOF'
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
modprobe br_netfilter overlay
cat > /etc/modules-load.d/k3s.conf <<'EOF'
br_netfilter
overlay
EOF
sysctl --system

6.4 配置镜像仓库加速 (4 台都执行)

K3s 系统镜像与业务镜像都走内网 Harbor。docker.io 的请求被镜像(mirror)到 Harbor 的对应项目,路径保持不变(docker.io/rancher/xxx192.168.122.156:30000/rancher/xxx):

bash
mkdir -p /etc/rancher/k3s
cat > /etc/rancher/k3s/registries.yaml <<'EOF'
mirrors:
  docker.io:
    endpoint:
      - "http://192.168.122.156:30000"
configs:
  "192.168.122.156:30000":
    auth:
      username: xxx
      password: xxx
    tls:
      insecure_skip_verify: true
EOF

凭据以 credentials.md 为准; 镜像同步情况见上级目录 ../README.md

6.5 准备 K3s 二进制 (气隙环境)

气隙环境无法从官网下载,先在有外网的机器上下载,再上传到 4 台节点:

bash
# 外网机器下载 (amd64)
wget https://github.com/k3s-io/k3s/releases/download/v1.35.4%2Bk3s1/k3s
wget https://github.com/k3s-io/k3s/releases/download/v1.35.4%2Bk3s1/sha256sum-amd64.txt
sha256sum -c sha256sum-amd64.txt --ignore-missing   # 校验

# 上传到每台节点并安装
for ip in 38 39 40 41; do
  scp k3s root@192.168.122.$ip:/usr/local/bin/k3s
  ssh root@192.168.122.$ip 'chmod +x /usr/local/bin/k3s && k3s --version'
done

同时把安装脚本放到任一节点(或 hypervisor 的文件服务器上):

bash
# 外网下载官方脚本; 也可用国内镜像:
#   https://rancher-mirror.rancher.cn/k3s/k3s-install.sh
wget https://get.k3s.io -O k3s-install.sh

7. 搭建集群实操

约定:下文 K3S_TOKEN 为集群共享令牌,可自定义一个强随机串, 4 台节点必须一致。生成示例:openssl rand -hex 32

7.1 初始化第一台 Master (.38)

bash
# 在 szb122038 上:
INSTALL_K3S_SKIP_DOWNLOAD=true \
INSTALL_K3S_EXEC="server \
  --cluster-init \
  --token <K3S_TOKEN> \
  --tls-san 192.168.122.38 \
  --tls-san 192.168.122.43 \
  --write-kubeconfig-mode 644" \
bash k3s-install.sh

参数说明:

参数含义
INSTALL_K3S_SKIP_DOWNLOAD=true气隙:不联网下载,使用已放好的二进制
--cluster-init初始化内嵌 etcd 集群(只在第一台使用)
--token节点间互信令牌,也用于生成 node-token
--tls-sanAPI 证书附加地址(节点 IP + 将来的 VIP)
--write-kubeconfig-mode 644kubeconfig 放开读权限,便于取用

验证:

bash
systemctl status k3s            # active (running)
k3s kubectl get nodes           # szb122038 Ready
k3s kubectl get pods -A         # CoreDNS/Traefik/ServiceLB 等 Running

7.2 加入另外两台 Master (.39 / .40)

两台机器上命令相同(注意不要--cluster-init,改为 --server 指向第一台):

bash
# 在 szb122039、szb122040 上:
INSTALL_K3S_SKIP_DOWNLOAD=true \
INSTALL_K3S_EXEC="server \
  --server https://192.168.122.38:6443 \
  --token <K3S_TOKEN> \
  --tls-san 192.168.122.38 \
  --tls-san 192.168.122.43 \
  --write-kubeconfig-mode 644" \
bash k3s-install.sh

生产建议:等 VIP (.43) 就绪后,--server 指向 https://192.168.122.43:6443 或域名,避免单点。

验证(任一 Master):

bash
k3s kubectl get nodes -o wide        # 3 台 server 均 Ready

查看 etcd 成员(3 个成员即成功):

bash
ETCD=/var/lib/rancher/k3s/data/current/bin/etcdctl
TLS=/var/lib/rancher/k3s/server/tls/etcd
ETCDCTL_API=3 $ETCD \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=$TLS/server-ca.crt --cert=$TLS/client.crt --key=$TLS/client.key \
  member list -w table

7.3 加入 Worker (.41)

bash
# 在 szb122041 上:
INSTALL_K3S_SKIP_DOWNLOAD=true \
K3S_URL=https://192.168.122.38:6443 \
K3S_TOKEN=<K3S_TOKEN> \
bash k3s-install.sh

Agent 不需要 INSTALL_K3S_EXEC;设置了 K3S_URL 后安装脚本自动以 agent 模式安装。 验证:systemctl status k3s-agent

7.4 整体验收清单

在任一 Master 上逐项执行:

bash
k3s kubectl get nodes -o wide               # [ ] 4 节点全部 Ready
k3s kubectl get pods -A                     # [ ] 无 CrashLoop/ErrImagePull
k3s kubectl get svc -A                      # [ ] traefik 有 NodePort/LoadBalancer

快速配置本地 kubectl(可选)

bash
# 把 kubeconfig 拉到本地 (~/.kube/)
scp root@192.168.122.38:/etc/rancher/k3s/k3s.yaml ~/.kube/config-k3s
# 把 server 地址 127.0.0.1 改为节点 IP 或 VIP
sed -i 's/127.0.0.1/192.168.122.38/' ~/.kube/config-k3s
kubectl --kubeconfig ~/.kube/config-k3s get nodes

8. 导入 Rancher Prime

8.1 生成注册命令

  1. 登录 Rancher Prime UI → 左上角菜单 → Cluster Management(集群管理)
  2. 点击 Create(创建) → 选择页面下方 Import Existing(导入已有集群)
  3. 选择 Generic(通用)
  4. 填写集群名称(如 k3s-prod-3m1w),其余默认,点击 Create
  5. 页面会生成一段注册命令,形如:
bash
curl --insecure -sfL https://<RANCHER地>/v3-import/<随机token>.yaml | kubectl apply -f -

8.2 执行注册

任一能执行 kubectl 的 Master 上执行上面那条命令。它会在集群里部署 cattle-cluster-agentcattle-node-agent(见 5.2)。

气隙环境注意:注册 YAML 中的 rancher/rancher-agent 镜像需要节点能拉到。 若无法访问外部仓库,先把镜像同步到 Harbor,再修改 YAML 后应用:

bash
# 1. 下载注册 YAML
curl --insecure -sfL https://<RANCHER地>/v3-import/<token>.yaml -o import.yaml

# 2. 同步 agent 镜像到 Harbor (外网机器执行)
skopeo copy --dest-tls-verify=false \
  --dest-creds "admin:xxx" \
  docker://registry.rancher.com/rancher/rancher-agent:<与Rancher同版> \
  docker://192.168.122.156:30000/rancher/rancher-agent:<同版>

# 3. 替换 YAML 中的镜像地址
sed -i 's#registry.rancher.com#192.168.122.156:30000#g' import.yaml

# 4. 应用
kubectl apply -f import.yaml

也可以在 Rancher Global Settings → system-default-registry 里统一设置 192.168.122.156:30000,这样生成的 YAML 会自动带上内网仓库前缀。

8.3 验证导入成功

  • Rancher UI:集群列表中该集群状态变为 Active(首次约需 1-2 分钟);
  • 集群内部:
bash
kubectl -n cattle-system get pods
# cattle-cluster-agent-xxx   1/1 Running
# cattle-node-agent-xxx      1/1 Running (每节点一个)

导入后,UI 上该集群会显示 K3s 版本号 v1.35.4+k3s1。接下来请阅读 02-Rancher-Prime-UI使用指南


9. 附录: Rancher Prime 安装速览

本手册假设 Rancher Prime 管理平面已存在。若尚未安装,以下为快速参考, 详细气隙步骤见 Rancher 气隙部署手册。

Rancher Prime 需要安装在一个现有的 K8s 集群上(如本环境的 RKE2 集群):

bash
# 1. cert-manager (前置依赖)
kubectl apply -f cert-manager.crds.yaml
helm install cert-manager ./cert-manager-<>.tgz -n cert-manager

# 2. 添加 Prime Helm 仓库并安装
helm repo add rancher-prime https://charts.rancher.io/rancher
helm repo update
kubectl create namespace cattle-system
helm install rancher rancher-prime/rancher \
  --namespace cattle-system \
  --set hostname=rancher.your-domain.com \
  --set bootstrapPassword='xxx' \
  --set replicas=3

气隙环境下需先把 registry.rancher.com 下的镜像同步到 Harbor,并用 --set systemDefaultRegistry=192.168.122.156:30000 指定内网仓库。

首次登录:浏览器打开 https://rancher.your-domain.com, 用户 admin + 上面设置的 bootstrapPassword,登录后会要求改密码。


10. 本章常见问题

Q1: K3s 和标准 K8s 的命令一样吗? 完全一样。k3s kubectl 就是标准 kubectl;也可以 alias kubectl='k3s kubectl'

Q2: Master 节点能同时跑业务吗? 可以。K3s Server 默认不禁止调度业务 Pod。本集群只有 1 台 Worker,资源紧张时 业务会自动调到 Master 上。若希望业务只跑在 Worker,可用污点/节点选择器 (见 03-日常运维手册 第 3 节)。

Q3: 为什么不把 Worker 也做成 3 台? Worker 数量由业务容量决定,与高可用无关。Worker 挂一台,上面的 Pod 会被 重新调度到其他节点;而 Master 挂了影响的是整个控制面。本环境先 1 台 Worker, 后续按需扩容(扩容方法见运维手册 3.2)。

Q4: token 丢了怎么办? Master 上保存于 /var/lib/rancher/k3s/server/node-token,可用它继续加节点。

Q5: 集群能离线运行吗? 可以。镜像已镜像化到 Harbor,K3s 控制面完全本地运行。与外网断连不影响 已部署业务;只是无法拉取 Harbor 里没有的新镜像。