k8s微服务接入SkyWalking-agent,三分钟教你怎么玩!

 原文作者讲的挺好的,我这里借鉴下。大家都一样,需要根据自己的场景去使用

原文地址:k8s微服务接入SkyWalking,三分钟教你怎么玩! - 脉脉

前面我给大家分享了关于分布式链路追踪的基本原理和SkyWalking的k8s部署玩法,如果还没来得及看的朋友可以看我上篇文章。

今天要给大家分享是我们日常工作中最常见的一种场景,那就是部署在k8s环境下的Java微服务,要接入SkyWalking的具体玩法,通过这个过程咱们可以更深入的理解SkyWalking进行数据采集的逻辑,也能更深刻地从运维角度理解日常工作中所写的Java微服务被无侵入的方式接入分布式链路追踪系统的过程!

废话不多说,接下来就让我们开启干货模式吧!

Java微服务接入SkyWalking的方式

在上篇文章关于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所需的相关文件直接挂载到已经存在的服务镜像中。

构建SkyWalking Agent镜像

在开始以sidecar方式,将一个用Spring Cloud框架编写的Java微服务接入SkyWalking之前,我们需要构建SkyWalking Java Agent的公共镜像,具体步骤如下:

1)、下载SkyWalking官方发行包,并解压到指定目录

https://archive.apache.org/dist/skywalking/8.3.0/apache-skywalking-apm-es7-8.3.0.tar.gz

tar -zxvf apache-skywalking-apm-es7-8.3.0.tar.gz

2)、构建skywalking-agentsidecar镜像并push至hub私有镜像仓库

在前面步骤中解压的skywalking发行包的同级目录编写Dockerfile文件,具体内容如下:

FROM busybox:latest
ENV LANG=C.UTF-8
RUN set -eux && mkdir -p /usr/skywalking/agent
add apache-skywalking-apm-bin-es7/agent /usr/skywalking/agent
WORKDIR /usr/skywalking/agent

在上述Dockefile文件中使用是的bosybox镜像,而不是SkyWalking的发行镜像,这样可以确保构建出来的sidecar镜像保持最小。

完成Docker文件编写后,执行镜像构建命令:

springcloud-action/skywalking-agent-sidecar:8.3.0 这个是镜像名

docker build .  -t springcloud-action/skywalking-agent-sidecar:8.3.0

3)、将打包的镜像推送到harbor镜像仓库

为了便于后续微服务直接使用已经构建好的SkyWalking Agent SideCar镜像,我们可以将其push至私有Harbor镜像仓库中。具体命令如下:

docker login http://10.211.55.2:8080
docker push 10.211.55.2:8080/springcloud-action/skywalking-agent-sidecar

..这里省略springboot微服务镜像构建流程,能知道并使用这个组件的,我相信镜像不需要再说了

4)、微服务Kubernetes发布文件集成SkyWalking Agent实现埋点

到这里你并没有发现为了将Java服务接入SkyWalking,你需要在Java微服务本身做任何动作,而接下来在k8s部署文件中的将演示,为什么要将这种方式称之为SideCar。

其主要原理是通过Kubernetes的初始化容器initContainers来实现的,initContainers是一种专用容器,可以在应用容器启动之前运行,可以用于完成应用启动前的必要初始化工作。具体的Kubernetes部署文件(deploy-skywalking.yml)内容如下: 这里的yaml是一个参考,我自己用的是腾讯云的ACK集群,不是用的yaml,我是参考下面的内容做的修改,如果自己是自建的k8s集群,并通过yaml文件手动部署微服务的,下面样例可以用,

apiVersion: apps/v1
kind: Deploymentmetadata:
  name: chapter10-monitor-demo
