暖雪 發表於 2021-12-5 22:01:00

使用 Skywalking 对 Kubernetes(K8s)中的微服务进行监控

<p><span style="font-size: 18pt"><strong>1. 概述</strong></span></p>
<p>老话说的好:任何成功都不是轻易得来的,是不断地坚持与面对的结果。</p>
<p>&nbsp;</p>
<p>言归正传,之前我们聊了 SpringCloud 开发的微服务是如何部署在&nbsp;&nbsp;Kubernetes(K8s)集群中的,今天我们来聊聊在&nbsp;Kubernetes(K8s)集群中是如何监控这些微服务的。</p>
<p>apache 的 Skywalking 就是一个不错的选择,SkyWalking 是一个可观察性分析平台和应用程序性能管理系统,可以对微服务进行链路追踪,可以对微服务的指标进行分析,可以快速定位运行慢的服务。</p>
<p>Skywalking官网地址:https://skywalking.apache.org/</p>
<p>&nbsp;</p>
<p>今天我们就来搭建一套 Skywalking 服务,监控一下我们之前搭建在&nbsp;Kubernetes(K8s)集群中的微服务。</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt"><strong>2. 场景介绍</strong></span></p>
<p>在服务器 192.168.1.15 中,搭建并启动 Skywalking 控制台。</p>
<p>&nbsp;</p>
<p>改造之前部署的 Eureka Client 服务 和 Gateway 服务,在服务中植入 Skywalking Java 代理。</p>
<p>微服务的部署详情可参见我的上一篇文章《Kubernetes(K8s)部署 SpringCloud 服务实战》(https://www.cnblogs.com/w84422/p/15630185.html)</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt"><strong>3. Skywalking 控制台的搭建&nbsp;</strong></span></p>
<p><span style="font-size: 14pt"><strong>3.1 下载 Skywalking 控制台程序</strong></span></p>
<p>官网下载地址:https://skywalking.apache.org/downloads/</p>
<p><img src="https://img2020.cnblogs.com/blog/2513105/202112/2513105-20211204180438090-998976754.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 14pt"><strong>3.2 将程序包上传到 CentOS7 服务器,并解压</strong></span></p>
<p>这里上传到 /home 目录</p>
<p># tar -zxvf&nbsp;apache-skywalking-apm-8.8.1.tar.gz</p>
<p>&nbsp;</p>
<p><span style="font-size: 14pt"><strong>3.3 启动 Skywalking 控制台</strong></span></p>
<p><strong>注意:该服务器要预先安装 JDK8,并在环境变量中设置。</strong></p>
<p><strong>Skywalking 会占用 8080 和 11800 端口。</strong></p>
<p># cd&nbsp;/home/apache-skywalking-apm-bin/bin</p>
<p>#&nbsp;./startup.sh</p>
<p>&nbsp;</p>
<p><span style="font-size: 14pt"><strong>3.4 在浏览器访问 Skywalking 控制台&nbsp;</strong></span></p>
<p>http://192.168.1.15:8080</p>
<p><img src="https://img2020.cnblogs.com/blog/2513105/202112/2513105-20211204181125344-1164338507.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt"><strong>4. 在微服务中植入 Skywalking Java 代理</strong></span></p>
<p><span style="font-size: 14pt"><strong>4.1 概述</strong></span></p>
<p>在微服务中需要植入 Skywalking Java 代理,才能将运行数据传递给 Skywalking 控制台。</p>
<p>Skywalking 的 Java 代理,支持 java -jar、Tomcat、Docker、Kubernetes(K8s)等。</p>
<p>&nbsp;</p>
<p><span style="font-size: 14pt"><strong>4.2 java -jar 方式植入代理</strong></span></p>
<p><strong>1)首先从官网下载&nbsp;SkyWalking Java Agent 程序,上传到 CentOS7 服务器,解压</strong></p>
<p>官网下载地址:https://skywalking.apache.org/downloads/</p>
<p><img src="https://img2020.cnblogs.com/blog/2513105/202112/2513105-20211204194728316-144240078.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>2)在 CentOS7 服务器设置环境变量</strong></p>
<p>SW_AGENT_COLLECTOR_BACKEND_SERVICES:Skywalking控制台的地址,例如:192.168.1.15:11800,默认是 127.0.0.1:11800</p>
<p>&nbsp;</p>
<p><strong>3)启动微服务时,使用以下方式</strong></p>
<p>#&nbsp;java -javaagent:/path/to/skywalking-agent/skywalking-agent.jar=agent.service_name=服务的名称 -jar yourApp.jar</p>
<p>/path/to/skywalking-agent/skywalking-agent.jar 替换成真实的 SkyWalking Java Agent 所在的路径。</p>
<p>agent.service_name 是服务的名称,用于 Skywalking 控制台中的显示。</p>
<p>&nbsp;</p>
<p><span style="font-size: 14pt"><strong>4.3 Docker 中的微服务植入代理</strong></span></p>
<p><strong>1)编排 Dockerfile 文件</strong></p>
<p>将之前的&nbsp;FROM java:8 替换为&nbsp;FROM apache/skywalking-java-agent:8.5.0-jdk8 即可,其他不用动</p>
<p>&nbsp;</p>
<p><strong>2)设置环境变量</strong></p>
<p>SW_AGENT_NAME:容器中服务的名称,用于 Skywalking 控制台中的显示。</p>
<p>SW_AGENT_COLLECTOR_BACKEND_SERVICES:Skywalking控制台的地址,例如:192.168.1.15:11800,默认是 127.0.0.1:11800</p>
<p>&nbsp;</p>
<p><span style="font-size: 14pt"><strong>4.4 Kubernetes(K8s)中的微服务植入代理</strong></span></p>
<p><span style="font-size: 18px"><strong>4.4.1 重新部署&nbsp;eureka client 的 Deployment</strong></span></p>
<p><strong>1)编辑脚本</strong></p>
<p>vi eurekaclient-deployment-sw.yml</p>
<div class="cnblogs_code">
<pre>apiVersion: apps/<span style="color: rgba(0, 0, 0, 1)">v1
kind: Deployment
metadata:
name: my</span>-eureka-<span style="color: rgba(0, 0, 0, 1)">client
spec:
replicas: </span>1<span style="color: rgba(0, 0, 0, 1)">
selector:
    matchLabels:
      app: my</span>-eureka-<span style="color: rgba(0, 0, 0, 1)">client
