117 lines
3.4 KiB
Markdown
117 lines
3.4 KiB
Markdown
# 06-01-k3s NetworkPolicy 使用与故障排查
|
||
|
||
> 本文只负责 **网络策略与连通性排障**。
|
||
> 若你要做 Traefik 部署、ServiceLB 池配置,请看 `01-02-k3s-工作节点.md`。
|
||
|
||
## 契约与真源
|
||
|
||
- **NetworkPolicy 示例**:`ansible/files/06-01/networkpolicy-traefik-egress.example.yaml`、`ansible/files/06-01/networkpolicy-backend-ingress.example.yaml`(复制改名后按集群标签/CIDR 修改再 `kubectl apply`)。
|
||
- **手动**:以下 bash 排查命令与上述 YAML 同一目录索引见 `ansible/files/06-01/README.md`。
|
||
- **自动**:`./ansible/bin/verify.sh run 06-01`(noop + 基线;策略真源以 `ansible/files/06-01/` 为准)。
|
||
|
||
## TL;DR
|
||
|
||
- **自动化验收**:`./ansible/bin/verify.sh run 06-01`
|
||
- **关键前置**:按本文「前置条件」准备环境变量/Secret/入口 IP
|
||
- **成功判据**:达到本文「预期」且 playbook 断言通过
|
||
- **排障**:见本文「排障」
|
||
|
||
## 前置条件
|
||
|
||
- 已完成 `01-02-k3s-工作节点.md`
|
||
- 已有至少一个后端服务(如 nginx/nodejs)
|
||
- 可执行 `kubectl`
|
||
|
||
## 三条先验结论
|
||
|
||
1. 主链路看 **Traefik -> Service**,不是 Pod IP 直连。
|
||
2. Pod 被 NetworkPolicy 选中后,该方向默认拒绝,需显式放行。
|
||
3. 跨节点不通通常是“策略 + 主机防火墙 + 回包路径”叠加问题。
|
||
|
||
## 标准排查步骤
|
||
|
||
### 2.1 资源状态
|
||
|
||
```bash
|
||
kubectl get pod,svc,ing -A
|
||
```
|
||
|
||
### 2.2 入口可达性
|
||
|
||
```bash
|
||
curl -I --max-time 3 http://192.168.2.61:80
|
||
curl -I --max-time 3 http://192.168.2.62:80
|
||
```
|
||
|
||
### 2.3 快速检查命令
|
||
|
||
```bash
|
||
kubectl get pod,svc,ing -A
|
||
kubectl get networkpolicy -A
|
||
kubectl -n kube-system get pods -l app=svclb-traefik -o wide
|
||
```
|
||
|
||
### 2.4 全链路检查(手工)
|
||
|
||
```bash
|
||
# 从入口节点IP验证 HTTP 入口
|
||
curl -I --max-time 3 http://192.168.2.61:80
|
||
curl -I --max-time 3 http://192.168.2.62:80
|
||
```
|
||
|
||
## 关键策略建议
|
||
|
||
- Traefik egress 建议同时放行:
|
||
- 目标命名空间后端端口
|
||
- Service CIDR(如 `10.43.0.0/16`)
|
||
- DNS(`53/udp`、`53/tcp`)
|
||
- 后端 ingress 策略要匹配 Traefik 来源(命名空间或 IP 段)
|
||
|
||
## 已验证修复(Fedora/FCOS)
|
||
|
||
### 4.1 手动修复
|
||
|
||
```bash
|
||
# 1) 临时生效(当前运行时)
|
||
sudo firewall-cmd --zone=trusted --add-interface=flannel.1
|
||
sudo firewall-cmd --zone=trusted --add-interface=cni0
|
||
|
||
# 2) 持久化
|
||
sudo firewall-cmd --permanent --zone=trusted --add-interface=flannel.1
|
||
sudo firewall-cmd --permanent --zone=trusted --add-interface=cni0
|
||
|
||
# 3) 重载配置
|
||
sudo firewall-cmd --reload
|
||
|
||
# 4) 验证
|
||
sudo firewall-cmd --zone=trusted --list-interfaces
|
||
sudo firewall-cmd --get-active-zones
|
||
```
|
||
|
||
预期:`trusted` 区域中能看到 `flannel.1 cni0`,跨节点回包不再被 `admin-prohibited` 拦截。
|
||
|
||
## 本文不处理的内容
|
||
|
||
以下属于部署配置域,请转到 `01-02-k3s-工作节点.md`:
|
||
|
||
- Traefik 节点标签与 `lbpool` 设计
|
||
- HelmChartConfig 配置写入方式
|
||
- Dashboard/ACME 等功能配置
|
||
|
||
## 关联文档
|
||
|
||
- `01-02-k3s-工作节点.md`
|
||
- `02-05-nginx-验证矩阵-一键部署.md`(入口与路由基线)
|
||
- `04-01-k3s-nodejs-高级部署.md`
|
||
- `scripts/README.md`
|
||
|
||
## 下一步
|
||
|
||
- 返回 00-00-构建总览.md,按导航继续。
|
||
|
||
## 排障
|
||
|
||
- **先看 playbook 输出**:失败时先定位是 deploy/wait/http_check 哪一步。
|
||
- **集群侧总览**:`kubectl get nodes -o wide`、`kubectl -n kube-system get pods -o wide`。
|
||
- **事件与日志**:`kubectl -n <ns> describe ...`、`kubectl -n <ns> logs ... --tail=200`。
|