简单5步,轻松debug K8S服务!
作者:
Ram Rai,性能、可扩展性以及软件架构的爱好者原文链接:
https://medium.com/better-programming/debug-your-kubernetes-service-in-5-easy-steps-1457974f024c
在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的网络世界,欢迎你阅读以下文章。
简单5步,轻松debug K8S服务!的更多相关文章
- 无需手动输入命令,简单3步即可在K8S集群中启用GPU!
随着全球各大企业开始广泛采用Kubernetes,我们看到Kubernetes正在向新的阶段发展.一方面,Kubernetes被边缘的工作负载所采用并提供超越数据中心的价值.另一方面,Kubernet ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(四)——一步一步教你如何撸Dapr之订阅发布
之前的章节我们介绍了如何通过dapr发起一个服务调用,相信看过前几章的小伙伴已经对dapr有一个基本的了解了,今天我们来聊一聊dapr的另外一个功能--订阅发布 目录:一.通过Dapr实现一个简单的基 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(三)——一步一步教你如何撸Dapr
目录:一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实现一个简单的基于.net的微服务电商系统(二)--通讯框架讲解 三.通过Dapr实现一个简单的基于.net的微服务电 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(八)——一步一步教你如何撸Dapr之链路追踪
Dapr提供了一些开箱即用的分布式链路追踪解决方案,今天我们来讲一讲如何通过dapr的configuration来实现非侵入式链路追踪的 目录:一.通过Dapr实现一个简单的基于.net的微服务电商系 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(九)——一步一步教你如何撸Dapr之OAuth2授权
Oauth2授权,熟悉微信开发的同学对这个东西应该不陌生吧.当我们的应用系统需要集成第三方授权时一般都会做oauth集成,今天就来看看在Dapr的语境下我们如何仅通过配置无需修改应用程序的方式让第三方 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十)——一步一步教你如何撸Dapr之绑定
如果说Actor是dapr有状态服务的内部体现的话,那绑定应该是dapr对serverless这部分的体现了.我们可以通过绑定极大的扩展应用的能力,甚至未来会成为serverless的基础.最开始接触 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十一)——一步一步教你如何撸Dapr之自动扩/缩容
上一篇我们讲到了dapr提供的bindings,通过绑定可以让我们的程序轻装上阵,在极端情况下几乎不需要集成任何sdk,仅需要通过httpclient+text.json即可完成对外部组件的调用,这样 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(五)——一步一步教你如何撸Dapr之状态管理
状态管理和上一章的订阅发布都算是Dapr相较于其他服务网格框架来讲提供的比较特异性的内容,今天我们来讲讲状态管理. 目录:一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(六)——一步一步教你如何撸Dapr之Actor服务
我个人认为Actor应该是Dapr里比较重头的部分也是Dapr一直在讲的所谓"stateful applications"真正具体的一个实现(个人认为),上一章讲到有状态服务可能很 ...
随机推荐
- Django模板之模板变量过滤器
在Django的模板语言中,通过使用 过滤器 来改变变量的显示:Django的模板语言中提供了大约六十个内置过滤器. 过滤器规则: · 过滤器的语法: {{ value|filter_ ...
- flask之gevent-websocket的IO多路复用长连接通信
本节目录: (一)笔记总结: (二)gevent-websocket+flask+javascript实现WS即时通信 (1)无昵称群聊 (2)有昵称群聊 (3)私聊 三种通信模型简述: (1)轮询: ...
- Django之urls.py路由配置(URLConf)
urls.py路由配置(URLConf) URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表. 基本格式: Django1.x版本 ...
- DPDK IP分片及重组库(学习笔记)
1 前置知识学习 1.1 MTU MTU是最大传输单元( Maximum Transmission Unit)的缩写,指一个接口无需分片所能发送的数据包的最大字节数. MTU范围在46 ~ 1500 ...
- mysql 一台服务器中装两个mysql
个人经验: 服务器中已有mysql5.0 现要安装mysql5.5 下载安装包,安装后,mysql5.5中没有my.ini文件,就在我自己的电脑上复制了mysql5.5的my.ini文件进去. 1.在 ...
- Spring 由构造函数自动装配
Spring 由构造函数自动装配,这种模式与 byType 非常相似,但它应用于构造器参数. Spring 容器看作 beans,在 XML 配置文件中 beans 的 autowire 属性设置为 ...
- Hyperledger Fabric——balance transfer(二)注册用户
详细分析blance transfer示例的用户注册(register)与登录(enroll)功能. 源码分析 1.首先分析项目根目录的app.js文件中关于用户注册和登录的路由函数.注意这里的tok ...
- oracle计算两日期相差多少秒,分钟,小时,天,周,月,年
--计算两个时间差相差多少秒select ceil((sysdate-t.transdate)* 24 * 60 * 60),t.transdate,sysdate from esc_trans_lo ...
- jupyter 文件夹重命名
jupyter 文件夹 如何重命名嘞?可能很多童鞋没找到吧,哈哈哈 我们先创建一个文件夹,如何创建嘞,往下看. 然后我们就可以看到, 如何重命名呐,注意注意了啊,选中你创建的文件夹,单击Rename. ...
- Asp.net core logging 日志
1 基本概念 Dotnet core 一个重要的特征是 Dependency injection ,中文一般是依赖注入,可以简单理解为一个集合,在应用程序启动时,定义各种具体的实现类型并将其放到集合中 ...