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

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-alpine
VOLUME /tmp
ADD ./agent/ /agent/
#下面两个是指定语言和安装字体相关的包
ENV LANG en_US.UTF-8
RUN 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仓库打的tag
3.docker push 仓库地址或域名/项目名/openjdk:8-jre-alpine-apm-8.11

推送应用基础镜像
下面两步骤可以不用执行,除非此服务是安装了jenkins的服务器且有构建记录,需要把之前构建的openjdk:8-jre-alpine-apm-8.11这个镜像删除,否则jenkins构建项目是默认使用本地已经存在的镜像,就不会去远端私有镜像仓库中拉取
 docker rmi -f 镜像id--xxxxx
4.docker pull 仓库地址或域名/项目名/openjdk:8-jre-alpine-apm-8.11
  重新从私有仓库拉取openjdk:8-jre-alpine-apm-8.11
5.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-alpine
VOLUME /tmp
ADD target/*.jar app.jar
RUN echo "Asia/Shanghai" > /etc/timezone
ENTRYPOINT 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: v1
data:
  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:port
kind: 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后重新拉取一个新的pod
kubectl  get pod -n xxxx-system | grep xxxx
kubectl  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信息

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值