k3s部署pihole执行kubectl patch报service not found问题
问题原因
services "pihole-dns-tcp" not found 报错的核心原因是执行kubectl命令时未指定目标命名空间,默认仅查询default命名空间下的资源,而通过Helm部署的Pi-hole服务通常不会部署在default命名空间,因此无法匹配到目标服务。
排查步骤
先执行以下命令查询所有命名空间下的Pi-hole相关服务,确认服务实际所属命名空间(返回结果第一列为命名空间名称):
kubectl get svc -A | grep pihole
常见的Pi-hole部署命名空间为pihole。
修复方案
方案1:临时绑定ExternalIP(快速验证用,Helm更新或Pod重建后配置会失效)
在原patch命令中添加-n <查询到的命名空间名>参数即可,注意DNS服务需要同时配置TCP和UDP协议的外部IP,否则会出现部分DNS请求异常:
# 替换命令中<namespace>为你实际查到的命名空间,比如pihole # 绑定TCP DNS服务外部IP kubectl patch svc pihole-dns-tcp -n <namespace> -p '{"spec":{"externalIPs":["192.168.178.210"]}}' # 绑定UDP DNS服务外部IP kubectl patch svc pihole-dns-udp -n <namespace> -p '{"spec":{"externalIPs":["192.168.178.210"]}}' # 如需外部访问Pi-hole管理面板,可同步为web服务绑定IP kubectl patch svc pihole-web -n <namespace> -p '{"spec":{"externalIPs":["192.168.178.210"]}}'
执行完成后重新查询服务列表,即可看到对应服务已经绑定指定的ExternalIP。
方案2:永久配置(生产环境推荐,配置不会因Helm更新丢失)
手动patch的配置会在后续执行helm upgrade时被覆盖,建议直接修改Helm部署配置永久生效:
- 在你用于部署Pi-hole的自定义values.yaml文件中添加如下配置:
serviceDns: type: NodePort externalIPs: - 192.168.178.210 serviceDhcp: type: NodePort externalIPs: - 192.168.178.210 serviceWeb: # 如需外部访问web面板可将type改为NodePort,保持ClusterIP仅集群内访问也可 type: ClusterIP externalIPs: - 192.168.178.210
- 执行helm upgrade命令更新部署使配置生效:
# 同样替换<namespace>为实际命名空间,<values-path>为你的自定义values.yaml文件路径 helm upgrade pihole pihole/pihole -n <namespace> -f <values-path>
注意:你配置的ExternalIP必须是k3s集群中某台节点实际持有的内网IP,否则外部流量无法正常路由到对应服务。
内容的提问来源于stack exchange,提问作者vince
相关产品推荐
相关产品推荐

