基于SkyWalking实现对k8s集群中微服务的链路追踪分析
基于SkyWalking实现对k8s集群中微服务的链路追踪分析背景需求:SkyWalking介绍:实现方式:step1:制作SkyWalking Agent镜像1、准备文件:2、编写skywalking agent的dockerfile文件3、构建镜像step2:编写java服务接入skywalking agent的yamlstep3:执行yaml文件step4:效果图背景需求:由于我司之前的服务
基于SkyWalking实现对k8s集群中微服务的链路追踪分析
背景需求:
由于我司之前的服务都是部署在ECS中,对于java微服务的实时链路分析是基于skytwalking agent来做监控的,但是目前已经将ECS上的微服务容器化到k8s集群了,所以也需要该工具进行分析。
SkyWalking介绍:
https://github.com/apache/skywalking
SkyWalking的数据采集主要是通过业务探针(Agent)来实现的,针对不同的编程语言SkyWalking提供了对应的Agent实现。Java微服务接入SkyWalking可以使用“SkyWalking
Java Agent”来上报监控数据。因此需要Java微服务在部署启动的过程中需要获取"SkyWalking Java
Agent"探针包,并在启动参数中通过“–javaagent:xxx”进行参数指定。而具体的集成方式大致有以下三种:
- 使用官方提供的基础镜像;
- 将agent包构建到已存在的基础镜像中;
- 通过sidecar 模式挂载agent;
其中前两种方式主要是通过在构建Docker镜像的过程中将Agent依赖打包集成到Java服务的Docker镜像中,而sidecar模式则是利用k8s的相关特性来实现在容器启动时挂载Agent相关依赖。
如果微服务是直接部署在Kubernetes集群,那么采用sidecar模式来使用SkyWalking
Agent会更加方便,因为这种方式不需要修改原来的基础镜像,也不需要重新构建新的服务镜像,而是会以sidecar模式,通过共享的volume将agent所需的相关文件直接挂载到已经存在的服务镜像中。
实现方式:
step1:制作SkyWalking Agent镜像
1、准备文件:
将ECS上的agent拷贝一份,并修改好agent中配置文件的collector.backend_service地址;
egrep -v "^#|^$" config/agent.config #查看agent的配置文件
agent.service_name=${SW_AGENT_NAME:Your_ApplicationName} #服务在skywalking界面显示的服务名
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:172.16.99.156:11800} #skywalking服务端的采集地址
logging.file_name=${SW_LOGGING_FILE_NAME:skywalking-api.log}
logging.level=${SW_LOGGING_LEVEL:INFO}
plugin.kafka.bootstrap_servers=${SW_KAFKA_BOOTSTRAP_SERVERS:localhost:9092}
agent.instance_name=${SW_INSTANCE_NAME:Your_instance_name} #服务在当前主机的实例名,参考skywalking Java Agent支持的配置属性
2、编写skywalking agent的dockerfile文件
cat skywalk-agent
FROM busybox:latest
LABEL maintainer="xiaowangwang"
COPY agent/ /usr/skywalking/agent/
3、构建镜像
docker build -t skywalking-agent:latest -f skywalk-agent .
step2:编写java服务接入skywalking agent的yaml
cat sky.yaml1
apiVersion: apps/v1
kind: Deployment
metadata:
name: project-test
namespace: hd-cool-test
labels:
app: project-test
spec:
replicas: 1
selector:
matchLabels:
app: project-test
template:
metadata:
labels:
app: project-test
spec:
#构建初始化镜像(通过初始化镜像的方式集成SkyWalking Agent)
initContainers:
- image: harbor.my.cn/k8s_basic_images/skywalking-agent:latest
name: sw-agent-sidecar
imagePullPolicy: Always
command: [ "sh" ]
args:
[
"-c",
"cp -R /usr/skywalking/agent/* /skywalking/agent",
]
volumeMounts:
- mountPath: /skywalking/agent
name: sw-agent
imagePullSecrets:
- name: harbor
containers:
- name: project-test
image: harbor.my.cn/hd-k8s/enterprise-api:latest
imagePullPolicy: Always
env:
- name: TZ
value: Asia/Shanghai
- name: NAMESPACE
value: hd-cool-test
#这里通过JAVA_TOOL_OPTIONS,而不是JAVA_OPTS可以实现不通过将agent命令加入到java应用jvm参数而实现agent的集成
- name: JAVA_TOOL_OPTIONS
value: -javaagent:/usr/skywalking/agent/skywalking-agent.jar
- name: SW_AGENT_NAME
value: project-test
- name: SW_INSTANCE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
ports:
- containerPort: 30000
volumeMounts:
- mountPath: /usr/skywalking/agent
name: sw-agent
volumes:
- name: sw-agent
emptyDir: { }
---
apiVersion: v1
kind: Service
metadata:
name: project-test
namespace: hd-cool-test
labels:
app: project-test
spec:
ports:
- name: port
port: 30000
protocol: TCP
targetPort: 30000
selector:
app: project-test
type: ClusterIP
step3:执行yaml文件
kubectl apply -f sky.yaml1
进入到容器中查看java的options
k8s dashboard界面
step4:效果图
都到这儿了,更多文章,详见个人微信公众号ALL In Linux,来扫一扫吧!
更多推荐
所有评论(0)