使用helm部署skywalking10.1.0版本集群
1.背景
SkyWalking 是一个用于监控微服务和分布式系统的工具。随着 Kubernetes 的普及,部署和管理 SkyWalking 变得复杂。为了简化这一过程,Helm 提供了一种方便的方式来快速安装和配置 SkyWalking。本篇文档的目的是帮助用户通过 Helm 在 Kubernetes 环境中快速部署 SkyWalking,节省手动配置和调试的时间。
其实主要是生产环境要使用集群,手动配置集群yaml太麻烦了。
2.环境信息
| 软件 | 版本 | 部署方式 |
| 阿里云ack | 1.28.9 | K8S |
| skywalking-oap | 10.1.0 | |
| skywalking-ui | 10.1.0 | |
| skywalking-java-agent | 9.3.1 | |
| elasticsearch | 7.10.0 | 服务器 |
| helm | 3.16.2 | K8S |
| helm release | skywalking-4.3.0 |
说明:
1.helm chart在部署的时候git最新版本为4.7.0,而helm仓库最新4.3.0版本,4.7.0对比4.3.0优化了很多东西,比如不需要inites,增加了多种数据库支持,这里还是选择4.3.0,因为如果自己下载4.7.0很多依赖被墙,没有必要浪费多余的时间。
2.这里skywalking-oap和ui使用集群方式部署,版本都是10.1.0,在编写此文档的时候,agent的版本最新为9.3.1
3.部署
3.1 elasticsearch
由于是边缘业务,且为了控制成本,这里使用单机版本es来存储数据,所以es需要先行安装。
3.1.1 安装 Elasticsearch
1.下载并解压安装包:
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.0-linux-x86_64.tar.gz
tar -xzf elasticsearch-7.10.0-linux-x86_64.tar.gz -C /usr/local
mv elasticsearch-7.10.0 elasticsearch
chown -R elasticsearch:elasticsearch /usr/local/elasticsearch
cd elasticsearch
2.创建用户和组
Elasticsearch 7.10 不允许以 root 用户身份运行。这是为了安全考虑,避免潜在的安全风险。为了运行 Elasticsearch,你需要以一个普通用户身份启动它。下面是如何解决 org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root 错误的方法。
创建 Elasticsearch 用户和组
你需要创建一个专用的用户和组来运行 Elasticsearch。可以使用以下命令创建这些用户和组:
sudo groupadd elasticsearch
sudo useradd -r -g elasticsearch -s /sbin/nologin elasticsearch
- -r 标志表示创建系统用户。
- -s /sbin/nologin 确保这个用户不能登录到系统中。
3.设置 Elasticsearch 目录权限
将 Elasticsearch 安装目录和数据目录的权限更改为新创建的用户和组:
mkdir /data/elasticsearch
sudo chown -R elasticsearch:elasticsearch /data/elasticsearch
请将 /data/elasticsearch 替换为 Elasticsearch 的实际安装路径。如果数据和日志目录不在默认位置,确保它们也被更改权限。
3.1.2 生成和配置 SSL 证书(可选)
Elasticsearch 启用了安全功能(xpack.security.enabled),但没有启用传输层安全(Transport Layer Security, TLS)。根据基本许可证要求,启用安全功能时,必须启用传输 SSL。
在 Elasticsearch 7.10 版本中,如果启用了安全功能(xpack.security.enabled),则必须启用传输 SSL(xpack.security.transport.ssl.enabled),即使是基本许可证。这是因为安全功能的设计初衷是确保集群内的数据传输是加密的,以保护数据的安全性。
为什么不能禁用 SSL?
1.安全要求:
启用安全功能后,Elasticsearch 要求所有节点间的通信都必须经过加密,以确保数据在网络传输过程中不被窃取或篡改。这是为了遵循安全最佳实践和保护敏感数据。
2.强制要求:
Elasticsearch 的基本许可证(Basic License)虽然不需要高级功能,但依然要求启用传输 SSL。这是为了确保基础安全性得到保证。
(这里要注意,简单来说,开启用户认证,7.10版本一定要开启SSL,否则各种报错)
使用 elasticsearch-certutil 工具生成 SSL 证书:
cd /usr/local/elasticsearch/bin
sudo ./elasticsearch-certutil cert --pem --out /usr/local/elasticsearch/config/certs/certificate-bundle.zip
sudo unzip /usr/local/elasticsearch/config/certs/certificate-bundle.zip
确保 /etc/elasticsearch/certs/ 目录及其文件的权限正确:
sudo chown -R elasticsearch:elasticsearch /usr/local/elasticsearch/config/certs/
sudo chmod -R 600 /etc/elasticsearch/certs/*
3.1.3 配置 Elasticsearch
1.编辑 config/elasticsearch.yml 配置文件,设置基本配置:
[root@iZuf61i5arceftnorr812uZ config]# cat /usr/local/elasticsearch/config/elasticsearch.yml | egrep -v "^#|^$"
cluster.name: test-ios-es #集群名称
node.name: node-1
path.data: /data/elasticsearch/data #自定义数据目录和日志目录
path.logs: /data/elasticsearch/logs
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: []
cluster.initial_master_nodes: ["node-1"] #这里因为是7.10版本,取消了配置单机的配置,初始化一个节点就是单机
#以下配置要注意,在7.10版本,如果开启用户认证,必须使用证书,不然会报错
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.certificate: /usr/local/elasticsearch/config/cert/instance.crt
xpack.security.transport.ssl.key: /usr/local/elasticsearch/config/cert/instance.key
xpack.security.transport.ssl.certificate_authorities: [ "/usr/local/elasticsearch/config/cert/ca.crt" ]
3.1.4 修改系统设置
- 文件描述符限制:
编辑 /etc/security/limits.conf,添加:
elasticsearch - nofile 65536
elasticsearch - memlock unlimited
- 虚拟内存设置:
临时增加 vm.max_map_count:
sudo sysctl -w vm.max_map_count=262144
永久设置
echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
3.1.5 创建 systemd 服务单元文件
保存以下内容为 /etc/systemd/system/elasticsearch.service
[root@iZuf61i5arceftnorr812uZ ~]# cat /usr/lib/systemd/system/elasticsearch.service
[Unit]
Description=Elasticsearch
Documentation=https://www.elastic.co
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=elasticsearch
Group=elasticsearch
ExecStart=/usr/local/elasticsearch/bin/elasticsearch
Restart=always
RestartSec=10
LimitNOFILE=65536
LimitMEMLOCK=infinity
TimeoutStopSec=30
KillSignal=SIGTERM
SendSIGKILL=no
SuccessExitStatus=143
Environment=ES_JAVA_OPTS="-Xms1g -Xmx1g"
[Install]
WantedBy=multi-user.target
3.1.6 启动并验证服务
1.重新加载 systemd 配置
sudo systemctl daemon-reload
2.启动并启用 Elasticsearch 服务
sudo systemctl start elasticsearch
sudo systemctl enable elasticsearch
3.检查服务状态
sudo systemctl status elasticsearch
4.查看日志(如果有问题)
sudo journalctl -u elasticsearch -f
3.1.7 创建认证用户(可选)
这里和3.1.2章节是联合的,开启了3.1.2的用户认证,这里必须要创建用户。有3.1.2就要配置3.1.7,否则都可以无视。
(服务启动后才可以创建用户)
1.设置用户认证和角色
初次设置时,可以使用以下命令来设置内置用户的密码
cd /usr/local/elasticsearch/bin
sudo ./elasticsearch-setup-passwords interactive
此命令将提示你为 elastic、kibana_system 等用户设置密码。
2.手动创建用户和角色
如果需要创建自定义用户和角色,可以使用以下命令
curl -u elastic:your_password -X POST "localhost:9200/_security/user/my_user?pretty" -H 'Content-Type: application/json' -d'
{
"password" : "my_password",
"roles" : [ "superuser" ],
"full_name" : "My User"
}
'
3.验证 Elasticsearch 服务
通过 curl 命令验证 Elasticsearch 是否正常启动
curl -u elastic:your_password -X GET "localhost:9200/"
你应该看到类似以下的 JSON 输出
{"name" : "node-1","cluster_name" : "my-cluster","cluster_uuid" : "your-cluster-uuid","version" : {"number" : "7.10.0","build_flavor" : "default","build_type" : "rpm","build_hash" : "your-build-hash","build_date" : "2020-11-09T15:15:07.586280Z","build_snapshot" : false,"lucene_version" : "8.7.0","minimum_wire_compatibility_version" : "6.8.0","minimum_index_compatibility_version" : "6.0.0"},"tagline" : "You Know, for Search"}
4.检查集群健康状态
可以进一步检查集群的健康状态
curl -u elastic:your_password -X GET "localhost:9200/_cluster/health?pretty"
3.2 skywalking
本次skywalking全部使用helm部署,所以必须要掌握k8s和helm基本操作。
3.2.1 skywalking介绍
a.概念
SkyWalking 是什么?
来自http://skywalking.apache.org/
多种系统的应用程序性能监视工具,专注于微服务、云架构和基于容器(Docker、K8s、Mesos)而架构设计。
提供全程追踪、服务网格遥测分析、聚焦聚合和可视化一体化解决方案。
b.功能列表
SkyWalking 有哪些功能?
来自http://skywalking.apache.org/
- 多种监控手段。可以通过语言节点和服务网格获取监控数据。
- 多个语言自动引用。包括 Java,.NET Core 和 Node.JS。
- 轻量高效。消耗大数据平台,和大量服务器资源。
- UI、存储、集群管理都有多种机制可选。
- 支持告警。
- 优秀的可视化解决方案。
c.整体架构
SkyWalking整体架构如何?
来自http://skywalking.apache.org/

整个架构,十字上、下、左、右四部分:
考虑到让描述更简单,我们放弃相关的 Metric 指标,而尝试追踪仓库的相关功能。
- 上部分Agent:负责从应用中,收集运输信息,发送给SkyWalking OAP服务器。目前支持SkyWalking、Zikpin、Jaeger等提供的跟踪数据信息。而我们目前采用的是,SkyWalking Agent收集SkyWalking Tracing数据,传递给服务器。
- 下部分SkyWalking OAP:负责接收Agent发送的Tracing数据信息,进行分析(Analysis Core),然后存储到外部存储器(Storage),最终提供查询(Query)功能。
- 右部分存储:Tracing 数据存储。目前支持 ES、MySQL、Sharding Sphere、TiDB、H2 多种存储器。而我们目前采用的是 ES ,主要考虑是 SkyWalking 开发团队自己的生产环境采用 ES 为主。
- 左部分SkyWalking UI:负责提供控台,查看物流等等。
d.官方文档
在https://github.com/apache/skywalking/tree/master/docs地址下,提供了SkyWalking的中文文档。
考虑到大多数胖友的英语水平和艿艿不相伯仲,加上上胖友一开始对SkyWalking比较陌生,所以比较推荐先阅读https://github.com/SkyAPM/document-cn-translation-of -skywalking地址,提供了SkyWalking的中文文档。
考虑到胖友使用SkyWalking的目的,是实现整个货运追踪的功能,所以最好去了解下相关的知识。这里推荐阅读两篇文章:
3.2.2 下载
首先,需要把chart包下载在本地修改,这样可以追溯配置。
下载之后包含es、skywalking-oap-server、skywalking-ui,但是不包括skywalking-agent。

随后修改成为符合命名规范的名字,查看下载之后有哪些内容,主要的配置和操作其实都是在values.yaml里面修改

3.2.3 skywalking-oap-server配置
由于配置项较多,这里拆解列出来。
3.2.3.1 es配置
1.配置elasticsearch的信息
由于不启用helm里的elasticsearch,所以elasticsearch模块以下这些配置。
需要注意的是配置elasticsearch相关信息的地方就在elasticsearch模块里,这点需要特别注意。

3.2.3.2 oap配置
1.oap基础信息设置

2.oap 探针设置
由于4.3.0版本的问题,修改探针的参数并没有在values.yaml里面,这里需要直接修改模版文件,路径在/skywalking-path/templates/oap-deployment.yaml,根据实际情况修改。

3.2.4 skywalking-ui配置
1.配置skywalking-ui
依然还在values.yaml的配置文件里,skywalking-ui的配置就比较少,基本helm都已经做好了。

3.2.5 skywalking-java-agent配置
agent需要研发协同;有两种方式,我司主要使用init容器的方式。
以下也有官方文档的连接可以作为参考。
1.dockerfile
在构建业务镜像的时候将skywalking-java-agentCOPY进去镜像进行构建
#FROM registry.openanolis.cn/openanolis/nginx:1.14.1-8.6
#ARG TEST
#RUN echo ${TEST}
#EXPOSE 80
FROM registry.cn-shanghai.aliyuncs.com/argus-platform/openjdk:17
ARG JAR_PATH
ARG XMS
ARG XMX
ARG HTTP_PORT
# 将构建时的 ARG 设置为运行时的 ENV
ENV XMS=${XMS}
ENV XMX=${XMX}
COPY ${JAR_PATH}/target/*.jar /opt/app.jar
#COPY neptune-starter/target/neptune-starter-1.0.0-SNAPSHOT.jar /home/app/app.jar
CMD ["sh", "-c", "java $JAVA_OPTS -Xms${XMS}m -Xmx${XMX}m -jar /opt/app.jar"]
#CMD ["sh", "-c", "java $JAVA_OPTS -Xms${XMS}m -Xmx${XMX}m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=200m -XX:MaxDirectMemorySize=256m -jar /opt/app.jar"]
EXPOSE ${HTTP_PORT}
2.init
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: ${PROJECT_NAME}
labels:
app: ${PROJECT_NAME}
spec:
replicas: 1
selector:
matchLabels:
app: ${PROJECT_NAME}
template:
metadata:
labels:
app: ${PROJECT_NAME}
spec:
volumes:
- name: skywalking-agent
emptyDir: {}
- name: localtime
hostPath:
path: /etc/localtime
initContainers:
- name: skywalking-agent
image: registry.cn-shanghai.aliyuncs.com/argus-platform/skywalking-java-agent:9.3.0
volumeMounts:
- name: skywalking-agent
mountPath: /agent
command: [ "/bin/sh" ]
args: [ "-c", "cp -R /skywalking/agent /agent/" ]
containers:
- name: ${PROJECT_NAME}
image: ${IMAGE}
ports:
- containerPort: ${HTTP_PORT}
name: http-port
protocol: TCP
imagePullPolicy: IfNotPresent
volumeMounts:
- name: skywalking-agent
mountPath: /skywalking
- name: localtime
mountPath: /etc/localtime
env:
- name: runtime.env
value: ${RUNTIME}
- name: runtime.region
value: CN
- name: server.port
value: "${HTTP_PORT}"
- name: TZ
value: ${TIME_ZONE}
- name: JAVA_OPTS
value: "-javaagent:/skywalking/agent/skywalking-agent.jar -Dskywalking.agent.service_name=${PROJECT_NAME}-${RUNTIME} -Dskywalking.collector.backend_service=skywalking-oap.skywalking.svc.cluster.local:11800"
envFrom:
- configMapRef:
name: ${ENV_CONFIG}
startupProbe:
failureThreshold: 3 # 允许探针失败的次数
httpGet:
httpHeaders:
- name: Accept
value: application/json
path: /actuator/health/liveness # 假设应用有专门的启动健康检查接口
port: http-port
scheme: HTTP
initialDelaySeconds: ${START_TIME} # 容器启动后立即进行检查
periodSeconds: 10 # 每 10 秒探测一次
timeoutSeconds: 3 # 探针的超时时间
livenessProbe:
failureThreshold: 3
httpGet:
httpHeaders:
- name: Accept
value: application/json
path: /actuator/health/liveness
port: http-port
scheme: HTTP
initialDelaySeconds: 30
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
readinessProbe:
failureThreshold: 3
httpGet:
httpHeaders:
- name: Accept
value: application/json
path: /actuator/health/readiness
port: http-port
scheme: HTTP
initialDelaySeconds: 30
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
resources:
limits:
cpu: ${L_CPU}m
memory: ${L_MEM}Mi
requests:
cpu: ${R_CPU}m
memory: ${R_MEM}Mi
---
apiVersion: v1
kind: Service
metadata:
name: ${PROJECT_NAME}
spec:
selector:
app: ${PROJECT_NAME}
ports:
- name: http-port # 添加 name 字段
protocol: TCP
port: ${HTTP_PORT}
targetPort: ${HTTP_PORT}
type: ClusterIP
3.2.6 skywalking验证
3.2.6.1 访问验证
验证是否部署成功,可以登录skywaling-ui来进行验证,我司pre环境skywalking可以通过域名http://skywalking-ui-cn.imilab.com/来进行验证。

通过k8s集群观察,服务是否正常

3.2.6.2 集群验证
在部署到这一步之后,我们skywalking-oap-server已经部署完成,但是是否缺少了点什么?比如是以集群模式部署的,但是根本没有配置任何集群的配置?
那是因为在很多生产环境中,后端需要支持分布式聚合、高吞吐量并提供高可用性(HA)以保持稳健性,因此你始终需要在产品环境中设置 CLUSTER 管理。否则,你将面临指标不准确的问题。
core/gRPCHost在大多数情况下,它是以监听0.0.0.0模式快速启动的。除了Kubernetes使用云原生模式建立集群的协调器外,所有其他协调器都需要core/gRPCHost更新为真实 IP 地址或参考每个协调器文档中的internalComHost说明internalComPort。
注意,集群管理不为代理和探测器提供服务发现机制。我们建议代理/探测器使用网关到负载平衡器来访问 OAP 集群。
有多种方法可以在后端管理集群。请选择最适合您需求的方法。
- Kubernetes。当后端集群部署在Kubernetes内部时,可以利用这种方式,使用k8s原生API来管理集群。
- Zookeeper 协调器。使用 Zookeeper 让后端实例相互检测和通信。
- Consul . 使用 Consul 作为后端集群管理实现者并协调后端实例。
- Etcd . 使用 Etcd 协调后端实例。
- Nacos。使用 Nacos 协调后端实例。
文件中的application.yml部分下有上述协调器的默认配置cluster。您可以在属性中指定其中任何一个selector来启用它。

参考链接:https://skywalking.apache.org/docs/main/v10.1.0/en/setup/backend/backend-cluster/
这里我们也可以登录到已经运行的pod里面查看运行中的配置,是否是kubernetes模式运行的

也可以通过kubectl describe pod来验证传入的变量是否正确。

3.2.6.3 集群索引存储时间验证
skywalking监控数据的保存时间有多少,前面演示过修改,使用env传入进来的,由于配置文件是固定的,所以也是只能查看变量。

4.FAQ
1.为什么没有选择git上最新的4.7.0版本
因为FQ原因,导致获取依赖耗时过长,所以选择helm官方最新的4.3.0版本
2.没有看到skywalking-oap-server没有集群配置,是否这个部署并不正确?
参考一下链接:https://skywalking.apache.org/docs/main/v10.1.0/en/security/readme/
因为默认helm安装使用的是kubernetes发现模式,所以这里不需要配置
3.部分配置,比如探针为什么不在value.yaml配置,而是要改模版?
可能由于改版本不完善,该负责人员没有对探针进行补充,所以需要手动改模版。
4.oap模块下的inites一定要开启吗?
对,一定要开启,并且如果是由比如8.9.1版本升级起来,需要做如下几个事情
1.清空原有es所有数据,否则排错时间会超级长(边缘业务不重要的可以清除)
2.inites第一次必须开启,否则服务启动失败;有了数据后,后期upgrade的时候可以关闭。
3.后期4.7.0版本不需要设置inites参数,helm官方已经优化完成
5.参考链接
https://skywalking.apache.org/docs/main/v10.1.0/en/security/readme/
https://github.com/apache/skywalking
https://github.com/apache/skywalking-helm/blob/v4.7.0/chart/skywalking/Chart.yaml

浙公网安备 33010602011771号