k8s部署skywalking(helm)

news2024/12/25 9:20:44

官方文档

  • 官方文档说明: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博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1663955.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业网站从传统服务器迁移到弹性云有什么优势呢?

现代企业对于网站和应用程序的可用性和性能要求越来越高&#xff0c;传统基础设施可能无法满足这些需求。弹性云作为一种新兴的云计算服务模式&#xff0c;对于企业网站的运行和管理带来了许多优势。下面是企业网站从传统服务器迁移到弹性云的五大优势&#xff1a; 灵活弹性&a…

【Qt 学习笔记】Qt常用控件 | 多元素控件 | Tree Widget的说明及介绍

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 多元素控件 | Tree Widget的说明及介绍 文章编号&#x…

Unable to locate the .NET SDK

问题描述&#xff1a; vs2019 加载项目时&#xff0c;提示如下&#xff1a; Unable to locate the .NET SDK as specified by global.json, please check that the specified version is installed. 项目中没有globan找al.json 文件 先使用&#xff1a; dotnet --list-sdks 命…

使用 docker-compose 搭建个人博客 Halo

说明 我这里使用的是 Halo 作为博客的工具&#xff0c;毕竟是开源了&#xff0c;也是使用 Java 写的嘛&#xff0c;另外一点就是使用 docker 来安装&#xff08;自动挡&#xff0c;不用自己考虑太多的环境因素&#xff09;&#xff0c;这样子搭建起来更快一点&#xff0c;我们…

SpringCloudAlibaba:5.1Sentinel的基本使用

概述 简介 Sentinel是阿里开源的项目&#xff0c;提供了流量控制、熔断降级、系统负载保护等多个维度来保障服务之间的稳定性。 官网 https://sentinelguard.io/zh-cn/ Sentinel的历史 2012 年&#xff0c;Sentinel 诞生&#xff0c;主要功能为入口流量控制。 2013-2017 年…

[ue5]编译报错:使用未定义的 struct“FPointDamageEvent“

编译报错&#xff0c;错误很多&#xff0c;但很明显核心问题是第一个&#xff1a;使用未定义的 struct“FPointDamageEvent“&#xff1a; 程序没有找到FPointDamageEvent的定义。 解决办法&#xff1a; 处理这类未定义都可以先F12&#xff0c;找到它的库位置&#xff0c;之后…

数据结构——快速排序

基本思想&#xff1a; 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法&#xff0c;其基本思想为&#xff1a;任取待排序元素序列中的某元素作为基准值&#xff0c;按照该排序码将待排序集合分割成两子序列&#xff0c;左子序列中所有元素均小于基准值&#xff0c;…

BMJ英国医学杂志文献去哪里下载

《柳叶刀》The Lancet、《新英格兰医学期刊》NEJM、《美国医学会杂志》JAMA、《英国医学期刊》BMJ是世界四大医学顶尖期刊&#xff0c;今天有位医学同学求助一篇BMJ英国医学杂志文献&#xff0c;下面就用这篇文献演示一下在家获取BMJ文献的方法及过程。 文献名&#xff1a;Sur…

Multitouch for Mac:手势自定义,提升工作效率

Multitouch for Mac作为一款触控板手势增强软件&#xff0c;其核心功能在于手势的自定义和与Mac系统的深度整合。通过Multitouch&#xff0c;用户可以轻松设置各种手势&#xff0c;如三指轻点、四指左右滑动等&#xff0c;来执行常见的任务&#xff0c;如打开应用、切换窗口、滚…

视频号创作分成计划实战指南:保姆级教程,带你玩转新副业

视频号的月活跃用户数量已在去年突破了8亿大关&#xff0c;并且不断增长。 在这篇文章中&#xff0c;我将与大家分享视频号的运营玩法和作品创作方向。 一、玩法流程 开通条件 要开通创作者分成计划功能&#xff0c;需要满足以下条件&#xff1a; 粉丝数量达到100及以上。 …

Python专题:十一、集合

集合的初始化 . 字符串中的重复元素只能保留一个 数学中的集合操作 - 求两个集合的差集 & 求两个集合的交集 | 合并两个集合元素

word-快速入门

1、熟悉word界面 2、word排版习惯 3、排版文本基本格式 1、word界面 选项卡 功能组 点击功能组右下角小三角可以开启完整功能组&#xff0c;获得启动器 软件右上角有功能显示折叠按钮 2、排版好习惯 &#xff08;1&#xff09;随时保存 &#xff08;2&#xff09;规范文件命…

矩阵相关运算1

矩阵运算是线性代数中的一个核心部分&#xff0c;它包含了许多不同类型的操作&#xff0c;可以应用于各种科学和工程问题中。 矩阵加法和减法 矩阵加法和减法需要两个矩阵具有相同的维度。操作是逐元素进行的&#xff1a; CAB or CA−B其中 A,B 和 C 是矩阵&#xff0c;且 C…

Apache Knox 2.0.0使用

目录 介绍 使用 gateway-site.xml users.ldif my_hdfs.xml my_yarn.xml 其它 介绍 The Apache Knox Gateway is a system that provides a single point of authentication and access for Apache Hadoop services in a cluster. The goal is to simplify Hadoop securit…

双轴测径仪功能多 适用于各行各业外径检测

JG02Z-DG 系列双轴测径仪是双光路外径检测设备&#xff0c;两组测头可以进行不同形式的组合&#xff0c;从而完成不同产线需求的检测&#xff0c;今天我们主要讲解45角双轴测径仪&#xff0c;该种测径仪是较为常用的检测设备&#xff0c;两组测头与水平方向垂直方向呈45度角&am…

免费SSL证书有效期现状

自2024年4月25日起&#xff0c;腾讯云上申请的免费SSL证书有效期将从原先的12个月调整为3个月。而在其他平台&#xff0c;比如Gworg&#xff0c;已经有策略表明将停止签发1年期的免费SSL证书&#xff0c;转而仅提供有效期为3个月的证书。 目前&#xff0c;免费SSL证书的有效期…

笨方法自学python(一)

我觉得python和c语言有很多相似之处&#xff0c;如果有c语言基础的话学习python也不是很难。这一系列主要是学习例题来学习python&#xff1b;我用的python版本是3.12 代码编辑器我用的是notepad&#xff0c;运行py程序用cmd 现在开始写第一个程序&#xff1a; print ("…

拉线开关C++

题目&#xff1a; 思路&#xff1a; m%2的结果为0&#xff0c;就证明开关次数为偶数也就是处于关灯的状态就按题目所要求的输出0&#xff1b; 否则&#xff0c;就证明开关次数为奇数也就是处于开灯的状态就按题目所要求的输出1. 代码 &#xff1a; #include<iostream> u…

IDEA-SpringBoot项目yml配置文件不自动提示解决办法

文章目录 一、五花八门的解决方案二、通用解决方案 前言&#xff1a;本文为SpringBoot项目配置文件.yaml/.yml文件编写时没有自动提示的解决方案 一、五花八门的解决方案 同样的&#xff0c;当resources中只存在.properties文件和.yaml文件时&#xff0c;.yaml文件会主动提示信…

Vue3组件库开发项目实战——02项目搭建(配置Eslint/Prettier/Sass/Tailwind CSS/VitePress/Vitest)

摘要&#xff1a;在现代前端开发中&#xff0c;构建一个高效、可维护且易于协作的开发环境至关重要。特别是在开发Vue3组件库时&#xff0c;我们需要确保代码的质量、一致性和文档的完整性。本文将带你从0搭建vue3组件库开发环境&#xff0c;以下是配置代码规范、格式化、CSS样…