我在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。
$ ~/.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
答案 0 :(得分:5)
以下是服务的主要调试文档:
http://kubernetes.io/docs/user-guide/debugging-services/
LoadBalancer创建外部资源。这个资源到底取决于您的云提供商 - 其中一些根本不支持它(在这种情况下,您可能希望尝试使用NodePort)。
Google和亚马逊都支持外部负载均衡器。
总体而言,在询问这些问题时,了解您是在Google Container Engine,Google Compute Engine,亚马逊网络服务,数字海洋,流浪汉还是其他任何网站上运行都非常有帮助,因为答案取决于此。显示所有配置和所有现有的Kubnernetes资源(kubectl get pods
,kubectl get services
)以及您的Dockerfiles或您正在使用的图像也会有所帮助。
对于Google(GKE或GCE),您需要验证负载均衡器是否存在:
gcloud compute forwarding-rules list
外部负载均衡器会将端口80映射到任意节点,但是Kubernetes代理会将其映射到实际上具有该标签的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文档中都没有提及。