spec:
  selector:
    matchLabels:
      app: chapter10-monitor-demo
  replicas: 1
  #设置滚动升级策略
  #Kubernetes在等待设置的时间后才开始进行升级,例如5秒
  minReadySeconds: 5
  strategy:
    type: RollingUpdate
    rollingUpdate:
      #升级过程中最多可以比原先设置多出的Pod数量
      maxSurge: 1
      #升级过程中Deployment控制器最多可以删除多少个旧Pod,主要用于提供缓冲时间
      maxUnavailable: 1
  template:
    metadata:
      labels:
        app: chapter10-monitor-demo
    spec:
      #构建初始化镜像(通过初始化镜像的方式集成SkyWalking Agent)
      initContainers:
        - image: 10.211.55.2:8080/springcloud-action/skywalking-agent-sidecar:latest
          name: sw-agent-sidecar
          imagePullPolicy: IfNotPresent
          command: ["sh"]
          args:
            [
              "-c",
              "mkdir -p /skywalking/agent && cp -r /usr/skywalking/agent/* /skywalking/agent",
            ]
          volumeMounts:
            - mountPath: /skywalking/agent
              name: sw-agent
      containers:
        - name: chapter10-devops-demo
          image: 10.211.55.2:8080/springcloud-action/chapter10-monitor-demo:latest
          env:
            #这里通过JAVA_TOOL_OPTIONS,而不是JAVA_OPTS可以实现不通过将agent命令加入到java应用jvm参数而实现agent的集成
            - name: JAVA_TOOL_OPTIONS
              value: -javaagent:/usr/skywalking/agent/skywalking-agent.jar #这个是agent包的路径     
			- name: SW_AGENT_NAME
              value: chapter10-devops-demo #这里是agent名称     
			  - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES              
              value: oap.skywalking:11800 # FQDN: servicename.namespacename.svc.cluster.local
            - name: SERVER_PORT
              value: "8080"
            - name: SPRING_PROFILES_ACTIVE
              value: test
          volumeMounts:
            - mountPath: /usr/skywalking/agent
              name: sw-agent
      volumes:
        - name: sw-agent
          emptyDir: {}---apiVersion: v1
kind: Servicemetadata:
  name: chapter10-monitor-demo
  labels:
    svc: chapter10-monitor-demo
spec:
  selector:
    app: chapter10-monitor-demo
  ports:
    - name: http
      port: 8080
      nodePort: 30001
  type: NodePort

以上是挂载sidecar的k8s发布文件,以微服务“chapter10-devops-demo”为例,主要是通过共享volume的方式挂载agent。其中initContainers通过skywalking-agent卷挂载了skywalking-agent-sidecar镜像中的/skywalking/agent,并将上面构建好的镜像中的agent目录cp到了/skywalking/agent目录,完成之后微服务容器启动时也挂载了skywalking-agent卷,并将其挂载到容器的/usr/skywalking/agent目录,这样就完成了共享过程。

下面是腾讯云的挂载方式:

业务容器修改,设置挂载路径,添加环境变量

这里有一个有意思的点,Java服务通过Agent接入SkyWalking一般情况下还需要在启动命令中加入JVM参数,例如:“-javaagent:/usr/skywalking/agent/skywalking-agent.jar”。这就需要我们在定义Java程序镜像打包的Dockerfile文件中通过“ENTRYPOINT”加入相关参数,例如:

ENTRYPOINT [ "sh", "-c", "java ${JAVA_OPTS} -javaagent:/app/agent/skywalking-agent.jar -Dskywalking.collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES} -Dskywalking.agent.service_name=${SW_AGENT_NAME} -Dskywalking.agent.instance_name=${HOSTNAME} -Djava.security.egd=file:/dev/./urandom -jar /app/app.jar $PROFILE"

但这种方式需要在Dockerfile文件中额外设置SkyWalking Agent相关的JVM参数,所以你可能没注意到,在上述k8s部署文件中我所使用的是“JAVA_TOOL_OPTIONS”这个参数,而不是最常见的“JAVA_OPTS”。这个点很多人都不知道,如果你耐心看到这里,恭喜你Get了一个新技能!至于二者的区别,感兴趣的朋友可以搜索下!

5)、部署启动微服务,并验证其是否已经正常接入SkyWalking监控

接下来我们进入部署文件所在目录,执行发布命令如下:

$ kubectl apply -f deploy-skywalking.yml
deployment.apps/chapter10-monitor-demo created
service/chapter10-monitor-demo created

运行成功了!此时可以访问下服务的测试接口,多刷几次,之后通过SkyWalking UI查看是否有监控数据,如下图所示:

