k8s部署skywalking之java agent部署(使用daemonset)

一、需求

  1. java应用在接入skywalking的时候,需要在启动参数指定 java agent的jar包-javaagent:/usr/local/skywalking/apache-skywalking-apm-bin/agent/skywalking-agent/skywalking-agent.jar
  2. 如果每个java应用制作成容器都需要把agent.jar包放进去,会导致容器太大,而且繁琐。
  3. 希望单独将java agent制作成镜像,并把相关的文件挂载出来。那么下次有新增的java应用时,只需要将-javaagent指向挂载目录的agent包即可

二、实现思路

  1. 挂载方式使用hostPath的方式
    参考文章:
    https://www.cnblogs.com/zhanglianghhh/p/13844062.html
    https://blog.csdn.net/yuezhilangniao/article/details/117453954

hostPath的方式挂载的目录生命周期pod相同。如果容器挂了,目录依然存在

  1. k8s采用daemonset的方式部署agent

使用daemonset会保证每个node节点都会将agent文件挂载到对应的主机目录上

三、步骤

3.1 制作agent镜像

3.1.1 Dockerfile

准备好java agent压缩包:https://dlcdn.apache.org/skywalking/java-agent/8.14.0/apache-skywalking-java-agent-8.14.0.tgz
新建一个Dockerfile文件,内容如下:

# 虽然第一句话看上去没用,但是必须要继承一个基础镜像
# 否则执行docker build 会报错
FROM livingobjects/jre8
RUN mkdir -p /data/paasops/sk/agent
# 复制压缩包并解压
ADD apache-skywalking-java-agent-8.14.0.tgz /data/paasops/sk/agent
# 准备当作挂载目录
RUN mkdir -p /data/paasops/sk/mount/agent

如果没有继承基础镜像,报错参考:
https://blog.csdn.net/lyc0424/article/details/103096955

3.1.2 执行命令

docker build -t sk-agent . -> 制作一个名为sk-agent的镜像

3.2 推送镜像

按照自己需求将镜像推送到对应仓库

3.3 部署到k8s环境

3.3.1 daemonset配置文件

新建一个daemonset.yml文件,内容如下:

apiVersion: apps/v1 
kind: DaemonSet  # 类型
metadata:
  name: agent-daemonset  #daemonset名字
  namespace: kube-tracing # 指定命名空间
spec: 
  selector: 
    matchLabels: 
      app: agent-daemon-tag  # 标签
  template:
    metadata:
      labels: 
        app: agent-daemon-tag 
    spec:
      containers:
        - name: agent-c
          image: 192.168.116.xx:18080/monitor-test/sk-agent:8.14  # agent镜像位置
          imagePullPolicy: Always
          # 执行多条命令 
          #1.将agent包拷贝到挂载目录
          # 2. 执行一个死循环命令,让容器内部有常驻进程,防止容器退出
          command: [ "/bin/bash", "-c", "--" ]
          args: [ "cp -r /data/paasops/sk/agent/* /data/paasops/sk/mount/agent;while true; do sleep 30; done;" ]
          volumeMounts:
          - name: hostpath-agent-volume # 对应下边的挂载定义 name字段内容
            mountPath: /data/paasops/sk/mount/agent # 容器的挂载目录
      volumes: # 挂载方式定义
      - name: hostpath-agent-volume
        hostPath: # 挂载类型
          path: /data/skywalking/agent  # 主机的挂载目录
          type: DirectoryOrCreate

注意:

  1. 以上配置文件实现容器的/data/paasops/sk/mount/agent目录挂载到主机的/data/skywalking/agent; 如果挂载成功,主机目录的内容会覆盖容器目录内容。也就是说如果进入容器的/data/paasops/sk/mount/agent目录,看到的内容是和主机/data/skywalking/agent目录的内容相同并非容器原本目录的内容

3.3.2 运行daemonset

kubectl apply -f daemontset.yml --> 执行daemontset配置文件

3.3.3 查看daemonset运行情况

kubectl get daemonset -n kube-tracing --> 查看kube-tacing命名空间的daemonset
在这里插入图片描述

NAME              DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
agent-daemonset   5         5         5       5            5           <none>          73m

