Kubernetes

k8s 部署 skywalking

SkyWalking 是个啥?


想象一下,你家有个超级复杂的快递网络,包裹从A点到B点要经过好几个中转站。如果包裹送晚了,你咋知道是哪个环节出了问题?SkyWalking 就是干这个的!它是一个专门为分布式系统(比如微服务架构)设计的 监控工具,能帮你追踪每个请求的“旅程”,告诉你哪里卡住了、哪里出错了。

简单说,SkyWalking 是个“全能侦探”:

  • 追踪请求:告诉你一个请求从前端到后端跑了哪些服务,花了多少时间。
  • 监控性能:看看你的系统有多快,哪里拖后腿。
  • 画关系图:自动生成一张图,告诉你服务之间咋“勾搭”的。
  • 报警:系统出问题时,它会“喊”你赶紧修!

它由 Apache 基金会 开发,完全免费,还支持 Java、Python、Node.js 等多种语言,特别适合微服务、云原生这些时髦玩意儿。

  

SkyWalking 能帮你干啥?


SkyWalking 就像给你的系统装了个高清摄像头,以下是它的几个“绝活”:

  • 追踪请求,像看侦探片
假设你在网上买了个东西,点“下单”后,请求得跑好几个服务:前端 → 订单服务 → 支付服务 → 库存服务。如果页面半天没反应,你咋知道是哪个服务“偷懒”了?SkyWalking 会把这个请求的“旅行路线”画出来,告诉你每个服务花了多久,哪个环节卡住了。比如,它会说:“嘿,支付服务用了2秒,太慢了!”
  • 抓性能问题,揪出“慢吞吞”
SkyWalking 能实时盯着你的系统,告诉你:

哪个接口响应慢得像乌龟?

系统一秒能处理多少请求?

哪个服务老是报错? 这些数据都用图表展示,简单明了,找到问题就像找自家钥匙一样快。
  • 画张“关系网”,看清谁靠谁
SkyWalking 还能自动生成一张“关系图”,告诉你系统里每个服务跟谁有“来往”。比如,订单服务依赖支付服务,支付服务又依赖数据库,这张图会清清楚楚画出来,连哪个环节慢了、错多了都标得明明白白。
  • 出问题就喊你
你总不想半夜被老板叫起来修 Bug 吧?SkyWalking 支持设置告警,比如接口响应时间超过1秒,或者错误率飙升,它会通过邮件、钉钉啥的提醒你:“快来,系统要炸了!”
  • 跟云原生“玩得转”
如果你用 Kubernetes 或者 Istio 这种云原生技术,SkyWalking 也能无缝配合,监控服务网格里的性能,简直不要太香。

 

SkyWalking 咋工作?


SkyWalking 就像个高效的“监控团队”,分成几部分干活:

  • 探针(Agent)
探针就像装在你程序里的“小间谍”,悄悄收集数据(比如请求时间、错误信息),然后发给后端。装探针超简单,比如 Java 程序只要加个启动参数就行,基本不用改代码。
  • 核心大脑(OAP)
OAP 是 SkyWalking 的“大脑”,负责处理探针传来的数据,分析、计算、存起来。它还能跟各种存储“搭伙”,比如 Elasticsearch、MySQL。
  • 存储库
监控数据得有个地方存吧?SkyWalking 支持用 Elasticsearch(适合大项目)、MySQL(中小项目)甚至 H2(测试用)来存数据,随你挑。
  • 炫酷界面(Web UI)
SkyWalking 提供一个网页界面,打开就能看到请求路径、性能图表、服务关系图,简直像在玩“系统监控游戏”!

 

SkyWalking docker 安装


下载镜像

docker pull apache/skywalking-oap-server:9.5.0

docker pull apache/skywalking-ui:9.5.0

启动skywalking-oap,这里 默认使用的H2存储,即数据存储在内存中,容器重启数据就没有了。

