如何调试不正确服务的Kubernetes服务端点?

时间:2018-03-05 21:42:25

标签: kubernetes

我已经建立了一个Kubernetes集群。该集群包含一个集群和部署API Web服务的部署(基于subway-explorer-gmaps-proxy容器)。

我已使用LoadBalancer服务类型(在GCP上)在外部部署了服务:

$kubectl get svc subway-explorer-gmaps-proxy-service
NAME                                  TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
subway-explorer-gmaps-proxy-service   LoadBalancer   10.35.252.232   35.224.78.225   9000:31396/TCP   19h

我的理解(如果我错了,请纠正我!)现在,通过访问浏览器中的http://35.224.78.225,此服务现在可以在群集外查询。

在本地运行Docker容器时,我可以通过导航到以下URL来验证操作是否正常:

http://localhost:49161/starting_x=-73.954527&starting_y=40.587243&ending_x=-73.977756&ending_y=40.687163

查看kubectl get输出,我希望在浏览器中访问以下网址会为我提供我正在寻找的内容:

http://35.224.78.225:31396/starting_x=-73.954527&starting_y=40.587243&ending_x=-73.977756&ending_y=40.687163

但是当我访问此网址时,没有任何内容可供使用。

我怀疑部署配置中存在非致命错误。调试这种有效调试方法的有效方法是什么?是否有访问日志或stdout信息流,我可以查看哪些内容有误?

2 个答案:

答案 0 :(得分:2)

您可以尝试运行有关调试服务的官方文档:https://kubernetes.io/docs/tasks/debug-application-cluster/debug-service/

除此之外,你确认你在正确的端口上查询负载均衡器吗?虽然我没有在GCP上部署,但是当在AWS上为kubernetes服务启动负载均衡器时,它会接受端口80/443上的流量并将其转发到服务的NodePort,我就是这样做的。猜测是31396为您的情况。 kubectl get svc subway-explorer-gmaps-proxy-service -o yaml中列出了哪些端口?

答案 1 :(得分:0)

我没有意识到Google Cloud有一个单独的防火墙系统,这与Kubernetes管理的连接设置不同。为了将应用程序暴露给外部世界(例如,Web浏览器),我需要修改Google Cloud Firewall规则(例如,参见this answer如何)

要测试应用程序是否在Kubernetes端运行,您无需修改​​云防火墙规则。而是从群集上的不同窗格运行wgetcurl或某些类似的数据检索命令,指向感兴趣的窗格的内部IP地址和端口号。

例如。 "你好世界" Kubernetes文档使用的pod是busybox pod(已定义here)。通过在我的群集中创建此pod,然后运行以下命令:

kubectl exec busybox -c busybox -- wget "10.35.249.23:9000"

我能够在 Kubernetes中确认该服务正常运行。您还可以使用在底层操作系统中定义wget的任何其他窗格,我刚刚使用busybox,因为我的所有其他窗格都使用了谷歌的容器优化操作系统,它没有使用包括它。

最后,出于调试的目的,我继续向我的API应用程序服务添加/status端点,该服务在核心服务正常工作时提供{"status": "OK"}。我建议在其他应用程序中使用此模式,因为它提供了一个简单的端点,您可以进行测试以确保Web服务器至少响应输入。就我而言,我发现/status页面没问题,但是API调用失败了,这使我可以将问题缩小到由不良凭据密钥导致的未解决的Promise。