template:
    metadata:
      labels:
      app: my</span>-eureka-<span style="color: rgba(0, 0, 0, 1)">client
    spec:
      volumes:
      </span>- name: skywalking-<span style="color: rgba(0, 0, 0, 1)">agent
          emptyDir: { }

      initContainers:
      </span>- name: agent-<span style="color: rgba(0, 0, 0, 1)">container
          image: apache</span>/skywalking-java-agent:8.7.0-<span style="color: rgba(0, 0, 0, 1)">alpine
          volumeMounts:
            </span>- name: skywalking-<span style="color: rgba(0, 0, 0, 1)">agent
            mountPath: </span>/<span style="color: rgba(0, 0, 0, 1)">agent
          command: [ </span>"/bin/sh"<span style="color: rgba(0, 0, 0, 1)"> ]
          args: [ </span>"-c", "cp -R /skywalking/agent /agent/"<span style="color: rgba(0, 0, 0, 1)"> ]

      containers:
      </span>- name: my-eureka-<span style="color: rgba(0, 0, 0, 1)">client
          image: myeurekaclient:</span>1.0<span style="color: rgba(0, 0, 0, 1)">
          volumeMounts:
            </span>- name: skywalking-<span style="color: rgba(0, 0, 0, 1)">agent
            mountPath: </span>/<span style="color: rgba(0, 0, 0, 1)">skywalking
          env:
            </span>-<span style="color: rgba(0, 0, 0, 1)"> name: JAVA_TOOL_OPTIONS
            value: </span>"-javaagent:/skywalking/agent/skywalking-agent.jar"
            -<span style="color: rgba(0, 0, 0, 1)"> name: SW_AGENT_NAME
            value: </span>"my-eureka-client"
            -<span style="color: rgba(0, 0, 0, 1)"> name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
            value: </span>"192.168.1.15:11800"</pre>
</div>
<p>脚本的大概意思是pull apache/skywalking-java-agent:8.7.0-alpine 镜像,然后挂载一个空目录,将 Skywalking 的 Java 代理程序拷贝到目录中,然后微服务的容器也去挂载这个目录,并使用里面的文件,配合环境变量向 Skywalking 控制台发送数据。</p>
<p>&nbsp;</p>
<p><strong>2)删除之前 deployment</strong></p>
<p># kubectl delete deployment&nbsp;my-eureka-client</p>
<p>&nbsp;</p>
<p><strong>3)执行脚本</strong></p>
<p>#&nbsp;kubectl apply -f eurekaclient-deployment-sw.yml</p>
<p>&nbsp;</p>
<p><span style="font-size: 18px"><strong>4.4.2 重新部署 Gateway 的&nbsp;Deployment</strong></span></p>
<p><strong>1)编辑脚本</strong></p>
<p>vi gateway-deployment-sw.yml</p>
<div class="cnblogs_code">
<pre>apiVersion: apps/<span style="color: rgba(0, 0, 0, 1)">v1
kind: Deployment
metadata:
name: my</span>-<span style="color: rgba(0, 0, 0, 1)">gateway
spec:
replicas: </span>1<span style="color: rgba(0, 0, 0, 1)">
selector:
    matchLabels:
      app: my</span>-<span style="color: rgba(0, 0, 0, 1)">gateway
