ITPub博客

首页 > 数据库 > 数据库开发技术 > 基SkyWalking实现对k8s集群中微服务的链路追踪

基SkyWalking实现对k8s集群中微服务的链路追踪

原创 数据库开发技术 作者:Java大飞哥 时间:2022-08-25 15:47:44 0 删除 编辑

1.思路如下:

1.sykwalking的安装配置(k8s集群部署配置)
2.sykwalking-agent探针的集成到微服务项目(是打成基础镜像里,然后指定参数(configMap中配置java项目的环境变量)运行,还是以sideCar边车的方式运行?还是直接集成到微服务项目中?)项目中集成sykwalking相关的包
3.基础镜像构建和项目的Dockerfile的编写
4.私有Hub的安装部署、jenkins的安装部署、jenkins流水线脚本的编写
5.构建项目并运行看最终的结果
注意:服务器或虚拟机(配置好网络)上需要提前安装docker和k8s、
熟悉docker/jenkins/k8s/java/linux等




1.1-构建带有skywalking-agent的应用基础镜像

路径:

[root@ecs-01-0002 temp]# pwd/opt/temp


Dockerfile文件如下:

ROM openjdk:8-jre-alpineVOLUME /tmpADD ./agent/ /agent/#下面两个是指定语言和安装字体相关的包ENV LANG en_US.UTF-8RUN apk add --update font-adobe-100dpi ttf-dejavu fontconfig && rm -rf /var/cache/apk/*

第一行的ROM的基础镜像可以使用自己制作的基础镜像也是可以的,前提是需要带有java的环境jre是最小的运行环境或者是装有JDK的环境配置


在该路径下执行如下命令:

1.docker build -t openjdk:8-jre-alpine-apm-8.11 . 在当前路径下构建应用的基础镜像,名称为:openjdk:8-jre-alpine-apm-8.11
2.docker tag  openjdk:8-jre-alpine-apm-8.11    仓库地址或域名/项目名/openjdk:8-jre-alpine-apm-8.11
推送私有hub仓库打的tag3.docker push 仓库地址或域名/项目名/openjdk:8-jre-alpine-apm-8.11

推送应用基础镜像下面两步骤可以不用执行,除非此服务是安装了jenkins的服务器且有构建记录,需要把之前构建的openjdk:8-jre-alpine-apm-8.11这个镜像删除,否则jenkins构建项目是默认使用本地已经存在的镜像,就不会去远端私有镜像仓库中拉取 docker rmi -f 镜像id--xxxxx4.docker pull 仓库地址或域名/项目名/openjdk:8-jre-alpine-apm-8.11  重新从私有仓库拉取openjdk:8-jre-alpine-apm-8.115.docker tag  仓库地址或域名/项目名/openjdk:8-jre-alpine-apm-8.11 openjdk:8-jre-alpine-apm-8.11 如果没有tag为openjdk:8-jre-alpine-apm-8.11的镜像需要重新给拉取的镜像打tag为openjdk:8-jre-alpine-apm-8.11

注意该jenkiens服务器上需要配置hub推送免密登录的配置,这个就自行百度了



1.2-java的微服务项目配置

项目中的Dockerfile文件如下

