官方文档
- 官方文档说明:Backend setup | Apache SkyWalking
- 官方helm源码:apache/skywalking-helm
- 官方下载(包括agent、apm):Downloads | Apache SkyWalking
部署
根据官方helm提示,选择你自己部署的方式,是放到私有仓库还是采用官方镜像仓库
服务端部署
helm配置文件
这里我们有现成的es,所以设置为false,不在部署新的es;
oap:
image:
repository: skywalking.docker.scarf.sh/apache/skywalking-oap-server
tag: 9.7.0 # Must be set explicitly
pullPolicy: Always
storageType: elasticsearch
env:
SW_CORE_RECORD_DATA_TTL: "7" # 设置记录数据的保留时间
SW_CORE_METRICS_DATA_TTL: "7" # 经过聚合处理的指标数据的保留时间
# 官方健康监测默认值是10s,太短了,会认为一直失败,导致重启
startupProbe:
tcpSocket:
port: 12800
failureThreshold: 9
periodSeconds: 30
resources:
limits:
cpu: 8
memory: 8Gi
requests:
cpu: 8
memory: 4Gi
ui:
image:
repository: skywalking.docker.scarf.sh/apache/skywalking-ui
tag: 9.7.0 # Must be set explicitly
pullPolicy: Always
ingress:
enabled: true
path: /
hosts:
- sky.example.com
elasticsearch:
enabled: false
config: # For users of an existing elasticsearch cluster,takes effect when `elasticsearch.enabled` is false
host: es.xx.xxx.com
port:
http: 80
user: "xxx" # [optional]
password: "xxx" # [optional]
如果没有现成的es,需要部署新的,配置文件如下:
oap: image: repository: skywalking.docker.scarf.sh/apache/skywalking-oap-server tag: 9.7.0 # Must be set explicitly pullPolicy: Always storageType: elasticsearch env: SW_CORE_RECORD_DATA_TTL: "7" # 设置记录数据的保留时间 SW_CORE_METRICS_DATA_TTL: "7" # 经过聚合处理的指标数据的保留时间 # 官方健康监测默认值是10s,太短了,会认为一直失败,导致重启 startupProbe: tcpSocket: port: 12800 failureThreshold: 9 periodSeconds: 30 resources: limits: cpu: 8 memory: 8Gi requests: cpu: 8 memory: 4Gi ui: image: repository: skywalking.docker.scarf.sh/apache/skywalking-ui tag: 9.7.0 # Must be set explicitly pullPolicy: Always ingress: enabled: true path: / hosts: - sky.example.com elasticsearch: enabled: true replicas: 1 minimumMasterNodes: 1 nodeGroup: "single-node" persistence: enabled: true initResources: requests: memory: 2Gi clusterHealthCheckParams: "wait_for_status=yellow&timeout=1s" volumeClaimTemplate: accessModes: [ "ReadWriteOnce" ] storageClassName: pvc-es resources: requests: storage: 512Gi
注意调整这两个参数,SW_CORE_RECORD_DATA_TTL和SW_CORE_METRICS_DATA_TTL。官方默认的是时间分别为3和7
开始部署
这里建议采用私有仓库部署,一方面是网络开销小,另一方面公有仓库存在一些问题(下面回答),这里只做demo演示,先暂时采用公有仓库部署
# helm chat 的版本
export SKYWALKING_RELEASE_VERSION=4.5.0
# helm 的 release name
export SKYWALKING_RELEASE_NAME=skywalking
# k8s 的命名空间
export SKYWALKING_RELEASE_NAMESPACE=tools
# 部署
helm install "${SKYWALKING_RELEASE_NAME}" \
oci://registry-1.docker.io/apache/skywalking-helm \
--version "${SKYWALKING_RELEASE_VERSION}" \
-n "${SKYWALKING_RELEASE_NAMESPACE}" -f ./values.yaml
这个时候,你会在k8s后台看到2个服务,一个是oap的,一个是ui的
Java项目集成
因为Java项目集成skywalking是通过agent集成的,所以需要从官网上下载agent包,对于部署方式,也存在下面几种种方式:
- agent打入dockerfile镜像;
- k8s sidecar方式,需要申请共享磁盘;
- 当然,还有一种是本地开发环境连接线上服务端的场景。
在这里我们说一下第一种方式和本地调试。
Dockerfile
准备内容:
- 从官方网站下载agent包到本地
- 可执行的Java web项目
FROM openjdk:8-jdk # 你们项目自身的环境,比如openjdk-8
LABEL maintainer="xx.xx@xxx.com"
COPY skywalking-agent-9.2.0 /opt/skywalking-agent-9.2.0
# 时区问题
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/shanghai" > /etc/timezone
VOLUME /tmp
ADD spring-web-demo-1.0.0.jar app.jar
RUN sh -c 'touch /app.jar'
RUN ls -l
RUN ls -l /opt
RUN ls -l /opt/skywalking-agent-9.2.0/
ENTRYPOINT ["sh", "-c", "java -javaagent:/opt/skywalking-agent-9.2.0/skywalking-agent.jar -Dskywalking.agent.service_name=sky-demo -Dskywalking.collector.backend_service=skywalking-skywalking-helm-oap.tools:11800 -Djava.security.egd=file:/dev/./urandom -jar /app.jar"]
参数解释:
-javaagent:/opt/skywalking-agent-9.2.0/skywalking-agent.jar:agent jar包
-Dskywalking.agent.service_name=sky-demo:skywalking中显示的服务名称
-Dskywalking.collector.backend_service=skywalking-skywalking-helm-oap.tools:11800:skywalking 服务端收集的端口
上述参数也可以通过k8s环境变量的方式实现,如下:
containers: - name: <example-name> image: <image> ports: - containerPort: <port> env: - name: VA_OPTS value: "-Dfile.encoding=utf-8 -Duser.timezone=UTC" - name: JAVA_TOOL_OPTIONS value: "-javaagent:/skywalking/agent/skywalking-agent.jar" - name: SW_AGENT_NAMESPACE value: "dev" - name: SW_AGENT_NAME value: "dev::example-name" - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES value: "skywalking-skywalking-helm-oap.skywalking.svc.cluster.local:11800"
k8s yaml文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: sky-demo
namespace: tools
labels:
app: sky-demo
spec:
replicas: 1
selector:
matchLabels:
app: sky-demo
template:
metadata:
labels:
app: sky-demo
spec:
containers:
- name: sky-demo
image: xxx/sky-demo:v1.5
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9020
resources:
requests:
memory: "512Mi"
cpu: "200m"
limits:
memory: "4Gi"
cpu: "2000m"
部署成功,即可在skywalking页面显示,下面来说另一种方式
本地调试
idea启动
以端口号为9020的商品服务为例,添加以下JVM启动参数
# skywalking客户端路径
-javaagent:E:\skywalking\skywalking-agent\skywalking-agent.jar
# 服务名称
-Dskywalking.agent.service_name=sky-demo
-Dskywalking.collector.backend_service=skywalking-skywalking-helm-oap.tools:11800
如图所示:
最终效果
该页面中包含四个标签页:Service、Topology、Trace、Log。
-
Service:微服务列表。类比eureka服务端的服务列表。在该列表中,发现其表格中包含了以下几列
-
Service Groups:服务分组。
当我们启动服务时,在JVM启动参数中为其添加了skywalking的服务名称-Dskywalking.agent.service_name=sky-demo,如果需要为该服务指定分组,则需要以 分组名::服务名 配置服务名称。
例如我们需要将商品服务的分组设置为test,则将该参数修改为-Dskywalking.agent.service_name=test::sky-demo。
-
Service Names:服务名称。
-
Load(calls/min):平均每分钟调用次数。
-
Success Rate(%):调用成功率。
-
Latency(ms):延迟。
-
apdex:应用性能指数。
-
-
Topology:服务拓扑图。
-
Trace:服务调用链路。
-
Log:服务调用日志。
查看服务实例
修改实例名称
由于skywalking生成的实例名称有默认规则,我们可以对其进行修改,以增加各个服务实例的辨识度。
在项目的JVM启动参数中添加配置:-Dskywalking.agent.instance_name=实例名称
,且可以发现实例名称支持中文
踩坑点
本地调试连接不上skywalking 服务端,就是服务怎么都注册不上去!
-
检查
skywalking-skywalking-helm-oap.skywalking.svc.cluster.local:11800
host和port是否正确 -
检查k8s的ingress是否支持grpc,并且需要在ingress和ingress controller开启grpc。
如果开启了还是注册不上去,查看日志报错信息,在java客户端,找到agent的包,里面有个logs文件夹,进去查看具体报错详情。
运行一段时间后,发现服务端起不起来
报错信息为:
table: xxx does not exist. OAP is running in 'no-init' mode, waiting...
如果采用公有的helm部署,大概率会出现这种问题
这个是由于Skywalking的TTL失效bug引起,这种情况是es做了日志保存时间策略,导致数据删除,有两种解决方案:
-
在es中删除skywalking相应的index和template,然后重启oap服务;
-
helm镜像仓库中添加以下内容:
ui-deployment.yaml文件下添加:
apiVersion: apps/v1 kind: Deployment . . {{- end }} initContainers: {{- include "skywalking.containers.wait-for-storage" . | nindent 6 }} {{- include "skywalking.containers.oap-init-job" . | nindent 6 }}
_helpers.tpl添加:
# Template for oap init job container {{- define "skywalking.containers.oap-init-job" -}} - name: oap-init-job image: {{ .Values.oap.image.repository }}:{{ required "oap.image.tag is required" .Values.oap.image.tag }} imagePullPolicy: {{ .Values.oap.image.pullPolicy }} env: - name: JAVA_OPTS value: "{{ .Values.oap.javaOpts }} -Dmode=init" {{- include "skywalking.oap.envs.storage" . | nindent 2 }} {{- range $key, $value := .Values.oap.env }} - name: {{ $key }} value: {{ $value | quote }} {{- end }} {{- end -}}
官方issue:table: alarm_record does not exist. OAP is running in ‘no-init’ mode, waiting… retry 3s later. · Issue #4938 · apache/skywalking (github.com)
k8s服务端启动过程中,每次日志信息还没加载完,就重启,并且日志没有任何报错信息
解决方案:
startupProbe.periodSeconds尽量调大一点
oap:
image:
repository: skywalking.docker.scarf.sh/apache/skywalking-oap-server
tag: 9.7.0 # Must be set explicitly
pullPolicy: Always
storageType: elasticsearch
env:
SW_CORE_RECORD_DATA_TTL: "7" # 设置记录数据的保留时间
SW_CORE_METRICS_DATA_TTL: "7" # 经过聚合处理的指标数据的保留时间
# 官方健康监测默认值是10s,太短了,会认为一直失败,导致重启
startupProbe:
tcpSocket:
port: 12800
failureThreshold: 9
periodSeconds: 30
拓展
sidecar方式
主要讲解在Kubernetes Pod initContainer 中执行Shell指令,将agent复制到共享磁盘里面,并且将 apm-trace-ignore-plugin.jar
插件拷贝至 plugins
文件夹,并配置需要忽略的路径。
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: dmp-ns1
name: daoshop-user-center
labels:
app: daoshop-user-center
spec:
selector:
matchLabels:
app: daoshop-user-center
template:
metadata:
labels:
app: daoshop-user-center
spec:
# refs: https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-initialization/
initContainers:
- name: dx-monitor-agent-sidecar
image: registry.dx.io/daocloud-dmp/dx-monitor-agent-sidecar:release-2.3.0-0b0cbd1
imagePullPolicy: IfNotPresent
# 将trace-ignore插件拷贝至`plugins`目录下。
# 添加相关配置,这里将忽略追踪 `/api/sail/**` 为前缀的URL。
command:
- "sh"
- "-c"
- >
mv /sidecar/skywalking/agent/optional-plugins/apm-trace-ignore-plugin-6.5.0-SNAPSHOT.jar /sidecar/skywalking/agent/plugins;
echo 'trace.ignore_path=${TRACE_IGNORE_PATH:/eureka/**,/api/sail/**}' >> /sidecar/skywalking/agent/config/apm-trace-ignore-plugin.config;
cp -r /sidecar /target;
volumeMounts:
- name: sidecar
mountPath: /target
containers:
- image: {{ daoshop-user-center.image }}
name: daoshop-user-center
resources:
requests:
memory: "2048Mi"
cpu: "500m"
limits:
memory: "2048Mi"
cpu: "500m"
ports:
- containerPort: 18081
env:
- name: JAVA_OPTS
value: "-javaagent:/sidecar/sidecar/skywalking/agent/skywalking-agent.jar"
- name: SW_AGENT_NAME
value: apm-demo
- name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
value: dx-skywalking-oap-ng.dx-pilot.svc:11800
volumeMounts:
- name: sidecar
mountPath: /sidecar
volumes:
- name: sidecar #共享agent文件夹
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
name: daoshop-user-center
spec:
type: NodePort
ports:
- port: 18081
selector:
app: daoshop-user-center
参考链接
skywalking_理想万岁万万岁的博客-CSDN博客