1. 概述与场景假设
- 场景:多台香港 NAT 云服务器(有公网 IP 或通过 NAT 出网),计划用 Kubernetes(kubeadm/k3s)部署容器集群并对外暴露服务。
- 目标:保证 Pod 间互通、外网访问、负载均衡与安全策略可控。
2. 节点准备与系统设置
- 步骤1:确保每台机器可 SSH 且开启 root 或 sudo 权限,时间同步(ntp/chrony)。
- 步骤2:关闭 swap:swapoff -a,并在 /etc/fstab 注释 swap 行,Kubernetes 要求。
- 步骤3:开启内核转发:sysctl -w net.ipv4.ip_forward=1,并写入 /etc/sysctl.conf。
- 步骤4:调整防火墙(先允许 kubeadm 所需端口:6443, 2379-2380, 10250, 10251, 10252 等),建议临时关闭 firewalld/test 后再精细化规则。
3. 安装 Kubernetes(kubeadm 示例)
- 步骤1:安装 kubeadm、kubelet、kubectl,并锁定版本。
- 步骤2:在主节点执行 kubeadm init --pod-network-cidr=192.168.0.0/16(根据 CNI 调整),记录 join 命令。
- 步骤3:在 worker 节点执行 kubeadm join ... 完成集群加入。
- 步骤4:确认节点就绪 kubectl get nodes 和 kubectl get pods -A。
4. 部署 CNI(以 Calico 为例)
- 步骤1:下载官方 Calico manifest:kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml。
- 步骤2:如果在 NAT 场景且需要 IPIP/VXLAN,请编辑 calico ConfigMap,启用 IPIP 或 VXLAN,确保 MTU 与云提供商一致(避免分片)。
- 步骤3:验证 Pod 网络:kubectl get pods -n kube-system,测试 Pod 间 ping(注意有些 CNI 默认禁用 ICMP)。
5. 在 NAT 环境下的 SNAT/路由与 iptables 配置
- 步骤1:判断流量路径:公网 -> NAT 网关 -> 节点,或节点通过 NAT 出公网。
- 步骤2:常见做法为在网关上设置 MASQUERADE:iptables -t nat -A POSTROUTING -s 192.168.0.0/16 ! -d 192.168.0.0/16 -j MASQUERADE。
- 步骤3:为保证集群内部服务通过 NodePort 可被外网访问,需在网关做 DNAT/端口转发到集群节点的 NodePort 端口或使用 LoadBalancer 方案。
- 步骤4:持久化规则:apt install iptables-persistent 或将规则写入启动脚本。
6. 外部负载均衡:MetalLB 与公网 IP 池配置
- 步骤1:在无云 LB 的裸金属/NAT 环境推荐 MetalLB。部署:kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.7/config/manifests/metallb-native.yaml。
- 步骤2:配置 IP 池(使用香港云提供的可用弹性 IP 或 NAT 网关映射地址):创建 ConfigMap 指定 address-pools,例如 203.x.x.100-203.x.x.110。
- 步骤3:若云端无法直接路由至这些 IP,需在 NAT 层建立静态 DNAT 到集群节点或启用 BGP(若云支持)。
7. 安全策略与网络策略(NetworkPolicy)
- 步骤1:启用 Calico 的 NetworkPolicy 功能,定义命名空间级别的流量白名单。
- 步骤2:示例:只允许应用前端访问后端 Pod:kubectl apply -f allow-frontend-to-backend.yaml。
- 步骤3:审计与日志:部署 Prometheus/Calico Felix 日志,定期检查被拒流量以排查误配置。
8. 问:在香港 NAT 环境下如何选择 NodePort 还是 LoadBalancer?
- 答:若云提供可分配的外部 IP 并支持路由到节点,优先使用 MetalLB + LoadBalancer;若只能通过单一网关做端口转发且外部端口有限,可用 NodePort + 网关 DNAT 转发,注意端口范围与 NAT 会话数量。
9. 问:如何保证 NAT 引入的连接追踪/端口耗尽问题?
- 答:通过在网关调大 conntrack 表:sysctl -w net.netfilter.nf_conntrack_max=262144,并监控 /proc/sys/net/netfilter/nf_conntrack_count。对长连接如 HTTP keep-alive 做合适超时设置,必要时启用负载均衡层的会话保持。
10. 问:常见网络故障如何排查?
- 答:步骤:1)确认节点与 Pod IP 分配(kubectl get pods -o wide);2)在节点上用 iptables -t nat -L 检查 NAT 规则;3)从节点用 curl/ping 测试外网与内网;4)检查 CNI 日志(calico/node)和 kube-proxy,调整 MTU 与 IPIP 设置。