FROM openjdk:8-jre-alpineVOLUME /tmpADD target/*.jar app.jarRUN echo "Asia/Shanghai" > /etc/timezoneENTRYPOINT java ${JAVA_OPTS} ${JAVA_PARAMETERS} ${SERVER_NAME} -jar /app.jar

<dependency>    <groupId>org.apache.skywalking</groupId>    <artifactId>apm-toolkit-logback-1.x</artifactId>    <version>8.4.0</version></dependency><dependency>    <groupId>org.apache.skywalking</groupId>    <artifactId>apm-toolkit-trace</artifactId>    <version>8.4.0</version></dependency>



1.3-jenkins流水线脚本配置

pipeline {    agent any  environment {      image_tag="xxxx"      git_address="xxxx"      git_branch="xxxx"      git_auth="xxxxx"      registry_name="xxxx"        registry_pwd="xxx"        container_name="xxxx"        JAVA_OPTS="-Xms512m -Xmx512m -Xss256K"  }  stages {      stage("拉取代码") {          steps {              git branch: "${git_branch}", credentialsId: "${git_auth}",url: "${git_address}"          }      }      stage('质量扫描') {          steps {              echo '跳过扫描'          }      }      stage('maven编译') {          steps {              sh 'mvn -B -f ./pom.xml clean install -DskipTests'          }      }      stage('编译镜像') {          steps {              sh '''              cp target/*.jar ./              docker build -t ${image_tag} .              '''         sh 'docker login --username=${registry_name} --password=${registry_pwd} harbor.yndysc.com'              sh 'docker push ${image_tag}'              sh 'docker rmi ${image_tag}'          }      }  }}



1.3.4-部署服务器上的部署yml文件编写

xxxx-server.yml

apiVersion: apps/v1 #版本kind: Deployment #k8s资源类型是Deployment metadata: #Deployment 的元数据  name: xxx #资源名称 (xxx-deployment)  namespace: xxxxx #资源所属namespace  labels:#绑定要选择镜像的标签app: xxxxx #容器名字spec:  replicas: 4 #容器发布的副本个数  selector:#标签选择器    matchLabels:      app: xxxx #容器名字  template: #模板配置    metadata: #模板元数据      labels:#模板标签(标签选择器)        app: xxxx #容器名字    spec:#副本      containers: #数组可以有多个      - name: xxxx #镜像名字        image: xxxxx #镜像名称(tag:版本)        imagePullPolicy: Always  #镜像拉取策略(总是拉取)        ports:        - containerPort: 80 #容器端口        env: #容器运行的环境变量配置(是一个数组可以有多个)          - name: JAVA_OPTS #java启动参数环境变量配置            valueFrom: #环境变量的值来自于configMap的资源              configMapKeyRef:                name: nacos-elk-configmap                key: JAVA_OPTS          - name: JAVA_PARAMETERS            valueFrom:              configMapKeyRef:                name: nacos-elk-configmap                key: JAVA_PARAMETERS          - name: SERVER_NAME            value: -Dskywalking.agent.service_name=[链路追踪的服务名称xxx]        livenessProbe:#应用探活配置(探针)          httpGet:            path: /actuator/health            port: 80          initialDelaySeconds: 50          timeoutSeconds: 2        readinessProbe:#读取探活配置(探针)          httpGet:            path: /actuator/health            port: 80          initialDelaySeconds: 50          timeoutSeconds: 2        resources:#pod资源限制配置          requests:            ephemeral-storage: "1Gi"            memory: "1Gi"            cpu: 200m          limits:            ephemeral-storage: "10Gi"            memory: "2Gi"            cpu: 1000m      imagePullSecrets: #镜像拉取策略        - name: secret-name-harbor #私服拉取      dnsConfig: #dns配置        options:        - name: ndots          value: "5"

kubectl create -f  xxxx-server.yml

发布服务


Pod服务启动后进入容器:




1.3.5-k8s的ConfigMap编写

参看:

https://www.cnblogs.com/shaozhiqi/p/12442065.html

https://www.cnblogs.com/ricklz/p/14930801.html#%E7%90%86%E8%A7%A3configmap



lkubectl get configmap nacos-elk-configmap -n xxx-system -o yaml

lnacos-elk-configmap:config的名字

lxxx-system 是configMap资源所属的nameSpace

查看configMap的yml

apiVersion: v1data:  JAVA_OPTS: -Xms512m -Xmx512m  JAVA_PARAMETERS: -javaagent:/agent/skywalking-agent.jar -Dskywalking.trace.ignore_path=/,Lettuce/**,Jedis/scriptLoad,/Lettuce/INFO,/actuator/**,/**/actuator/health,Redisson/AUTH    -Dspring.profiles.active=prod -Dcloud.nacos_url=nacous注册中心的地址-Dcloud.nacos_namespace=nacous中的namespace的id    -Delk.logger.destination=elk的地址 -Dskywalking.collector.backend_service=skywalking服务server的ip:portkind: ConfigMap



1.3.6-k8s探针配置

微服务项目的pom文件中需要加入如下pom依赖

<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-actuator</artifactId>    <version>2.3.2.RELEASE</version></dependency>

Nacos中加入配置:

management:  endpoints:    web:      exposure:        #设置health端点        include: "health"

curl 172.16.0.38:9001/actuator/health

curl pod的ip:应用的端口,看到如下打印信息是只有health断点暴露了,没有其它的断点暴露



1.3.7-K8s常用命令

kubectl  logs  pod名称  -n xxxx-system -f | grep 'xxx2' -C 200 #搜索日志中含有xxx2日志的前后200行输出k -n xxx-system get po -o wide | grep xxxxx #简写查pod信息Kubectl  logs  pod名称  -n  xxxx-system -f #查日志kubectl  delete pod  pod名称-n xxxx-system #删除pod后重新拉取一个新的podkubectl  get pod -n xxxx-system | grep xxxxkubectl  exec -it  pod名称 -n  xxx-system sh  #进入pod中kubectl  cp  xxx-system/pod名称:/xxx-server.jar  /root/xxx_yaml/xx-server.jar将从某个nameSpace/pod中的某个路径下的某个文件 拷贝到 服务的某路径下的某文件
kubectl get configmap  configmap的  -n  xxxx-system -o yaml 参看conMap的yml信息



参考博客:

https://juejin.cn/post/7094245157456838687

https://www.modb.pro/db/381045

https://www.cnblogs.com/linyb-geek/p/14597848.html


原文作者:Java大飞哥;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2024-12-26

  • 博文量
    115
  • 访问量
    73139