skywalking agent 放入 k8s

105 阅读4分钟

背景

前阵子调研了ELK+skywalking的集成,后面公司老大说要将服务放入k8s,喊我继续去调研下如何进k8s.

ELK + skywalking & k8s 搭建

之前的文章:

ELK 搭建 & 日志集成

Skywalking 调用链路 & 集成日志

linux 环境 & 应用服务 docker 化 & skywalking Agent 接入

centos 中搭建 k8s 集群

sidecar 模式

sidecar 模式是k8s 中pod的一种模式,是指在一个pod里放入一个辅助镜像和一个应用镜像,这个辅助镜像是帮助应用镜像完成某个功能的,我觉得可以简单的理解成 插件镜像。

K8s(Kubernetes)Sidecar 模式是一种在容器化应用中常用的设计模式,以下是对其的详细介绍:

概念与原理

  • 定义:Sidecar 模式是指在一个 Pod 中运行多个容器,其中一个是主容器(应用容器),负责主要业务逻辑,其他容器作为 Sidecar 容器,与主容器协同工作,为其提供辅助功能,如日志收集、监控、代理等。
  • 原理:Kubernetes 中的 Pod 是一组紧密相关的容器的集合,它们共享网络命名空间、存储卷等资源。Sidecar 容器与主容器在同一个 Pod 中,能够方便地通过本地网络进行通信,并且可以共享存储卷来实现数据交互。

应用场景

  • 日志收集:主容器产生的日志可以通过共享存储卷或本地网络发送给 Sidecar 容器,Sidecar 容器负责将日志发送到集中式日志管理系统,如 Elasticsearch 和 Kibana 组合。
  • 监控与指标采集:Sidecar 容器可以收集主容器的性能指标,如 CPU 使用率、内存使用率等,并将这些指标发送到监控系统,如 Prometheus。
  • 服务代理:当主容器需要访问外部服务时,Sidecar 容器可以作为代理,对请求进行拦截、处理和转发,实现服务发现、负载均衡、认证授权等功能。
  • 配置管理:Sidecar 容器可以从配置中心获取配置信息,并将其注入到主容器中,实现主容器的动态配置更新。

优势

  • 提高可维护性和可扩展性:将辅助功能分离到 Sidecar 容器中,使得主容器的业务逻辑更加清晰,易于维护和扩展。
  • 增强容器的复用性:Sidecar 容器可以被多个不同的主容器共享,提高了容器的复用性。
  • 提高资源利用率:多个容器共享同一个 Pod 的资源,相比于每个功能都独立部署一个 Pod,能够更有效地利用资源。

将应用服务集成skywalking agent 放入k8s里运行

准备dockerfile & 构建镜像

下文中的服务jar包和oap地址要自己调整。

FROM openjdk:8u262-jre  
WORKDIR /app 
COPY fang.jar /app/fang.jar
ENV JAVA_OPTS="-javaagent:/skywalking/agent/skywalking-agent.jar -Dskywalking.agent.service_name=fang -Dskywalking.collector.backend_service=192.168.7.111:11800" 
EXPOSE 8092
ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar /app/fang.jar"]
docker build -f fang-sidecar-dockerfile -t fang:2.0 .

部署 deployment

在k8s集群中的master上运行

apiVersion: apps/v1
kind: Deployment
metadata:
  name: fang-java-app-with-skywalking
  labels:
    app: fang-java-app
    version: v1
spec:
  replicas: 1 # 指定Pod的副本数
  selector:
    matchLabels:
      app: fang-java-app
  template:
    metadata:
      labels:
        app: fang-java-app
    spec:
      volumes:
      - name: skywalking-agent-volume # 定义一个共享卷,用于存放SkyWalking-agent文件
        emptyDir: {} # 使用emptyDir类型的卷,生命周期与Pod相同
      initContainers:
      - name: init-skywalking-agent # 定义一个initContainer
        image: apache/skywalking-java-agent:8.13.0-java8 # 使用包含SkyWalking-agent的Docker镜像
        volumeMounts:
        - name: skywalking-agent-volume # 将共享卷挂载到initContainer中
          mountPath: /opt/skywalking/agent # 指定挂载路径
        command: ["sh", "-c", "mkdir -p /opt/skywalking/agent && cp -r /skywalking/agent/*  /opt/skywalking/agent/"] # 复制SkyWalking-agent文件到挂载路径
      containers:
      - name: fang # 定义主容器
        image: fang:2.0 # 使用包含Java应用的Docker镜像
        imagePullPolicy: IfNotPresent # 先用本地的,如果没有再去拉取
        volumeMounts:
        - name: skywalking-agent-volume # 将共享卷挂载到主容器中
          mountPath: /skywalking/agent # 指定挂载路径,与initContainer相同
        ports:
        - containerPort: 8092 # Java应用监听的端口
---
apiVersion: v1
kind: Service
metadata:
  name: fang-service
spec:
  selector:
    app: fang-java-app # 要和上面pod定义的selector一致。
  ports:
    - name: http
      port: 8092
      nodePort: 30001
  type: NodePort
kubectl apply -f fang-sidecar-deployment.yaml

查看pods和svc

image.png

验证结果

对fang这个服务发起请求,查看日志

image.png

再去skywalking-ui里看

image.png

可以看到被正确收集到了。

总结

将应用程序和skywalking agent用sidecar模式进行了启动,并且完成了上报监听。