如何调试 Kubernetes 负载均衡服务在某个端口上无响应的问题?

9
我在一个Node.js容器前设置了一个简单的Kubernetes负载均衡器服务,应该暴露端口80,但我无法得到响应。如何调试负载均衡器处理端口80请求的过程? 是否有日志可以检查?
我已按照 Kubernetes留言板示例中的说明设置了负载均衡器服务和复制控制器。
服务/负载均衡器规范类似于此:
{
   "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个回答

8
这是服务主要调试文档:

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

LoadBalancer创建了一个外部资源。这个资源的具体内容取决于您的云提供商-其中一些根本不支持它(在这种情况下,您可能需要尝试使用NodePort)。
谷歌和亚马逊都支持外部负载均衡器。
总的来说,当询问这些问题时,非常有帮助的是知道您是否在Google容器引擎,Google计算引擎,Amazon Web Services,Digital Ocean,Vagrant或其他平台上运行,因为答案取决于这一点。同时展示您所有的配置和现有的Kubnernetes资源(kubectl get podskubectl get services),以及您的Dockerfiles或正在使用哪些镜像也会有所帮助。
对于Google(GKE或GCE),您需要验证负载均衡器是否存在:
gcloud compute forwarding-rules list

外部负载均衡器将端口80映射到任意一个Node上,但是Kubernetes代理将其映射到正确的Node上的短暂端口,该Node实际上具有带有该标签的Pod,然后它将映射到容器端口。因此,您必须找出哪个步骤不起作用。不幸的是,所有这些kube-proxy和iptables跳跃都很难理解,所以通常我会首先仔细检查所有的Pod是否存在,并且标签与Service的选择器相匹配。我会再次确认我的容器是否正在公开正确的端口,我是否使用了正确的端口名称等。在调试负载平衡器之前,您可能需要创建一些其他的Pod,这些Pod只需调用Service(使用环境变量或KubeDNS,请参阅Kubernetes服务文档,如果您不知道我在指什么)并验证其是否内部可访问。

其他一些好的调试步骤:

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

kubectl get services
kubectl get pods

检查您的 Pod 的日志

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
我正在使用AWS进行托管。 - aknuds1
我正在尝试使用调试指南,但是由于 kubectl 会一直挂起,所以我无法在 Pod 中运行命令。例如:~/.local/bin/kubectl --kubeconfig=/etc/kubernetes/kube.conf exec -ti busybox-sleep sh 会一直挂起,最终超时并出现 error: unexpected response status code 500 (Internal Server Error) 的错误提示。 - aknuds1
我找出了为什么我无法让busybox工作的原因,我必须覆盖Kubelet的主机名才能在AWS上运行。 - aknuds1
那么,我如何检查LoadBalancer是否为我在AWS创建了外部负载均衡器?它应该做什么?此外,与调试文档所述不同,没有为“KUBE-PORTALS-CONTAINER”或“KUBE-PORTALS-HOST”制定任何iptables规则。因此,我想这可能是一个故障。 - aknuds1

2
负载均衡器的目标端口需要是容器内部的端口,所以在我的情况下,我需要将目标端口设置为3000而不是80。即使在pod本身上已经将端口80映射到了3000。这对我来说非常反直觉,并且在所有负载均衡器文档中都没有提到。

请问您能否在文档上开启一个拉取请求? - Shani C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接