本文共 2057 字,大约阅读时间需要 6 分钟。
文章目录
一次解决Kubernetes集群内无法访问服务的问题过程
前言
在Kubernetes集群中创建了一个名为的Deployment和Service,但是在集群内的另外一个Pod中却无法通过该服务名来访问到服务。
本文描述了解决这一问题的过程,以供参考。
解决过程
先检查要访问的服务是否正常
# Check deployment kubectl get deployment php-apache -o wide# Check servicekubectl get svc php-apache -o wide# Check podkubectl get pods | grep php-apache
本例中Service的Cluster IP为10.105.77.184,端口为80。
在busybox中测试
启动busybox:
kubectl delete pod busyboxkubectl run -it busybox --image=busybox -- /bin/sh
在busybox pod内,尝试通过服务名访问失败:
wget -q -O- http://php-apachewget -q -O- http://php-apache.defaultwget -q -O- http://php-apache.default.svc.cluster.local
但是尝试通过Cluster IP方式访问成功:
wget -q -O- http://10.105.77.184:80
怀疑是kube-dns
的问题。
检查kube-dns
# Check deploymentkubectl get deployment -n kube-system -l k8s-app=kube-dns# Check servicekubectl get svc -n kube-system -l k8s-app=kube-dns# Check endpointkubectl get ep -n kube-system -l k8s-app=kube-dns
发现kube-dns
正常。
怀疑是网络原因,本例中的Kubernetes集群用的是Calico网络组件。
检查Calico
# Check daemonset kubectl get ds -n kube-system -l k8s-app=calico-node# Check pod status and readykubectl get pods -n kube-system -l k8s-app=calico-node# Check apiservice statuskubectl get apiservice v1.crd.projectcalico.org -o yaml
发现calico-node
的2个Pod都不是READY状态。
查看calico-node
Pod的详细信息:
kubectl describe -n kube-system pod -l k8s-app=calico-node
查看calico-node
某个Pod的日志:
kubectl logs -f -n kube-system calico-node-
发现错误日志为:“calico/node is not ready: BIRD is not ready: BGP not established“
在Calico的Manifest中的 “# Auto-detect the BGP IP address.” 前添加:
# Specify interface- name: IP_AUTODETECTION_METHOD value: "interface=eth0"
说明:
interface=eth0
表示选择节点机器的eth0
网卡,可以通过ip addr show
来查看网卡。
一个完整的Calico Manifest的例子参见:
interface
示例:
# 指定某个网卡interface=eth0interface=ens33# 指定网卡的前缀interface=eth.*interface=ens.*# 指定多个网卡的前缀interface=eth.*,ens.*
calico_ip_autodetection_method`: This parameter is used to select the interface on the node, and for pod to pod data communication across the nodes. Three methods are available to help select the data path for pods.
参见:
更新Calico,再重新检查Calico。
再在busybox中测试通过服务名访问成功。
参考文档
转载地址:https://cookcode.blog.csdn.net/article/details/109424100 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!