docker run -d --name skywalking-oap \
  -p 12800:12800 -p 11800:11800 \
  apache/skywalking-oap-server:9.5.0

启动skywalking-ui

docker run -d --name skywalking-ui \
  --link skywalking-oap:skywalking-oap \
  -e SW_OAP_ADDRESS=http://skywalking-oap:12800 \
  -e TZ=Asia/Shanghai \
  -p 8088:8080 \
  apache/skywalking-ui:9.5.0

Node.js应用接入Skywalking实现APM监控

Node.js应用接入,Skywalking 官方提供新的库来接入,原来的模块是 SkyAPM-nodejs 已经不用了,使用新的库 skywalking-backend-js ,官方要求 SkyWalking backend (OAP) 8.0+ and NodeJS >= 10. 支持已下框架和模块,更多信息查看 README.md
// 安装 skywalking-backend-js 模块
npm install skywalking-backend-js


nodejs 代码
// 引入 SkyWalking 代理
const {default: agent} = require('skywalking-backend-js');

agent.start({ 
    serviceName: 'service-notification',
    collectorAddress: '192.168.3.5:11800' // SkyWalking OAP 服务地址(默认值,可根据实际修改)
})

const express = require('express')
const query = require('./db');
const axios = require('axios');

skywalking-ui的视图

  

SkyWalking k8s 安装


创建skywalking命名空间

kubectl create namespace skywalking  

创建 skywalking-oap-deployment

# skywalking-oap-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: skywalking-oap
  namespace: skywalking
  labels:
    app: skywalking-oap
spec:
  replicas: 1
  selector:
    matchLabels:
      app: skywalking-oap
  template:
    metadata:
      labels:
        app: skywalking-oap
    spec:
      containers:
      - name: skywalking-oap
        image: apache/skywalking-oap-server:9.5.0
        ports:
        - containerPort: 12800
          name: rest
        - containerPort: 11800
          name: grpc
kubectl apply -f skywalking-oap-deployment.yaml -n skywalking

创建 skywalking-oap-service 暴露服务

# skywalking-oap-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: skywalking-oap
  namespace: skywalking
spec:
  selector:
    app: skywalking-oap
  ports:
    - protocol: TCP
      port: 12800
      targetPort: 12800
      name: rest
    - protocol: TCP
      port: 11800
      targetPort: 11800
      name: grpc
kubectl apply -f skywalking-oap-service.yaml -n skywalking

创建 skywalking-ui-deployment

# skywalking-ui-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: skywalking-ui
  namespace: skywalking
  labels:
    app: skywalking-ui
spec:
  replicas: 1
  selector:
    matchLabels:
      app: skywalking-ui
  template:
    metadata:
      labels:
        app: skywalking-ui
    spec:
      containers:
      - name: skywalking-ui
        image: apache/skywalking-ui:9.5.0
        ports:
        - containerPort: 8080
        env:
        - name: SW_OAP_ADDRESS
          value: "http://skywalking-oap:12800"
        - name: TZ
          value: "Asia/Shanghai"
kubectl apply -f skywalking-ui-deployment.yaml -n skywalking

创建 skywalking-ui-service 暴露服务

# skywalking-ui-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: skywalking-ui
  namespace: skywalking
spec:
  type: NodePort
  selector:
    app: skywalking-ui
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
      nodePort: 30088
kubectl apply -f skywalking-ui-service.yaml -n skywalking

修改nodejs代码

nodejs 代码
// 引入 SkyWalking 代理
const {default: agent} = require('skywalking-backend-js');

agent.start({ 
    serviceName: 'service-notification',
    // 跨命名空间访问时,使用 Service 的全域名(如 skywalking-oap.skywalking.svc.cluster.local:11800),这是 k8s 集群内的标准 DNS 解析方式。
    collectorAddress: 'skywalking-oap.skywalking.svc.cluster.local:11800' 
})

const express = require('express')
const query = require('./db');
const axios = require('axios');