通过ClusterIP/NodePort无法访问EKS中运行的valhalla-server
环境与配置信息
Pod配置
apiVersion: v1 kind: Pod metadata: name: valahalla-pod labels: app: valahalla-app-pod # Updated label name spec: containers: - name: docker-valahalla image: ghcr.io/gis-ops/docker-valhalla/valhalla env: - name: tile_urls value: "https://download.geofabrik.de/europe/andorra-latest.osm.pbf ghcr.io/gis-ops/docker-valhalla/valhalla:latest" ports: - containerPort: 8002 volumeMounts: - name: my-local-folder mountPath: /custom_files volumes: - name: my-local-folder hostPath: path: /home/ubuntu/custom_files
NodePort Service配置
apiVersion: v1 kind: Service metadata: name: valahalla-service spec: selector: app: valahalla-app-pod ports: - protocol: TCP port: 80 # Port exposed by the service targetPort: 8002 type: NodePort
排查步骤
验证标签匹配与Service端点
执行以下命令检查Service是否正确关联到Pod:kubectl describe service valahalla-service查看输出中的
Endpoints字段,如果显示<none>,说明Service的selector与Pod的labels不匹配。再用以下命令确认Pod的标签:kubectl get pods --show-labels确保Pod的
app标签值和Service的selector完全一致。确认NodePort实际暴露端口
执行命令获取Service的NodePort:kubectl get service valahalla-service输出中
NODE_PORT列的端口(通常是30000-32767范围内的数值)才是外部访问的端口,外部访问地址应为EKS节点公网IP:NODE_PORT,而非Service的port:80。检查EKS节点安全组
AWS EKS节点的安全组需要开放NodePort范围(默认30000-32767)的TCP入站流量,来源设置为你的外部IP或测试用的0.0.0.0/0。同时确认Pod所在节点拥有弹性公网IP,或通过NAT网关/负载均衡能接收外部流量。验证集群内部连通性
在集群内任意节点或Pod中,测试是否能访问Pod的服务:# 先获取Pod IP POD_IP=$(kubectl get pod valahalla-pod -o jsonpath='{.status.podIP}') curl $POD_IP:8002再进入Pod内部检查端口监听状态:
kubectl exec -it valahalla-pod -- netstat -tulpn | grep 8002确认服务正常监听8002端口。
排查网络策略与VPC配置
如果集群启用了网络策略(如Calico),检查是否有策略阻止了外部流量到Service。同时确认节点所在子网的路由表包含正确的路由规则,确保外部流量能到达节点。临时替换hostPath存储测试
当前Pod使用hostPath卷,依赖节点本地目录,可能导致调度或服务异常。可临时替换为emptyDir卷测试:volumes: - name: my-local-folder emptyDir: {}重建Pod后再次尝试外部访问,排除存储相关问题。
内容的提问来源于stack exchange,提问作者kubexplore

