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

156 lines
7.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 为 `Ready``kube-system` 中 Traefik 正常;入口 `:80` 可达(按本文验收命令)
- **失败排障**见本文「排障」小节token/防火墙/flannel/cni0/调度入口节点)
## 前置条件
- 已完成 `01-01-k3s-控制节点含traefik.md`
- 已拿到 token默认方案为 `/var/lib/rancher/k3s/server/token`;若控制节点采用**数据盘方案**则为 `/storage/server/token`
- 控制节点可执行 `kubectl`
- **方案二(数据盘)**:若工作节点也使用数据盘,需先将**独立数据盘**挂载到 `/storage`(与 `00-04``01-01` 一致:**四节点**均为 10G+32G 时,**每台**都应挂载 `/storage` 再装 agent
## 工作节点加入集群(在工作节点执行)
与 01-01 存储方案一致:控制节点用默认则工作节点用方案一;控制节点用数据盘则**工作节点也用方案二**,且 **`/storage` 须为独立挂载**(与根分区不同盘),便于统一路径并满足 Longhorn 实验前提。
### 方案一:默认数据目录
```bash
curl -sfL https://get.k3s.io | \
K3S_URL=https://192.168.2.61:6443 \
K3S_TOKEN=<TOKEN> \
sh -
```
### 方案二:数据盘(自定义数据目录)
确保数据盘已挂载到 `/storage` 后执行:
```bash
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.1``cni0` 出现后,将其加入 firewalld 的 `trusted` 区域,并**持久化**`--permanent` + `--reload`),重启后仍生效。
早期排障时,曾只在控制节点手工执行过少量临时放行命令即可恢复访问,那是因为当时入口 Pod 全在控制节点、所有回包都经由控制节点;
但在“Traefik 可跑在任意节点、部分节点被选为入口节点”的设计下,每个启用 firewalld 的 k3s 节点都必须持久放行本机 `flannel.1/cni0`,否则一旦入口 Pod 或业务 Pod 调度到该节点,就可能在该节点上重现同类故障。
在**每台** k3s 节点上分别执行(当前不再维护 diag 脚本,使用手动命令或 Ansible
### 2.2 手动方式(不使用脚本)
在**每台** k3s 节点上分别执行:
```bash
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 替换 `ylc61``ylc62` 等:
### 3.1 手工方式(直接 kubectl 打标签)
```bash
# 示例:选择 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`](../ansible/group_vars/all.yml) 中配置入口节点列表 `k3s_ingress_nodenames`(示例:`ylc61``ylc62`),由 `01-05.yml``-e k3s_do_install=true`)自动打标签。
运行:
```bash
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-验证矩阵-一键部署.md``03-02-k3s-traefik-acme.md` 中 M1随机一台控制节点、M3随机一台工作节点需为节点打角色标签。在控制节点执行
```bash
# 控制节点打标(按实际控制节点名改,可多台)
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 排障小节。
## 验证命令(在控制节点执行)
```bash
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.61``192.168.2.62`)可返回 Traefik 响应(常见 `404`
## 排障
- 若出现 `502/跨节点不通/admin-prohibited`,看:`06-01-k3s-networkpolicy-故障排查.md`
## 下一步
- `02-00-nginx-系列说明.md``02-05-nginx-验证矩阵-一键部署.md`HTTP 入口与 Traefik 路由最小验证)
- `03-01-k3s-traefik-dashboard.md`