Kubernetes服务调试指南:从入门到精通
website Kubernetes website and documentation repo: 项目地址: https://gitcode.com/gh_mirrors/webs/website
概述
在Kubernetes集群中,Service是连接应用组件的重要抽象层。然而在实际使用中,Service不工作的情况时有发生。本文将系统性地介绍如何诊断和解决Service相关的问题,帮助开发者快速定位问题根源。
准备工作
创建测试环境
首先我们创建一个简单的测试环境,方便后续调试:
# 创建包含3个副本的Deployment
kubectl create deployment hostnames --image=registry.k8s.io/serve_hostname
kubectl scale deployment hostnames --replicas=3
这个Deployment会创建3个Pod,每个Pod运行一个简单的HTTP服务,返回自己的主机名。
验证Pod运行状态
检查Pod是否正常运行:
kubectl get pods -l app=hostnames
预期输出应显示3个状态为"Running"的Pod。
直接测试Pod功能
获取Pod IP并直接访问:
kubectl get pods -l app=hostnames -o go-template='{{range .items}}{{.status.podIP}}{{"\n"}}{{end}}'
for ep in $(kubectl get pods -l app=hostnames -o go-template='{{range .items}}{{.status.podIP}}:9376{{" "}}{{end}}'); do
wget -qO- $ep
done
每个Pod应该返回自己的主机名,如"hostnames-xxxxx"。
Service基础检查
确认Service是否存在
常见错误是忘记创建Service:
kubectl get svc hostnames
如果不存在,创建Service:
kubectl expose deployment hostnames --port=80 --target-port=9376
检查Service定义
验证Service配置是否正确:
kubectl get svc hostnames -o yaml
重点关注:
spec.ports
中的端口配置targetPort
是否与Pod监听端口匹配selector
是否能正确选择Pod
DNS解析问题排查
基本DNS测试
在Pod内测试Service的DNS解析:
nslookup hostnames
预期应返回Service的ClusterIP。
多级域名测试
如果基本解析失败,尝试完整域名:
nslookup hostnames.default.svc.cluster.local
检查DNS配置
查看Pod内的DNS配置:
cat /etc/resolv.conf
确认:
nameserver
指向集群DNS服务IPsearch
域包含正确的后缀ndots
设置足够高(通常为5)
端点(Endpoint)检查
查看EndpointSlices
确认Service是否正确识别了后端Pod:
kubectl get endpointslices -l k8s.io/service-name=hostnames
ENDPOINTS
列应显示所有Pod的IP和端口。
标签选择器验证
检查Service的选择器与Pod标签是否匹配:
kubectl get pods -l app=hostnames --show-labels
kubectl get svc hostnames -o jsonpath='{.spec.selector}'
网络代理(kube-proxy)调试
检查kube-proxy运行状态
在节点上确认kube-proxy进程正常运行:
ps aux | grep kube-proxy
查看kube-proxy日志
根据系统不同,查看日志:
journalctl -u kube-proxy
# 或
cat /var/log/kube-proxy.log
iptables模式检查
对于iptables模式,检查相关规则:
iptables-save | grep hostnames
应能看到Service和对应Pod的规则。
常见问题总结
- Service不存在:忘记创建Service
- 端口不匹配:Service端口与Pod监听端口不一致
- 标签选择器错误:Service无法选择到正确的Pod
- DNS配置问题:/etc/resolv.conf配置不正确
- kube-proxy故障:网络代理组件未正常工作
- 网络策略限制:NetworkPolicy阻止了流量
高级调试技巧
- 使用临时调试容器:
kubectl run -it --rm --restart=Never debug --image=busybox -- sh
- 检查网络连通性:
# 在Pod内测试Service IP连通性
telnet <service-ip> <port>
- 查看kube-dns日志:
kubectl logs -n kube-system <kube-dns-pod-name>
通过以上系统性的排查步骤,可以解决绝大多数Service相关的问题。记住要从底层开始逐步向上排查,先确认Pod工作正常,再检查Service配置,最后排查网络组件。
website Kubernetes website and documentation repo: 项目地址: https://gitcode.com/gh_mirrors/webs/website
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考