基SkyWalking实现对k8s集群中微服务的链路追踪
2.sykwalking-agent探针的集成到微服务项目(是打成基础镜像里,然后指定参数(configMap中配置java项目的环境变量)运行,还是以sideCar边车的方式运行?第一行的ROM的基础镜像可以使用自己制作的基础镜像也是可以的,前提是需要带有java的环境jre是最小的运行环境或者是装有JDK的环境配置。curl pod的ip:应用的端口,看到如下打印信息是只有health断点暴露
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信息
更多推荐
所有评论(0)