2016-03-06 30 views
3

我已经在Node.js容器前设置了一个简单的Kubernetes负载平衡器服务,它应该暴露端口80,但我无法从中获得响应。 如何调试负载平衡器如何处理端口80的请求?有我可以检查的日志吗?如何调试为什么Kubernetes负载平衡器服务未在端口上响应?

我已经设置了负载平衡器服务和复制控制器,如Kubernetes guestbook example中所述。

服务/负载均衡器的规格与此类似:

{ 
    "kind":"Service", 
    "apiVersion":"v1", 
    "metadata":{ 
     "name":"guestbook", 
     "labels":{ 
     "app":"guestbook" 
     } 
    }, 
    "spec":{ 
     "ports": [ 
     { 
      "port":3000, 
      "targetPort":"http-server" 
     } 
     ], 
     "selector":{ 
     "app":"guestbook" 
     }, 
     "type": "LoadBalancer" 
    } 
} 

至于我的托管平台,我使用AWS和OS是CoreOSα(976.0.0)。 Kubectl的版本是1.1.2。

Kubernetes信息

$ ~/.local/bin/kubectl --kubeconfig=/etc/kubernetes/kube.conf get pods 
NAME   READY  STATUS RESTARTS AGE 
busybox-sleep 1/1  Running 0   18m 
web-s0s5w  1/1  Running 0   12h 
$ ~/.local/bin/kubectl --kubeconfig=/etc/kubernetes/kube.conf get services 
NAME   CLUSTER_IP EXTERNAL_IP PORT(S) SELECTOR AGE 
kubernetes 10.3.0.1  <none>  443/TCP <none>  1d 
web   10.3.0.171 

回答

4

这里是服务的主要调试文件:

http://kubernetes.io/docs/user-guide/debugging-services/

负载平衡器创建外部资源。究竟是什么资源取决于您的云提供商 - 其中一些根本不支持它(在这种情况下,您可能想尝试使用NodePort)。

Google和Amazon都支持外部负载均衡器。总体而言,当提出这些问题时,知道您是在Google Container Engine,Google Compute Engine,Amazon Web Services,Digital Ocean,Vagrant还是其他任何应用程序上运行是非常有帮助的,因为答案取决于此。显示您的所有配置和所有现有Kubnernetes资源(kubectl get pods,kubectl get services)以及Dockerfiles或您正在使用的图像也将有所帮助。

对于谷歌(GKE或GCE),你会验证负载平衡器存在:

gcloud compute forwarding-rules list 

外部负载平衡器将80端口映射到任意节点,但随后的Kubernetes代理将其映射到一个在正确节点上的临时端口实际上有一个带有该标签的Pod,然后它将映射到容器端口。所以你必须弄清楚哪一步是行不通的。不幸的是,所有那些kube-proxy和iptables跳转都很难遵循,所以通常我会首先仔细检查我的所有Pod是否存在,并且标签与Service的选择器匹配。我会仔细检查一下,我的容器是否暴露了正确的端口,我为端口使用了正确的名称,等等。您可能需要创建一些其他可以调用服务的Pod(使用环境变量或KubeDNS,请参阅Kubernetes服务文档,如果你不知道我指的是什么),并在调试负载均衡器之前验证它是否可以在内部访问。

其他一些很好的调试步骤:

确定您的Kubernetes服务存在:

kubectl get services 
kubectl get pods 

检查荚

kubectl logs <pod name> 

检查你的服务是由印刷内部创建你的日志它的环境变量

kubectl exec <pod name> -- printenv GUESTBOOK_SERVICE_HOST 

尝试创建一个新窗格并查看是否可以通过GUESTBOOK_SERVICE_HOST和GUESTBOOK_SERVICE_PORT在内部访问该服务。

kubectl describe pod <pod name> 

会给吊舱的实例ID,您可以ssh来并运行泊坞窗和验证容器运行,重视它,等等。如果你真的想进入的IP表调试,试

sudo iptables-save 
+0

我正在使用AWS进行托管。 – aknuds1

+0

我正在尝试调试指南,但我无法在pod中运行命令,因为kubectl会挂起。 F.ex. '〜/ .local/bin/kubectl --kubeconfig = /etc/kubernetes/kube.conf exec -ti busybox-sleep sh'只是挂起,直到最终超时为'error:意外的响应状态码500(内部服务器错误) '。 – aknuds1

+0

我想出了为什么我无法使busybox工作,我必须重写Kubelet的主机名才能在AWS上工作。 – aknuds1

0

的负载平衡器的目标端口需要是端口INSIDE容器。所以在我的情况下,我需要在LoadBalancer上将targetPort设置为3000而不是80。 即使在吊舱本身,我已经将端口80映射到3000.

这对我来说非常直观,并且在所有LoadBalancer文档中都没有提及。

相关问题