kubectl get pod -n kube-tracing–> 查看pod的运行情况,看daemonset是否创建pod成功
在这里插入图片描述

NAME                                     READY   STATUS             RESTARTS   AGE
agent-daemonset-6hftx                    1/1     Running            0          73m
agent-daemonset-8bh6f                    1/1     Running            0          73m
agent-daemonset-gft2d                    1/1     Running            0          73m
agent-daemonset-x4hhm                    1/1     Running            0          73m
agent-daemonset-x5gvk                    1/1     Running            0          73m

因为我有5个nodes,每个node对应创建了一个pod,所以共有5个pod,且状态都为RUNNING。表示daemonset成功
在这里插入图片描述

3.4 验证是否挂载成功

连接到node节点服务器上,进入/data/skywalking/agent目录,查看是否有agent包相关内容,如果有,表示挂载成功.
在这里插入图片描述

3.5 java应用容器使用挂载内容

3.5.1 制作java应用镜像

  1. 新建一个Dockerfile文件:
FROM livingobjects/jre8
COPY lab-39-demo-2.2.2.RELEASE.jar lab-39-demo-2.2.2.RELEASE.jar
RUN mkdir -p /data/paasops/sk/agent
ENV AGENTPATH=/data/skywalking/agent/skywalking-agent/skywalking-agent.jar
EXPOSE 8079
ENTRYPOINT ["java","-javaagent:/data/paasops/sk/agent/skywalking-agent/skywalking-agent.jar","-jar","lab-39-demo-2.2.2.RELEASE.jar"]
  1. 执行docker build命令然后再将镜像推送到仓库

3.5.2 部署到k8s

  1. 新建一个deployment.yml文件:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-deployment
  namespace: kube-tracing
  labels:
    app: demo-tag
spec:
  selector:
    matchLabels:
      app: demo-tag
  template:
    metadata:
      labels:
        app: demo-tag
    spec:
      nodeName: 192.168.116.178  #选择部署的节点
      containers:
      - name: demotest
        image: 192.168.116.126:18080/skywalking/demotest:latest
        imagePullPolicy: Always
        ports:
        - containerPort: 8079
        env:
        - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
          value: 192.168.116.130:30078
        - name: SW_AGENT_NAME
          value: test-demo
        volumeMounts:
        - name: hostpath-agent-volume
          mountPath: /data/paasops/sk/agent # 容器挂载路径
      volumes:  # 挂载方式
      - name: hostpath-agent-volume
        hostPath:
          path: /data/skywalking/agent  # 主机目录和agent容器配置的主机挂载目录相同
          type: DirectoryOrCreate
---
apiVersion: v1
kind: Service
metadata:
  name: demo-service
  namespace: kube-tracing
  labels:
    service: demo
spec:
  type: NodePort
  selector:
    app: demo-tag
  ports:
    - port: 8079
      name: rest
      nodePort: 30084

  1. kubectl apply -f deployment.yml -> 创建deployment

  2. kubectl get deployment -n kube-tracing -> 查看deployment,状态正常
    在这里插入图片描述

  3. kubectl get pod -n kube-tracing -> 查看pod, 状态Running,正常

在这里插入图片描述
5. kubectl exec -it demo-deployment-75c896b5c6-cdn4d -n kube-tracing /bin/bash -> 进入容器内部
6. cd /data/paasops/sk/agent/ -> 进入容器的挂载目录,查看和主机挂载目录内容是否相同,相同则表示使用agent容器挂载出来的目录内容成功

3.4 java服务使用agent启动之后,接入skywalking失败问题

问题描述:
按照以上操作,启动了一个java服务,但是在skywalking的ui界面没有看到相应的服务名。
在这里插入图片描述
解决:

  1. 使用kubectl exec -it 容器id -n kube-tracing /bin/bash命令进入容器
  2. 使用ping命令检查网络是否连通,ip为SW_AGENT_COLLECTOR_BACKEND_SERVICES的变量值,即192.168.116.130。测试后发现网络不通
  3. 将服务部署到其他节点,问题解决

总结:
在k8s环境部署的服务,需要注意node节点ip之间的网络是否畅通

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值