Skywalking 初试

在 Skywalking 刚发布的时候就开始关注这个玩意了,一直没有时间去测试;最近正好新项目上线,顺手把 Skywalking 搞起来了,下面简单记录一下 Kubernetes 下的安装使用。

一、先决条件

确保有一套运行正常的 Kubernetes 集群,本文默认为使用 Elasticsearch7 作为后端存储;如果想把 ES 放到 Kubernetes 集群里那么还得确保集群配置了正确的存储,譬如默认的 StorageClass 可用等。本文为了方便起见(其实就是穷)采用外部 ES 存储且使用 docker-compose 单节点部署,所以不需要集群的分布式存储;最后确保你本地的 kubectl 能够正常运行。

二、基本架构

Skywalking 在大体上(不准确)分为四大部分:

  • oap-server: 无状态服务后端,主要负责处理核心逻辑,可以简单理解为一个标准 java web 项目。
  • skywalking-ui: UI 前端,通过 graphql 连接 oap-server 提供用户查询等 UI 展示。
  • agent: 各种语言实现的 agent 负责抓取应用运行数据并上报给 oap-server,核心的指标上报来源。
  • DB: 各种数据库,负责存储 Skywalking 的指标数据,生产环境推荐 ES、TiDB、MySQL。

三、部署 Skywalking

3.1、部署 Elasticsearch

Elasticsearch 当前使用 7.9.2 版本,由于只是初次尝试还处于测试阶段所以直接 docker-compose 启动一个单点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 如果有需要可以进入 es 容器使用以下命令设置密码
# elasticsearch-setup-passwords interactive
version: '3.8'
services:
elasticsearch:
container_name: elasticsearch
image: docker.elastic.co/elasticsearch/elasticsearch:7.9.2
restart: always
network_mode: "host"
volumes:
- data:/data/elasticsearch
environment:
- http.host=172.16.11.43
- http.port=9200
- transport.tcp.port=172.16.11.43
- transport.tcp.port=9300
- cluster.name=skyes
- node.name=skyes
- discovery.type=single-node
- xpack.security.enabled=true
- xpack.monitoring.enabled=true
- "ES_JAVA_OPTS=-Xms4096m -Xmx7168m"
volumes:
data:

3.2、安装 Helm

由于 Skywalking 官方给出的 Kubernetes 安装方式为 Helm 安装,所以需要本地先安装 Helm;Helm 安装方式非常简单,根据官方文档在网络没问题的情况下直接执行以下命令即可:

1
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash

如果网络不是那么 OK 的情况下请参考官方文档的包管理器方式安装或直接下载二进制文件安装。

3.3、克隆仓库初始化 Helm

Helm 部署之前按照官方文档提示需要先初始化 Helm 仓库:

1
2
3
4
5
6
7
8
9
10
11
12
13
# clone helm 仓库
git clone https://github.com/apache/skywalking-kubernetes
cd skywalking-kubernetes/chart

# 即使使用外部 ES 也要添加这个 repo,否则会导致依赖错误
helm repo add elastic https://helm.elastic.co
helm dep up skywalking

# change the release name according to your scenario
export SKYWALKING_RELEASE_NAME=skywalking
# 如果修改了 NAMESPACE,后续部署则需要先通过 kuebctl 创建该 NAMESPACE
# change the namespace according to your scenario
export SKYWALKING_RELEASE_NAMESPACE=default

3.4、安装 Skywalking

Helm 初始化完成后需要自行调整配置文件,配置 oap-server 使用外部 ES

values-my-es.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
oap:
image:
tag: 8.1.0-es7 # Set the right tag according to the existing Elasticsearch version
storageType: elasticsearch7

ui:
image:
tag: 8.1.0

elasticsearch:
enabled: false
config: # For users of an existing elasticsearch cluster,takes effect when `elasticsearch.enabled` is false
host: 172.16.11.43
port:
http: 9200
user: "elastic"
password: "elastic"

调整好配置后只需要使用 Helm 安装即可:

1
2
helm install "${SKYWALKING_RELEASE_NAME}" skywalking -n "${SKYWALKING_RELEASE_NAMESPACE}" \
-f ./skywalking/values-my-es.yaml --set oap.image.tag=8.2.0-es7 --set ui.image.tag=8.2.0

如果安装出错或者其他问题可以使用以下命令进行卸载:

1
helm uninstall "${SKYWALKING_RELEASE_NAME}" skywalking -n "${SKYWALKING_RELEASE_NAMESPACE}"

安装成功后应该在 ${SKYWALKING_RELEASE_NAMESPACE} 下看到相关 Pod:

1
2
3
4
5
6
k8s21 ➜  ~ kubectl get pod -o wide -n skywalking
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
skywalking-es-init-xw6tx 0/1 Completed 0 32h 10.30.0.62 k8s21 <none> <none>
skywalking-oap-64c65cc6bb-lnq82 1/1 Running 0 32h 10.30.0.61 k8s21 <none> <none>
skywalking-oap-64c65cc6bb-q7zj8 1/1 Running 0 32h 10.30.32.103 k8s22 <none> <none>
skywalking-ui-695ff9d69d-wqcm8 1/1 Running 0 32h 10.30.161.42 k8s25 <none> <none>

在确认 Pod 都运行正常后可以通过 kubectl port-forward 命令来查看 UI 界面:

1
2
# 执行以下命令,访问 127.0.0.1:8080 即可访问到 skywalking-ui
kubectl port-forward -n ${SKYWALKING_RELEASE_NAMESPACE} service/skywalking-ui 8080:80

在生产环境可能需要配置正确的 Ingress 或者 NodePort 等方式暴露 skywalking-ui 服务,具体取决于生产集群服务暴露方式,请自行调整。

四、Agent 配置

由于目前仅在 Java 项目上测试,所以以下 Agent 配置仅仅对 Java 项目有效。

Skywalking 在简单使用时不需要侵入代码,对于 jar 包启动的项目只需要在启动时增加 -javaagent 选项即可。

4.1、Agent 获取

javaagent 可以通过下载对应的 skywalking release 安装包获取,将此 agent 目录解压到任意位置,稍后将添加到 java 启动参数。

agent_dir

4.2、Agent 配置

Agent 主配置文件存放在 config/agent.config 配置文件中,配置文件内支持环境变量读取,可以自行添加其他配置和引用其他变量;通常这个配置文件在容器化时有两种选择,一种是创建 ConfigMap,然后通过 ConfigMap 挂载到容器里进行覆盖;另一种是在默认配置里引用各种变量,在容器启动时通过环境变量注入。这里暂时使用环境变量注入的方式:

agent.config

agent.config

deployment.yml

deployment.yml

调整完成后,应用运行一段时间后应该能在 UI 中看到数据

skwalking-ui

五、注意事项

  • 默认情况下 Helm 相关命令执行缓慢,可能需要设置 http(s)_proxy ...( _ _)ノ|壁(自行体会这个表情)
  • Skywalking 镜像一般比较大,下载缓慢,推荐预先拉取好然后 load 到每个节点
  • ES 如果设置了密码,不要忘记在 Helm 安装时调整好密码配置
  • jar 包启动时 -javaagent 不能放在 -jar 选项之后,否则可能不生效
  • 集群内连接 oap-server 推荐通过 skywalking-oap.skywalking.svc.cluster.local 域名服务发现方式寻址

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 国际许可协议进行许可,转载请注明出处。