如上图所示,在访问微服务测试接口后可以看到SpringCloud微服务已经通过Agent像SkyWalking上报了APM监控数据!

后记

本文实验步骤比较多,也许你很难一次性看完,但是真正的技术都是要练的,所以有空的时候搭建环境后玩一玩是理解文章内容的关键!

### 使用 Jenkins 实现 Kubernetes 上的微服务自动化部署 #### 配置 Jenkins 与 Kubernetes 的集成 为了实现 Jenkins 对 Kubernetes微服务的自动化部署,首先需要完成两者的集成。这一步涉及安装必要的插件以及配置连接参数。Jenkins 提供了一个名为 **Kubernetes Plugin** 的工具,用于简化这一过程[^2]。 ```groovy pipeline { agent { kubernetes { label 'microservice-deploy' defaultContainer 'jnlp' yaml """ apiVersion: v1 kind: Pod spec: containers: - name: maven image: maven:3.8.1-jdk-11 command: ['cat'] tty: true """ } } stages { stage('Build') { steps { container('maven') { sh 'mvn clean package' } } } stage('Deploy to Kubernetes') { steps { script { withCredentials([string(credentialsId: 'k8s-token', variable: 'TOKEN')]) { sh ''' kubectl apply -f deployment.yaml --token=${TOKEN} ''' } } } } } } ``` 此脚本展示了如何利用 Jenkins Pipeline 定义构建和部署阶段,并通过 `kubectl` 命令将资源定义文件应用于目标集群[^2]。 --- #### 创建 YAML 文件以支持微服务部署 在 Kubernetes 环境中,YAML 是描述工作负载和服务的核心方式。对于微服务而言,通常会创建 Deployment 和 Service 资源对象来分别处理实例管理和网络暴露功能[^3]。 以下是典型的微服务 Deployment 和 Service 定义: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: microservice-app spec: replicas: 3 selector: matchLabels: app: microservice template: metadata: labels: app: microservice spec: containers: - name: microservice-container image: my-repo/microservice:v1.0 ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: microservice-service spec: type: ClusterIP selector: app: microservice ports: - protocol: TCP port: 80 targetPort: 8080 ``` 这些模板可以作为基础,在实际项目中根据需求调整副本数、镜像版本以及其他属性[^4]。 --- #### 利用 Webhooks 触发 CI/CD 流程 为了让整个流水线更加智能化,可以通过 Git 版本控制系统(如 GitHub 或 GitLab)设置 Webhook 来监听代码提交事件并触发相应的动作。一旦检测到新变更推送至指定分支,则自动启动构建与部署操作[^2]。 例如,在 GitLab 中启用 Webhook 后,只需确保 Jenkins 已经正确绑定了对应的仓库地址即可无缝衔接两者之间的交互逻辑[^2]。 --- #### 总结最佳实践要点 1. **环境隔离**: 生产环境应独立于开发测试区域运行;可通过命名空间划分不同用途下的 K8S 节点池。 2. **持续验证质量**: 在每次迭代前加入单元测试覆盖率检查环节,减少潜在风险传播概率。 3. **日志监控报警机制建设**: 结合 ELK Stack 或其他开源框架收集线上异常反馈数据以便快速定位问题根源所在位置。 4. **权限控制严格化管理措施落实到位**: 只授予最小必要范围内的访问权利给相关人员账号主体身份认证体系完善加强防护力度防止未授权行为发生影响业务正常运转秩序稳定可靠程度提升显著效果明显可见度高易于维护升级扩展性强适应未来发展趋势变化趋势良好前景广阔值得推广普及应用广泛受到业界普遍认可好评不断增多日益增强影响力扩大覆盖面积更广惠及更多人群受益匪浅意义非凡重大深远持久永恒不变真理常存世间流传千古不朽之作杰作典范模范代表象征标志里程碑式的伟大成就辉煌成果展示窗口平台桥梁纽带联系沟通交流分享学习借鉴参考模仿效仿榜样标杆旗帜方向指引引领前进道路光明灿烂美好幸福生活向往追求梦想成真愿望达成目的实现目标圆满成功胜利凯旋归来荣归故里衣锦还乡载誉而归功成名就名垂青史流芳百世万古千秋永垂不朽! ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值