template:
    metadata:
      labels:
      app: my</span>-<span style="color: rgba(0, 0, 0, 1)">gateway
    spec:
      volumes:
      </span>- name: skywalking-<span style="color: rgba(0, 0, 0, 1)">agent
          emptyDir: { }

      initContainers:
      </span>- name: agent-<span style="color: rgba(0, 0, 0, 1)">container
          image: apache</span>/skywalking-java-agent:8.7.0-<span style="color: rgba(0, 0, 0, 1)">alpine
          volumeMounts:
            </span>- name: skywalking-<span style="color: rgba(0, 0, 0, 1)">agent
            mountPath: </span>/<span style="color: rgba(0, 0, 0, 1)">agent
          command: [ </span>"/bin/sh"<span style="color: rgba(0, 0, 0, 1)"> ]
          args: [ </span>"-c", "cp -R /skywalking/agent /agent/"<span style="color: rgba(0, 0, 0, 1)"> ]

      containers:
      </span>- name: my-<span style="color: rgba(0, 0, 0, 1)">gateway
          image: mygateway:</span>1.0<span style="color: rgba(0, 0, 0, 1)">
          volumeMounts:
            </span>- name: skywalking-<span style="color: rgba(0, 0, 0, 1)">agent
            mountPath: </span>/<span style="color: rgba(0, 0, 0, 1)">skywalking
          env:
            </span>-<span style="color: rgba(0, 0, 0, 1)"> name: JAVA_TOOL_OPTIONS
            value: </span>"-javaagent:/skywalking/agent/skywalking-agent.jar"
            -<span style="color: rgba(0, 0, 0, 1)"> name: SW_AGENT_NAME
            value: </span>"my-gateway"
            -<span style="color: rgba(0, 0, 0, 1)"> name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
            value: </span>"192.168.1.15:11800"</pre>
</div>
<p>&nbsp;</p>
<p><strong>2)删除之前 deployment</strong></p>
<p># kubectl delete my-gateway</p>
<p>&nbsp;</p>
<p><strong>3)执行脚本</strong></p>
<p>#&nbsp;kubectl apply -f gateway-deployment-sw.yml</p>
<p>&nbsp;</p>
<p><span style="font-size: 18px"><strong>4.4.3 访问 Eureka Client 的简单接口</strong></span></p>
<p>GET&nbsp;http://192.168.1.12:44000/my-eureka-client/eurekaClient/hello</p>
<p>&nbsp;</p>
<p><span style="font-size: 18px"><strong>4.4.4 Skywalking Demo数据展示&nbsp;</strong></span></p>
<p>&nbsp;此时可以从 Skywalking 中看到接口的调用情况,一些指标的统计图,拓扑图、链路追踪等信息,可以帮助我们很好的监控集群,定位问题,快速的对微服务进行优化。</p>
<p><img src="https://img2020.cnblogs.com/blog/2513105/202112/2513105-20211204172646330-795395451.png"></p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;</p>
<p><img src="https://img2020.cnblogs.com/blog/2513105/202112/2513105-20211204173039494-603533987.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="https://img2020.cnblogs.com/blog/2513105/202112/2513105-20211204173123530-133379719.png"></p>
<p>&nbsp;</p>
<p>&nbsp;<img src="https://img2020.cnblogs.com/blog/2513105/202112/2513105-20211204173206277-1725674744.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="https://img2020.cnblogs.com/blog/2513105/202112/2513105-20211204172733341-2044951160.png"></p>
<p>&nbsp;</p>
<p><img src="https://img2020.cnblogs.com/blog/2513105/202112/2513105-20211204173914489-1709370358.png"></p>
<p>&nbsp;</p>
<p>&nbsp;<img src="https://img2020.cnblogs.com/blog/2513105/202112/2513105-20211204174108546-1254746493.png"></p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt"><strong>5. 综述</strong></span></p>
<p>今天聊了一下 kubernetes(k8s)集群中的微服务是如何被 Skywalking 监控的,希望可以对大家的工作有所帮助。</p>
<p>欢迎帮忙点赞、评论、转发、加关注 :)</p>
<p><strong>关注追风人聊Java,每天更新Java干货。</strong></p>
<p>&nbsp;</p>
<p><span style="font-size: 18pt"><strong>6. 个人公众号</strong></span></p>
<p>追风人聊Java,欢迎大家关注</p>
<p><img src="https://img2020.cnblogs.com/blog/2513105/202110/2513105-20211017210616465-345636021.jpg"></p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/w84422/p/15642586.html
頁: [1]
查看完整版本: 使用 Skywalking 对 Kubernetes(K8s)中的微服务进行监控