简单5步,轻松debug K8S服务!

组合露台
• 阅读 1621

在Kubernetes中,服务是一个核心概念。在本文中,将介绍如何调试K8S服务,这些服务是由多个Pod组成的工作负载的抽象接口(主机+端口)。

在我们深入探索debug方法之前,我们先简单回顾一下网络,这是Kubernetes服务的基础。

  • 在一个pod中的容器共享相同的网络空间和IP。
  • 所有的pod都能通过IP彼此通信。
  • 每个节点都能看到所有的Pod,反之亦然。
  • Pod可以看到所有的服务。

那么,在实践中这些意味着什么呢?

简单5步,轻松debug K8S服务!

在图中:

  • 位于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网络空间内并且你可以随意使用wegtpingnslookup之类的命令进行实验。例如,测试你的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=tinywebsitetier=frontend,这些标签与下面“described”的服务selector相匹配。

在这四个匹配的Pod中,只有三个正在运行,其IP在突出显示的行中被列为服务的端点(endpoint)。你还可以在IP列中看到相同的IP。

简单5步,轻松debug K8S服务!

Step5:确认服务端口与pod相匹配

最后,确保在你的pod中的代码能够监听到你为服务指定的targetPort(例如,你在上方截图中看到的port8001)!

这十分简单,为了让你更进一步深入了解和研究Kubernetes的网络世界,欢迎你阅读以下文章。

作者:
Ram Rai,性能、可扩展性以及软件架构的爱好者

原文链接:
https://medium.com/better-pro...

点赞
收藏
评论区
推荐文章
Prodan Labs Prodan Labs
4年前
Kubernetes Ingress — NGINX
在Kubernetes中,Service是一种抽象的概念,它定义了每一组Pod的逻辑集合和访问方式,并提供一个统一的入口,将请求进行负载分发到后端的各个Pod上。Service默认类型是ClusterIP,集群内部的应用服务可以相互访问,但集群外部的应用服务无法访问。为此Kubernetes提供了NodePorts,LoadBalan
Prodan Labs Prodan Labs
4年前
Kubernetes Pod 自动扩容 — HPA
Kubernetes增强了应用服务的横向扩容能力,在应对线上应用服务的资源使用率在高峰和低谷的时候,我们需要能够自动去感知应用的负载变化去调整Pod的副本数量,削峰填谷,提高集群的整体资源利用率和应用的服务质量。为此,Kubernetes1.2版本中引入HorizontalPodAutoscaling(HPA),它与kubectlsc
Bill78 Bill78
4年前
k8s超详细总结
一个目标:容器操作;两地三中心;四层服务发现;五种Pod共享资源;六个CNI常用插件;七层负载均衡;八种隔离维度;九个网络模型原则;十类IP地址;百级产品线;千级物理机;万级容器;相如无亿,K8s有亿:亿级日服务人次。一个目标:容器操作Kubernetes(k8s)是自动化容器操作的开源平台。这些容
Stella981 Stella981
3年前
K8s——Ingress
在Kubernetes中,服务和Pod的IP地址仅可以在集群网络内部使用,对于集群外的应用是不可见的。为了使外部的应用能够访问集群内的服务,在Kubernetes中目前提供了以下几种方案:1.NodePort2.LoadBalancer3.IngressNodePort,简单来说,就是通过service这种资源对象,为后端
Wesley13 Wesley13
3年前
K8S基础概念
一、核心概念1、NodeNode作为集群中的工作节点,运行真正的应用程序,在Node上Kubernetes管理的最小运行单元是Pod。Node上运行着Kubernetes的Kubelet、kubeproxy服务进程,这些服务进程负责Pod的创建、启动、监控、重启、销毁、以及实现软件模式的负载均衡。Node包含
Stella981 Stella981
3年前
Kubernetes Pod 故障归类与排查方法
Pod概念Pod是kubernetes集群中最小的部署和管理的基本单元,协同寻址,协同调度。Pod是一个或多个容器的集合,是一个或一组服务(进程)的抽象集合。Pod中可以共享网络和存储(可以简单理解为一个逻辑上的虚拟机,但并不是虚拟机)。Pod被创建后用一个UID来唯一标
Stella981 Stella981
3年前
K8s
kubernetes(简称 K8s)是一个开源的,用于管理云平台中多个主机上的容器化的应用。在之前的文章中,我介绍如何通过 Docker 为我们提供的实验网站 PlaywithKubernetes(PWK)来搭建 Kubernetes 集群(点击查看)。    但如果每次学习时都需要重新搭建一个 K8s 集群还是很麻烦。好在 Kubernetes 
Stella981 Stella981
3年前
Dockerfile 设置语言包
最近使用Hangfire的Dashboard, 在本地调试时,显示的是中文,但是通过docker在kubernetes上运行时,就显示成英文了,怀疑是docker运行环境中没有设计默认的语言包:我们通过命令kubectlgetpodsowide查看pod所在服务器ip在该服务器中通过命令:dockerps 查看dock
Wesley13 Wesley13
3年前
kubernetes资源对象
podPod是K8S的最小操作单元,一个Pod可以由一个或多个容器组成;整个K8S系统都是围绕着Pod展开的,比如如何部署运行Pod、如何保证Pod的数量、如何访问Pod等。特点Pod是能够被创建、调度和管理的最小单元;每个Pod都有一个独立的IP;一个Pod由一个或多个容器构成,并共享命名空间和共享存储等;Pod所有容
Stella981 Stella981
3年前
Kubernetes初学者实操教程:五步轻松调试K8s服务
下周二晚上8点,为你全面解读Istio最新发布的两个新版本!包括Istio架构演化、新架构解读以及新特性的实战demo噢!点击【阅读原文】或访问以下链接即可预约报名!http://zmz.cn/1BGJE在Kubernetes中,服务是一个核心概念。在本文中,将介绍如何调试K8S服务,这些服务是由多个Pod组成的工作负载的抽象接
Wesley13 Wesley13
3年前
K8S 容器之间通讯方式
概述首先k8s里面容器是存在于pod里面的,所以容器之间通讯,一般分为三种类型:1\.pod内部容器之间2\.pod与pod容器之间3\.pod访问service服务pod内部容器之间这种情况下容器通讯比较简单,因为k8spod内部容器是共享网络空间的,所以容器直接可以使用localhost访