Files
Deploy-Laboratory/docs/01-02-k3s-工作节点.md
2026-03-29 09:08:01 +08:00

7.6 KiB
Raw Blame History

01-02-k3s-工作节点与 Traefik 部署配置

本文已合并原 01-02-k3s-工作节点.md。 目标:完成工作节点加入 + Traefik 入口部署基线,并验证「入口节点集合:80 可达」。

若需一键自动化安装多节点集群,可直接用 01-05-节点初始化-ansible-实践.md

契约与真源

  • 加入命令备忘ansible/files/01-02/k3s-agent-join.example.sh(与下文 curl/agent 片段一致)。
  • 自动./ansible/bin/verify.sh run 01-02(与手工步骤共用 ansible/files/01-02/README.md 索引)。

TL;DR

  • 自动化验收:在控制端执行 ./ansible/bin/verify.sh run 01-02
  • 手工加入 worker:在 worker 上按本文执行 k3s agent ...(注意 token 路径与 /storage 方案)
  • 成功判据kubectl get nodes 中 worker 为 Readykube-system 中 Traefik 正常;入口 :80 可达(按本文验收命令)
  • 失败排障见本文「排障」小节token/防火墙/flannel/cni0/调度入口节点)

前置条件

  • 已完成 01-01-k3s-控制节点含traefik.md
  • 已拿到 token默认方案为 /var/lib/rancher/k3s/server/token;若控制节点采用数据盘方案则为 /storage/server/token
  • 控制节点可执行 kubectl
  • 方案二(数据盘):若工作节点也使用数据盘,需先将独立数据盘挂载到 /storage(与 00-0401-01 一致:四节点均为 10G+32G 时,每台都应挂载 /storage 再装 agent

工作节点加入集群(在工作节点执行)

与 01-01 存储方案一致:控制节点用默认则工作节点用方案一;控制节点用数据盘则工作节点也用方案二,且 /storage 须为独立挂载(与根分区不同盘),便于统一路径并满足 Longhorn 实验前提。

方案一:默认数据目录

curl -sfL https://get.k3s.io | \
  K3S_URL=https://192.168.2.61:6443 \
  K3S_TOKEN=<TOKEN> \
  sh -

方案二:数据盘(自定义数据目录)

确保数据盘已挂载到 /storage 后执行:

curl -sfL https://get.k3s.io | sh -s - agent \
  --data-dir=/storage \
  --server https://192.168.2.61:6443 \
  --token <TOKEN>

<TOKEN> 替换为从控制节点读取的 token 内容若控制节点使用数据盘token 路径为 /storage/server/token

防火墙基线(部署即做)

执行节点:在每台运行 k3s 且使用 firewalld 的节点上执行(控制节点 + 工作节点)。
是否必须:使用 firewalld 的发行版(如 FCOS/Fedora必须执行,否则跨节点流量可能被拦截;未使用 firewalld 的节点可跳过。
防火墙与下方 Traefik 入口两者都需要做不是二选一。防火墙部分2.1 脚本 或 2.2 手动,二选一即可。

说明FCOS/Fedora 重点):

  • FCOS/Fedora 默认 firewalld 转发策略较严格。
  • K3s 负责集群网络组件(如 flannel、kube-proxy与规则下发不会自动完成你宿主机 firewalld 的 zone 接口归类策略
  • 入口 PodTraefik/svclb-traefik可能调度到任意节点且回包路径会经过该节点本地的 flannel.1 / cni0,不一定绕控制节点。
  • 若某个节点上 flannel.1 <-> cni0 的转发被 firewalld 拦截,该节点上的入口流量就会在某些调度/流向下异常,即使其它节点正常。

2.1 脚本方式(推荐)

脚本实现:等待 flannel.1cni0 出现后,将其加入 firewalld 的 trusted 区域,并持久化--permanent + --reload),重启后仍生效。
早期排障时,曾只在控制节点手工执行过少量临时放行命令即可恢复访问,那是因为当时入口 Pod 全在控制节点、所有回包都经由控制节点;
但在“Traefik 可跑在任意节点、部分节点被选为入口节点”的设计下,每个启用 firewalld 的 k3s 节点都必须持久放行本机 flannel.1/cni0,否则一旦入口 Pod 或业务 Pod 调度到该节点,就可能在该节点上重现同类故障。

每台 k3s 节点上分别执行(当前不再维护 diag 脚本,使用手动命令或 Ansible

2.2 手动方式(不使用脚本)

每台 k3s 节点上分别执行:

sudo firewall-cmd --zone=trusted --add-interface=flannel.1
sudo firewall-cmd --zone=trusted --add-interface=cni0
sudo firewall-cmd --permanent --zone=trusted --add-interface=flannel.1
sudo firewall-cmd --permanent --zone=trusted --add-interface=cni0
sudo firewall-cmd --reload

Traefik 入口节点范围(在控制节点执行,必须做)

为需要对外暴露 80/443 的节点打标签,使 Traefik 的 svclb 调度到这些入口节点。按你的节点名和 IP 替换 ylc61ylc62 等:

3.1 手工方式(直接 kubectl 打标签)

# 示例:选择 ylc61/ylc62 作为入口节点
kubectl label node ylc61 svccontroller.k3s.cattle.io/enablelb=true --overwrite
kubectl label node ylc62 svccontroller.k3s.cattle.io/enablelb=true --overwrite
kubectl label node ylc61 svccontroller.k3s.cattle.io/lbpool=edge --overwrite
kubectl label node ylc62 svccontroller.k3s.cattle.io/lbpool=edge --overwrite

你可以根据需要选择 1 台、2 台、3 台或全部 4 台节点作为入口节点;被打上上述两个标签的节点将承载 Traefik/svclb 暴露的 80/443 入口。

3.2 Ansible 方式(推荐,集中管理入口节点)

也可以在 ansible/group_vars/all.yml 中配置入口节点列表 k3s_ingress_nodenames(示例:ylc61ylc62),由 01-05.yml-e k3s_do_install=true)自动打标签。

运行:

cd ansible
ansible-playbook -i inventory.ini playbooks/verify/01-05.yml

k3s_ingress_nodenames 为空默认Ansible 会对所有节点打入口标签,与早期行为一致;
填写后则仅对列出的节点打标签,实现「按需选择入口节点」。

可选02-05 / 03-02 矩阵 M1/M3 需要):若要用 02-05-nginx-验证矩阵-一键部署.md03-02-k3s-traefik-acme.md 中 M1随机一台控制节点、M3随机一台工作节点需为节点打角色标签。在控制节点执行

