Kubernetes Pod无法通过服务名称解析地址问题求助
本地minikube集群运行两个Pod:RabbitMQ和依赖它的Python微服务。已为RabbitMQ创建Service,但微服务无法通过服务名称rmqserver连接,改用Service Endpoint IP则能正常连接。目前暂不想用Helm部署RabbitMQ,希望先解决DNS解析问题。这套服务在docker-compose中可正常运行,正在迁移至K8s。
RabbitMQ部署YAML
apiVersion: apps/v1 kind: Deployment metadata: name: rabbitmq3 spec: replicas: 1 selector: matchLabels: app: rabbitmq3 template: metadata: labels: app: rabbitmq3 spec: containers: - name: rabbitmq image: rabbitmq:3.11.10-management-alpine imagePullPolicy: IfNotPresent resources: limits: memory: "256Mi" cpu: "500m" ports: - containerPort: 5672 name: amqp - containerPort: 15672 name: discovery restartPolicy: Always --- apiVersion: v1 kind: Service metadata: labels: app: rabbitmq3 name: rmqserver-ui spec: type: NodePort ports: - name: discovery port: 15672 targetPort: 15672 selector: app: rabbitmq3 --- apiVersion: v1 kind: Service metadata: labels: app: rabbitmq3 name: rmqserver spec: type: ClusterIP ports: - name: amqp port: 5672 targetPort: 5672 selector: app: rabbitmq3
Python微服务连接代码
# self._rmqusername 和 self._rmqpassword 为 guest/guest credentials = pika.PlainCredentials(self._rmqusername, self._rmqpassword) connection = pika.BlockingConnection(pika.ConnectionParameters(host=rmqserver, credentials=credentials))
错误日志
2023-03-03 19:54:26,572 [ERROR] Address resolution failed: gaierror(-3, 'Try again') 2023-03-03 19:54:26,573 [ERROR] getaddrinfo failed: gaierror(-3, 'Try again'). 2023-03-03 19:54:26,573 [ERROR] AMQP connection workflow failed: AMQPConnectionWorkflowFailed: 1 exceptions in all; last exception - gaierror(-3, 'Try again'); first exception - None. 2023-03-03 19:54:26,573 [ERROR] AMQPConnectionWorkflow - reporting failure: AMQPConnectionWorkflowFailed: 1 exceptions in all; last exception - gaierror(-3, 'Try again'); first exception - None 2023-03-03 19:54:26,574 [ERROR] Connection workflow failed: AMQPConnectionWorkflowFailed: 1 exceptions in all; last exception - gaierror(-3, 'Try again'); first exception - None 2023-03-03 19:54:26,574 [ERROR] Error in _create_connection(). Traceback (most recent call last): File "/usr/lib/python3.8/site-packages/pika/adapters/blocking_connection.py", line 451, in _create_connection raise self._reap_last_connection_workflow_error(error) File "/usr/lib/python3.8/site-packages/pika/adapters/utils/selector_ioloop_adapter.py", line 565, in _resolve result = socket.getaddrinfo(self._host, self._port, self._family, File "/usr/lib/python3.8/socket.py", line 918, in getaddrinfo for res in _socket.getaddrinfo(host, port, family, type, proto, flags): socket.gaierror: [Errno -3] Try again
初步判断
问题出在DNS名称解析环节,可能缺少必要配置步骤。
1. 检查命名空间一致性
确认RabbitMQ的Service与Python微服务Pod是否在同一命名空间:
- 执行
kubectl get pods -A查看所有Pod的命名空间 - 执行
kubectl get services -A查看rmqserver所在命名空间
若不在同一命名空间,连接时需使用完整服务DNS名称:rmqserver.<命名空间>.svc.cluster.local
2. 验证DNS服务状态
minikube默认部署coredns,检查其运行状态:
kubectl get pods -n kube-system -l k8s-app=kube-dns
若coredns Pod未正常运行,重启部署:
kubectl rollout restart deployment coredns -n kube-system
3. 在微服务Pod内测试DNS解析
进入Python微服务Pod,手动测试rmqserver解析:
kubectl exec -it <微服务Pod名称> -- nslookup rmqserver
若解析失败,检查Pod的DNS配置:
kubectl exec -it <微服务Pod名称> -- cat /etc/resolv.conf
正常配置应包含nameserver 10.96.0.10(Kubernetes DNS服务的ClusterIP),以及search <命名空间>.svc.cluster.local svc.cluster.local cluster.local
4. 检查代码中的服务名称正确性
确保代码中使用的服务名称是rmqserver,注意大小写敏感,Kubernetes Service名称为小写,避免拼写错误。
5. 确认Service关联的Endpoint正常
检查rmqserver的Endpoint是否正确关联到RabbitMQ Pod:
kubectl describe service rmqserver
查看Endpoints字段,应显示RabbitMQ Pod的IP和端口5672
内容的提问来源于stack exchange,提问作者Rabellino

