使用 Skywalking 对 Kubernetes(K8s)中的微服务进行监控
1. 概述
老话说的好:任何成功都不是轻易得来的,是不断地坚持与面对的结果。
言归正传,之前我们聊了 SpringCloud 开发的微服务是如何部署在 Kubernetes(K8s)集群中的,今天我们来聊聊在 Kubernetes(K8s)集群中是如何监控这些微服务的。
apache 的 Skywalking 就是一个不错的选择,SkyWalking 是一个可观察性分析平台和应用程序性能管理系统,可以对微服务进行链路追踪,可以对微服务的指标进行分析,可以快速定位运行慢的服务。
Skywalking官网地址:https://skywalking.apache.org/
今天我们就来搭建一套 Skywalking 服务,监控一下我们之前搭建在 Kubernetes(K8s)集群中的微服务。
2. 场景介绍
在服务器 192.168.1.15 中,搭建并启动 Skywalking 控制台。
改造之前部署的 Eureka Client 服务 和 Gateway 服务,在服务中植入 Skywalking Java 代理。
微服务的部署详情可参见我的上一篇文章《Kubernetes(K8s)部署 SpringCloud 服务实战》(https://www.cnblogs.com/w84422/p/15630185.html)
3. Skywalking 控制台的搭建
3.1 下载 Skywalking 控制台程序
官网下载地址:https://skywalking.apache.org/downloads/
3.2 将程序包上传到 CentOS7 服务器,并解压
这里上传到 /home 目录
# tar -zxvf apache-skywalking-apm-8.8.1.tar.gz
3.3 启动 Skywalking 控制台
注意:该服务器要预先安装 JDK8,并在环境变量中设置。
Skywalking 会占用 8080 和 11800 端口。
# cd /home/apache-skywalking-apm-bin/bin
# ./startup.sh
3.4 在浏览器访问 Skywalking 控制台
4. 在微服务中植入 Skywalking Java 代理
4.1 概述
在微服务中需要植入 Skywalking Java 代理,才能将运行数据传递给 Skywalking 控制台。
Skywalking 的 Java 代理,支持 java -jar、Tomcat、Docker、Kubernetes(K8s)等。
4.2 java -jar 方式植入代理
1)首先从官网下载 SkyWalking Java Agent 程序,上传到 CentOS7 服务器,解压
官网下载地址:https://skywalking.apache.org/downloads/
2)在 CentOS7 服务器设置环境变量
SW_AGENT_COLLECTOR_BACKEND_SERVICES:Skywalking控制台的地址,例如:192.168.1.15:11800,默认是 127.0.0.1:11800
3)启动微服务时,使用以下方式
# java -javaagent:/path/to/skywalking-agent/skywalking-agent.jar=agent.service_name=服务的名称 -jar yourApp.jar
/path/to/skywalking-agent/skywalking-agent.jar 替换成真实的 SkyWalking Java Agent 所在的路径。
agent.service_name 是服务的名称,用于 Skywalking 控制台中的显示。
4.3 Docker 中的微服务植入代理
1)编排 Dockerfile 文件
将之前的 FROM java:8 替换为 FROM apache/skywalking-java-agent:8.5.0-jdk8 即可,其他不用动
2)设置环境变量
SW_AGENT_NAME:容器中服务的名称,用于 Skywalking 控制台中的显示。
SW_AGENT_COLLECTOR_BACKEND_SERVICES:Skywalking控制台的地址,例如:192.168.1.15:11800,默认是 127.0.0.1:11800
4.4 Kubernetes(K8s)中的微服务植入代理
4.4.1 重新部署 eureka client 的 Deployment
1)编辑脚本
vi eurekaclient-deployment-sw.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-eureka-client
spec:
replicas: 1
selector:
matchLabels:
app: my-eureka-client
template:
metadata:
labels:
app: my-eureka-client
spec:
volumes:
- name: skywalking-agent
emptyDir: { } initContainers:
- name: agent-container
image: apache/skywalking-java-agent:8.7.0-alpine
volumeMounts:
- name: skywalking-agent
mountPath: /agent
command: [ "/bin/sh" ]
args: [ "-c", "cp -R /skywalking/agent /agent/" ] containers:
- name: my-eureka-client
image: myeurekaclient:1.0
volumeMounts:
- name: skywalking-agent
mountPath: /skywalking
env:
- name: JAVA_TOOL_OPTIONS
value: "-javaagent:/skywalking/agent/skywalking-agent.jar"
- name: SW_AGENT_NAME
value: "my-eureka-client"
- name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
value: "192.168.1.15:11800"
脚本的大概意思是pull apache/skywalking-java-agent:8.7.0-alpine 镜像,然后挂载一个空目录,将 Skywalking 的 Java 代理程序拷贝到目录中,然后微服务的容器也去挂载这个目录,并使用里面的文件,配合环境变量向 Skywalking 控制台发送数据。
2)删除之前 deployment
# kubectl delete deployment my-eureka-client
3)执行脚本
# kubectl apply -f eurekaclient-deployment-sw.yml
4.4.2 重新部署 Gateway 的 Deployment
1)编辑脚本
vi gateway-deployment-sw.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-gateway
spec:
replicas: 1
selector:
matchLabels:
app: my-gateway
template:
metadata:
labels:
app: my-gateway
spec:
volumes:
- name: skywalking-agent
emptyDir: { } initContainers:
- name: agent-container
image: apache/skywalking-java-agent:8.7.0-alpine
volumeMounts:
- name: skywalking-agent
mountPath: /agent
command: [ "/bin/sh" ]
args: [ "-c", "cp -R /skywalking/agent /agent/" ] containers:
- name: my-gateway
image: mygateway:1.0
volumeMounts:
- name: skywalking-agent
mountPath: /skywalking
env:
- name: JAVA_TOOL_OPTIONS
value: "-javaagent:/skywalking/agent/skywalking-agent.jar"
- name: SW_AGENT_NAME
value: "my-gateway"
- name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
value: "192.168.1.15:11800"
2)删除之前 deployment
# kubectl delete my-gateway
3)执行脚本
# kubectl apply -f gateway-deployment-sw.yml
4.4.3 访问 Eureka Client 的简单接口
GET http://192.168.1.12:44000/my-eureka-client/eurekaClient/hello
4.4.4 Skywalking Demo数据展示
此时可以从 Skywalking 中看到接口的调用情况,一些指标的统计图,拓扑图、链路追踪等信息,可以帮助我们很好的监控集群,定位问题,快速的对微服务进行优化。
5. 综述
今天聊了一下 kubernetes(k8s)集群中的微服务是如何被 Skywalking 监控的,希望可以对大家的工作有所帮助。
欢迎帮忙点赞、评论、转发、加关注 :)
关注追风人聊Java,每天更新Java干货。
6. 个人公众号
追风人聊Java,欢迎大家关注
使用 Skywalking 对 Kubernetes(K8s)中的微服务进行监控的更多相关文章
- Kubernetes实战 - 从零开始搭建微服务 - 1.5 提高可用性-发布多节点的Node/Express网络应用程序
1.5 提高可用性-发布多节点的Node/Express网络应用程序 Kubernetes实战 - 从零开始搭建微服务 前言 在上一篇文章中,已经学习了如何简单地开发一个单层网络应用.[Kuberne ...
- Web负载均衡学习笔记之K8S内Ngnix微服务服务超时问题
0x00 概述 本文是从K8S内微服务的角度讨论Nginx超时的问题 0x01 问题 在K8S内部署微服务后,发现部分微服务链接超时,Connection Time Out. 最近碰到了一个 Ngin ...
- Docker & k8s 系列三:在k8s中部署单个服务实例
本章将会讲解: pod的概念,以及如何向k8s中部署一个单体应用实例. 在上面的篇幅中,我们了解了docker,并制作.运行了docker镜像,然后将镜像发布至中央仓库了.然后又搭建了本机的k8s环境 ...
- Kubernetes实战 - 从零开始搭建微服务 1 - 使用kind构建一个单层架构Node/Express网络应用程序
使用kind构建一个单层架构Node/Express网络应用程序 Kubernetes实战-从零开始搭建微服务 1 前言 准备写一个Kubernetes实战系列教程,毕竟cnblogs作为国内最早的技 ...
- 如何使用Istio 1.6管理多集群中的微服务?
假如你正在一家典型的企业里工作,需要与多个团队一起工作,并为客户提供一个独立的软件,组成一个应用程序.你的团队遵循微服务架构,并拥有由多个Kubernetes集群组成的广泛基础设施. 由于微服务分布在 ...
- 如何在Ruby中编写微服务?
[编者按]本文作者为 Pierpaolo Frasa,文章通过详细的案例,介绍了在Ruby中编写微服务时所需注意的方方面面.系国内 ITOM 管理平台 OneAPM 编译呈现. 最近,大家都认为应当采 ...
- 微服务日志监控与查询logstash + kafka + elasticsearch
使用 logstash + kafka + elasticsearch 实现日志监控 https://blog.csdn.net/github_39939645/article/details/788 ...
- Spring Boot (九): 微服务应用监控 Spring Boot Actuator 详解
1. 引言 在当前的微服务架构方式下,我们会有很多的服务部署在不同的机器上,相互是通过服务调用的方式进行交互,一个完整的业务流程中间会经过很多个微服务的处理和传递,那么,如何能知道每个服务的健康状况就 ...
- 基于 prometheus 的微服务指标监控
基于prometheus的微服务指标监控 服务上线后我们往往需要对服务进行监控,以便能及早发现问题并做针对性的优化,监控又可分为多种形式,比如日志监控,调用链监控,指标监控等等.而通过指标监控能清晰的 ...
随机推荐
- 2021.7.15考试总结[NOIP模拟16]
ZJ模拟D2就是NB.. T1 Star Way To Heaven 谁能想到这竟是个最小生成树呢?(T1挂分100的高人JYF就在我身边 把上边界和下边界看成一个点和星星跑最小生成树,从上边界开始跑 ...
- 主集天线和分集天线——4G天线技术
主集天线和分集天线 分集接收技术是一项主要的抗衰落技术,可以大大提高多径衰落信道传输下的可靠性,在实际的移动通信系统中,移动台常常工作在城市建筑群或其他复杂的地理环境中,而且移动的速度和方向是任意的. ...
- MiniFly四轴飞行器之部分系统及电源分析
最近硬件四轴很火,了解了很久,还是选择了MiniFly,主要还是资料多,后边可以有人讨论,不像很多就是建了个群,研究问题还是在论坛方便很多. 四轴终于拿到手,功能很强大,主要是还支持二次开发,可以研究 ...
- [LGP1866]编号
传送门 题意:找n个数,使得 $ 1 \leq a_i \leq Maxnumber_i $ 求有多少种组合 这题我们可以看到,还有一种无解的情况 我们可以先判断无解的情况 首先把Maxnumber数 ...
- 使用 ASP.NET Core 3.1 的微服务开发指南
使用 ASP.NET Core 3.1 的微服务 – 终极详细指南 https://procodeguide.com/programming/microservices-asp-net-core/ A ...
- 使用NLog把日志写入数据库并按天自动分表
前言 最近用Asp.net Core开发程序的时候 因为时间的关系,就没有过多的去关注日志方面的功能 都是直接用系统的ILogger先记录着,然后看日志的时候就先在命令行看日志 在开发阶段没有什么问题 ...
- vue中element-ui table列名lable换行问题 ---亲测
1.lable操作 :label = "'xxxxx \n xxxxx'" // 注意 lable 的: 注:双引号内有单引号,这样才可以解析文本.需要换行的文本处添加 \n 2. ...
- 简单理解函数声明(以signal函数为例)
这两天遇到一些声明比较复杂的函数,比如signal函数,那我们先简单说说signal函数的用法:(参考<c陷阱与缺陷>) [signal:几乎所有c语言程序的实现过程中都要用到signal ...
- Vue 之 Mixins (混入)的使用
是什么 混入 (mixins): 是一种分发 Vue 组件中可复用功能的非常灵活的方式.混入对象可以包含任意组件选项.当组件使用混入对象时,所有混入对象的选项将被合并到组件本身,也就是说父组件调用混入 ...
- freeswitch APR库
概述 freeswitch依赖库源代码基本都可以在libs目录下找到. 在freeswitch的官方手册中,可以找到freeswitch的依赖库表格,其中freeswitch的core核心代码依赖库主 ...