共计 2011 个字符,预计需要花费 6 分钟才能阅读完成。
在 Kubernetes 中,服务是一个核心概念。在本文中,将介绍如何调试 K8S 服务,这些服务是由多个 Pod 组成的工作负载的抽象接口(主机 + 端口)。
在我们深入探索 debug 方法之前,我们先简单回顾一下网络,这是 Kubernetes 服务的基础。
- 在一个 pod 中的容器共享相同的网络空间和 IP。
- 所有的 pod 都能通过 IP 彼此通信。
- 每个节点都能看到所有的 Pod,反之亦然。
- Pod 可以看到所有的服务。
那么,在实践中这些意味着什么呢?
在图中:
- 位于 Pod1 中的容器 B 可以直接作为 localhost 寻址容器 A
- 容器 B 可以通过其 IP 直接寻址 Pod2(
kubectl get pod -o wide
)。我们知道当 pod2 出现故障时着不是一个可靠的通信渠道,并且一个新的 pod 可以出现在其位置中。但是我们无法追逐不断变化的目标。 - 接下来,容器 B 可以通过 Service x 访问 pod 2 和 pod 3,后者将它们的 IP 与负载均衡捆绑在一起;因此,在 K8S 上支持基于微服务的应用程序起着至关重要的作用
尽管对 Kubernetes 的内部网络结构的检查不在本文的讨论范围内,但我稍后会发布一些参考资料以供大家进一步研究。
对于当下,我还是鼓励你花费一点时间在实践中经历和理解 Kubernetes 中的网络。例如,你可以启动一个 Kubernetes 测试 pod 并且尝试从该 pod 中访问其他 pod、节点和服务。此处显示的命令将在 Pod 内弹出一个 Linux shell。
kubectl run -it networktest --image=alpine bin/ash --restart=Never --rm
现在你在 Kubernetes 网络空间内并且你可以随意使用 wegt
、ping
、nslookup
之类的命令进行实验。例如,测试你的 Kubernetes 集群中先前列出的网络要求,nslookup <servicename>, ping <PodIP>
。
现在让我们回到我们的话题,troubleshooting Kubernetes 服务,这实际上是一种网络结构。
Step1:检查服务是否存在
kubectl get svc
如果服务不存在,应该是服务创建出现了故障,因此要去检查你的服务定义。
Step2:测试你的服务
请记住,一个内部的 Kubernetes ClusterIP 服务是无法在集群外部访问的。因此,有两种方法可以对其进行测试。方法一,你可以启动一个测试 Pod,通过 SSH 进入该 pod,然后尝试像这样访问你的服务:
kubectl run -it testpod --image=alpine bin/ash --restart=Never --rm
在本文中我们启动一个 alpine Docker 镜像作为 pod 来从其内部测试服务:
#works for http services
wget <servicename>:<httpport>
#Confirm there is a DNS entry for the service!
nslookup <servicename>
或者,你可以转发到本地计算机并在本地进行测试。
kubectl port-forward <service_name> 8000:8080
现在,你可以通过 localhost:8000
访问服务。
Step3:检查服务是否 target 相关 Pod
Kubernetes 服务会根据标签 selector 将入站流量路由到其中一个 pod,流量通过其 IP 路由到目标 Pod。所以,请检查服务是否绑定到那些 pod。
kubectl describe service <service-name> | grep Endpoints
执行上述命令之后,你应该看到与列出的工作负载相关的所有 Pod 的 IP。如果没有看到,请执行 Step4。
Step4:检查 Pod 标签
确保在 Kubernetes 服务中的 selector 与 pod 的标签相匹配。
kubectl get pods --show-labels
kubectl describe svc <service_name>
从下面的截图的中可以看到,pod 的标签在右边。四个 pod 被标记为 app=tinywebsite
和tier=frontend
,这些标签与下面 “described”
的服务 selector 相匹配。
在这四个匹配的 Pod 中,只有三个正在运行,其 IP 在突出显示的行中被列为服务的端点(endpoint)。你还可以在 IP 列中看到相同的 IP。
Step5:确认服务端口与 pod 相匹配
最后,确保在你的 pod 中的代码能够监听到你为服务指定的 targetPort(例如,你在上方截图中看到的 port8001)!
这十分简单,为了让你更进一步深入了解和研究 Kubernetes 的网络世界,欢迎你阅读以下文章。
- 在 Kubernetes 中部署一个应用程序:
- Debug 服务
- Kubernetes 网络
作者:
Ram Rai,性能、可扩展性以及软件架构的爱好者原文链接:
https://medium.com/better-pro…