使用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容器的方式。

  以下也有官方文档的连接可以作为参考。

https://skywalking.apache.org/docs/skywalking-java/v9.3.0/en/setup/service-agent/java-agent/containerization/#kubernetes

 

  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

 

 

 

posted @ 2025-03-15 15:56  小家电维修  阅读(345)  评论(0)    收藏  举报