# 控制节点打标(按实际控制节点名改,可多台)
kubectl label node ylc61 node-role.kubernetes.io/control-plane= --overwrite
# 工作节点打标(按实际工作节点名改,可多台)
kubectl label node ylc62 node-role.kubernetes.io/worker= --overwrite
kubectl label node ylc63 node-role.kubernetes.io/worker= --overwrite

未打标时M1/M3 会 Pending可改用 M2/M4 的 hostname 指定节点或见 02-05 排障小节。

验证命令(在控制节点执行)

sudo systemctl status k3s-agent --no-pager
kubectl get nodes -o wide
kubectl -n kube-system get svc traefik -o wide
kubectl -n kube-system get pods -l app=svclb-traefik -o wide
sudo firewall-cmd --zone=trusted --list-interfaces

# 对入口节点的 IP 做 HTTP 验证(示例:入口节点为 192.168.2.61 / 192.168.2.62
curl -I --max-time 3 http://192.168.2.61:80
curl -I --max-time 3 http://192.168.2.62:80

预期

  • 工作节点显示 Ready
  • trusted 中可看到 flannel.1 cni0
  • 被标记为入口节点的 IP:80示例中为 192.168.2.61192.168.2.62)可返回 Traefik 响应(常见 404

排障

  • 若出现 502/跨节点不通/admin-prohibited,看:06-01-k3s-networkpolicy-故障排查.md

下一步

  • 02-00-nginx-系列说明.md02-05-nginx-验证矩阵-一键部署.mdHTTP 入口与 Traefik 路由最小验证)
  • 03-01-k3s-traefik-dashboard.md