记录一下那天晚上的排查过程。在 2 核 4G 的轻量服务器上装了 k3s 做测试,之后想再装 nginx 跑站点,systemctl start nginx 报 Address already in use,ss -lntp 显示 80 端口被 traefik 占着。
刚开始盯着「之前用 kubectl apply 过一份 ingress 配置,规则的 hostPort 写死了」,折腾了半个多小时,排掉了。
把日志和配置对完,能解释这个现象的基本就这几处。k3s 默认自带 traefik 这个 Ingress 控制器,会以 hostPort 方式占住 80 和 443。也可能是helm 装的服务里带了 LoadBalancer 类型的 Service,k3s 的 servicelb 把端口绑到了宿主机。
另外,docker 里还留着一个映射 80 端口的旧容器。
动手时先确认 80 端口到底是哪个进程占的
ss -lntp 'sport = :80'
接着关掉 k3s 自带的 traefik 组件
systemctl stop k3s && cat /etc/systemd/system/k3s.service
以禁用 traefik 的方式重启 k3s
systemctl start k3s
等前面都确认过,再确认端口释放后启动 nginx
ss -lntp 'sport = :80' && systemctl start nginx
改完先别撤,确认这几项。ss 里 80 端口只剩 nginx 的 master 进程,curl 本机返回站点首页,k3s 的 Pod 依旧正常运行不受影响。
补一句。k3s 的 --disable traefik 要写在 service 的 ExecStart 里并且只生效一次,升级时会被覆盖;已经建好的 traefik Deployment 还要手动删掉。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
