背景需求:

由于我司之前的服务都是部署在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”进行参数指定。而具体的集成方式大致有以下三种:

  1. 使用官方提供的基础镜像;
  2. 将agent包构建到已存在的基础镜像中;
  3. 通过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,来扫一扫吧!
在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