如何调试Kubernetes负载均衡器服务在端口上没有响应的原因?

时间:2016-03-06 21:48:39

标签: debugging logging kubernetes

我在Node.js容器前面设置了一个简单的Kubernetes负载均衡器服务,它应该暴露端口80,但是我无法得到响应。 如何调试负载均衡器处理端口80 请求的方式?有我可以检查的日志吗?

我已按照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,而操作系统是CoreOS alpha(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

2 个答案:

答案 0 :(得分:5)

以下是服务的主要调试文档:

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

LoadBalancer创建外部资源。这个资源到底取决于您的云提供商 - 其中一些根本不支持它(在这种情况下,您可能希望尝试使用NodePort)。

Google和亚马逊都支持外部负载均衡器。

总体而言,在询问这些问题时,了解您是在Google Container Engine,Google Compute Engine,亚马逊网络服务,数字海洋,流浪汉还是其他任何网站上运行都非常有帮助,因为答案取决于此。显示所有配置和所有现有的Kubnernetes资源(kubectl get podskubectl get services)以及您的Dockerfiles或您正在使用的图像也会有所帮助。

对于Google(GKE或GCE),您需要验证负载均衡器是否存在:

gcloud compute forwarding-rules list

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

其他一些好的调试步骤:

验证您的Kubernetes服务是否存在:

kubectl get services
kubectl get pods

检查您的广告连拍日志

kubectl logs <pod name>

通过为其打印环境变量来检查您的服务是否在内部创建

kubectl exec <pod name> -- printenv GUESTBOOK_SERVICE_HOST

尝试创建一个新的pod,看看是否可以通过GUESTBOOK_SERVICE_HOST和GUESTBOOK_SERVICE_PORT在内部访问该服务。

kubectl describe pod <pod name>

将提供pod的实例ID,您可以通过SSH连接并运行Docker并验证您的容器是否正在运行,附加到它等等。如果您真的想进入IP表调试,请尝试

sudo iptables-save

答案 1 :(得分:1)

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

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