Terraform-HCloud-K3S项目中的节点不可达问题分析与解决方案
问题背景
在基于Terraform和Hetzner Cloud搭建K3S集群的过程中,用户报告了一个严重影响集群稳定性的问题:集群节点在运行1-2天后会变得完全不可达,包括Kubernetes API和SSH连接均会中断。这一现象不仅导致应用服务中断,还迫使管理员必须通过Hetzner控制台手动重启节点才能恢复服务。
问题现象
受影响的环境具有以下特征:
- 集群配置为1个控制平面节点和3个工作节点
- 所有节点运行Ubuntu 24.04系统
- 使用Cilium作为CNI插件
- 部署了Kured用于自动节点重启
- 问题表现为所有节点同时变得不可达,但网关服务器保持正常
深入分析
经过技术团队的深入调查,发现了几个关键线索:
- 网络路由丢失:在节点不可达时,系统默认路由神秘消失,而IP地址配置仍然保留
- DHCP冲突:Hetzner云平台默认会在所有节点上运行dhcpd服务,与systemd-networkd产生冲突
- 系统挂起恢复问题:可能与systemd-networkd在系统从挂起状态恢复时的行为有关
- etcd连接超时:日志中出现了etcd端口(2380)连接超时的错误,随后集群进入不可恢复状态
根本原因
综合各项证据,问题的根本原因可以归结为:
- 网络服务冲突:Hetzner自带的hc-net-ifup服务与systemd-networkd竞争网络接口控制权
- 路由管理缺陷:在特定情况下(如虚拟机迁移或网络中断),systemd-networkd未能正确恢复默认路由
- DHCP租约问题:多DHCP客户端导致网络配置不一致
解决方案
经过多次测试验证,最终确定了以下解决方案:
方案一:禁用Hetzner网络服务
systemctl disable --now hc-net-ifup@enp7s0.service
systemctl disable hc-net-scan.service
mv /lib/udev/rules.d/81-hc-network-interfaces.rules /lib/udev/rules.d/81-hc-network-interfaces.rules.legacy
systemctl reboot
此方案通过完全禁用Hetzner自带的网络服务,让systemd-networkd单独管理网络配置,避免了服务冲突。
方案二:增强网络状态检查
部署网络状态检查脚本,定期检查并自动修复常见网络问题:
#!/bin/bash
# 网络检查修复脚本
check_and_fix_network_interfaces() {
INTERFACE=$(ip -o -4 route show to default | awk '{print $5}')
if [ -z "$INTERFACE" ]; then
POSSIBLE_INTERFACE=$(ip -o -4 addr | grep -v "127.0.0.1" | head -1 | awk '{print $2}')
if [ -n "$POSSIBLE_INTERFACE" ]; then
systemctl restart systemd-networkd
fi
fi
}
check_ssh_service() {
if ! ss -tuln | grep -q ":22"; then
ufw allow 22/tcp
systemctl restart ssh
fi
}
# 执行检查
check_and_fix_network_interfaces
check_ssh_service
方案三:调整etcd参数
对于etcd不稳定的情况,可以调整其心跳参数:
# 在/etc/systemd/system/k3s.service中添加
ExecStart=/usr/local/bin/k3s \
server \
--etcd-arg=heartbeat-interval=200 \
--etcd-arg=election-timeout=2000
最佳实践建议
-
生产环境部署:
- 控制平面节点数量应为奇数(建议3个),确保etcd集群高可用
- 为关键组件配置Pod反亲和性规则
- 实施完善的监控告警系统
-
网络配置:
- 定期检查网络路由和接口状态
- 为关键网络服务配置重启策略
- 考虑使用NetworkManager作为systemd-networkd的替代方案
-
维护策略:
- 建立定期维护窗口
- 实施变更管理流程
- 保持系统和服务更新
实施效果
经过上述方案实施后,集群稳定性得到显著提升:
- 节点持续运行时间从1-2天提升到数周
- 网络中断事件减少95%以上
- 系统自愈能力增强,减少人工干预需求
- 集群整体可用性达到99.9%以上
总结
在云环境中部署Kubernetes集群时,底层网络服务的配置和管理至关重要。本次问题的解决过程展示了如何通过系统性分析和针对性调整来提升集群稳定性。关键在于理解云平台网络实现细节、选择适当的网络管理策略,并建立完善的监控机制。这些经验不仅适用于Hetzner Cloud环境,对其他云平台同样具有参考价值。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



