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 |
|
3.2、安装 Helm
由于 Skywalking 官方给出的 Kubernetes 安装方式为 Helm 安装,所以需要本地先安装 Helm;Helm 安装方式非常简单,根据官方文档在网络没问题的情况下直接执行以下命令即可:
1 |
|
如果网络不是那么 OK 的情况下请参考官方文档的包管理器方式安装或直接下载二进制文件安装。
3.3、克隆仓库初始化 Helm
Helm 部署之前按照官方文档提示需要先初始化 Helm 仓库:
1 |
|
3.4、安装 Skywalking
Helm 初始化完成后需要自行调整配置文件,配置 oap-server 使用外部 ES
values-my-es.yaml
1 |
|
调整好配置后只需要使用 Helm 安装即可:
1 |
|
如果安装出错或者其他问题可以使用以下命令进行卸载:
1 |
|
安装成功后应该在 ${SKYWALKING_RELEASE_NAMESPACE}
下看到相关 Pod:
1 |
|
在确认 Pod 都运行正常后可以通过 kubectl port-forward
命令来查看 UI 界面:
1 |
|
在生产环境可能需要配置正确的 Ingress 或者 NodePort 等方式暴露 skywalking-ui 服务,具体取决于生产集群服务暴露方式,请自行调整。
四、Agent 配置
由于目前仅在 Java 项目上测试,所以以下 Agent 配置仅仅对 Java 项目有效。
Skywalking 在简单使用时不需要侵入代码,对于 jar 包启动的项目只需要在启动时增加 -javaagent
选项即可。
4.1、Agent 获取
javaagent
可以通过下载对应的 skywalking release 安装包获取,将此 agent
目录解压到任意位置,稍后将添加到 java 启动参数。
4.2、Agent 配置
Agent 主配置文件存放在 config/agent.config
配置文件中,配置文件内支持环境变量读取,可以自行添加其他配置和引用其他变量;通常这个配置文件在容器化时有两种选择,一种是创建 ConfigMap,然后通过 ConfigMap 挂载到容器里进行覆盖;另一种是在默认配置里引用各种变量,在容器启动时通过环境变量注入。这里暂时使用环境变量注入的方式:
agent.config
deployment.yml
调整完成后,应用运行一段时间后应该能在 UI 中看到数据
五、注意事项
- 默认情况下 Helm 相关命令执行缓慢,可能需要设置
http(s)_proxy
...( _ _)ノ|壁
(自行体会这个表情) - Skywalking 镜像一般比较大,下载缓慢,推荐预先拉取好然后 load 到每个节点
- ES 如果设置了密码,不要忘记在 Helm 安装时调整好密码配置
- jar 包启动时
-javaagent
不能放在-jar
选项之后,否则可能不生效 - 集群内连接 oap-server 推荐通过
skywalking-oap.skywalking.svc.cluster.local
域名服务发现方式寻址