一、背景

  1. java应用在接入skywalking的时候,需要在启动参数指定 java agent的jar包-javaagent:/usr/local/skywalking/apache-skywalking-apm-bin/agent/skywalking-agent/skywalking-agent.jar
  2. 目前不打算将agent相关文件制作到java服务镜像里面
  3. 希望通过挂载的方式将agent包提供出来供java服务使用
  4. 决定采用基于sideCar模式部署java服务

原来采用过另外一种方案,是使用daemonset将agent包挂载每个node的主机目录,然后容器使用主机目录挂载的方式共享该目录就能使用到agent包。但是由于换了一个新的环境,没有权限操作主机目录,所以此方案作罢.
该方案的实现参考:
https://blog.csdn.net/qq_44209563/article/details/129591624

二、sideCar模式介绍

参考文章:
https://juejin.cn/post/6844903998382669832#heading-3

sideCar模式实现简单来说就是在同一个pod中,启动两个容器,容器A为正常的服务容器,容器B为辅助容器。同时让两个容器共享存储

辅助容器在启动后将前提条件准备好, 例如把服务容器需要使用到的agent包,提前放到共享目录当中,等到服务容器启动时就能直接使用共享目录中的agent包了

以上只是sideCar模式的其中一种用法。

三、部署

3.1 要点

  1. 同一个pod中启动两个容器
  2. 容器之间会共享存储
  3. 要保证容器启动的先后顺序

3.2 创建deployment文件

monitor-demo.yaml文件内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: monitor-demo-test-deployment
  namespace: kube-monitor
spec:
  replicas: 1
  selector:
    matchLabels:
      app: monitor-demo
  template:
    metadata:
      labels:
        app: monitor-demo
        api: try
    spec:
      nodeName: 192.168.116.178
      initContainers:  #1.表示初始化容器,当作辅助容器使用,在启动时执行命令将agent包复制到共享存储中
        - name: agent-c
          image: 192.168.116.126:18080/monitor-test/sk-agent:8.14.1
          imagePullPolicy: Always
          command: [ "/bin/bash", "-c", "--" ]
          args: [ "cp -r /data/paasops/sk/agent/* /data/paasops/sk/mount/agent;" ]  #2.执行命令
          volumeMounts:  # 共享存储设置
          - name: side-car-share-volume
            mountPath: /data/paasops/sk/mount/agent
      containers:
        - name: monitor-demo  # 服务容器
          image: 192.168.116.126:18080/monitor-test/monitor-test-demo:20230518154109
          imagePullPolicy: "IfNotPresent"
          ports:
            - containerPort: 8080
          env:
            - name: TZ
              value: Asia/Shanghai
          volumeMounts:   # 共享存储设置
            - name: side-car-share-volume
              mountPath: /data/paasops/sk/mount/agent
      volumes:  # 声明共享存储
        - name: side-car-share-volume
          emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  name: monitor-demo-test-service
  namespace: kube-monitor
spec:
  type: NodePort
  ports:
    - port: 8080
      nodePort: 30280
  selector:
    app: monitor-demo

主要关心的内容:

  1. 声明共享存储
      volumes:  # 声明共享存储
        - name: side-car-share-volume
          emptyDir: {}
  1. 分别在两个容器中使用共享存储
          volumeMounts:   # 共享存储设置
            - name: side-car-share-volume
              mountPath: /data/paasops/sk/mount/agent

解释一下以上资源文件的执行情况:

  1. 执行时会先启动init容器 agent-c, 该容器会执行cp命令把agent包移动到共享目录/data/paasops/sk/mount/agent中(此目录时agent-c的容器目录,映射到共享存储side-car-share-volume)
  2. int容器执行完毕后退出,然后启动monitor-demo容器, 此容器使用到了共享存储side-car-share-volume,映射的是容器内目录/data/paasops/sk/mount/agent
  3. 也就相当于agent-c容器的/data/paasops/sk/mount/agent目录和monitor-demo容器的/data/paasops/sk/mount/agent映射成同一个地方

3.3 执行资源文件

执行命令kubectl apply -f monitor-demo.yaml

Logo

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

更多推荐