使用init-containers知足程序猿刚需

随着现网生产环境容器化改造逐步完成,核心的业务都由K8S集群中的pod对外提供服务。各个微服务应用间的内部资源调用次数、调用链耗时、调用阈值告警、超时错误等信息指标对保障业务健康运行来讲显得很是重要。因为现网使用的是云容器引擎服务,公有云提供了一整套的解决方案。下面是华为云和阿里云相关的产品介绍,整体来讲,借助这类的工具,能够快速的查看微服务的各项指标和调用状况,定位相关的问题。html

https://support.huaweicloud.com/apm/index.html
https://help.aliyun.com/document_detail/63796.html?spmjava

那么刚需来了,程序猿但愿内网开发和测试环境能对照现网生产环境也来这么一套差很少的监控工具,一些隐藏的问题不须要等到上了生产环境才能发现。
问:运维同窗要怎么知足这个需求呢?
答:开发和测试环境也迁移上公有云。
PS:内心想一想就算了!git

本文介绍使用pinpoint知足程序猿这个合理需求。github

1、Pinpoint是什么?

pinpoint是开源在github上的一款APM监控工具,它是用Java编写的,用于大规模分布式系统监控。关于pinpoint服务端的部署可参考下列的文档。
http://www.javashuo.com/article/p-tzaotqzn-a.htmldocker

2、需求分析

一、开始前咱们要先准备好pinpoint服务端环境。
二、其次须要在pod上进行pinpoint客户端埋点(埋点也就是探针,公有云就是根据这个探针个数进行收费的)bootstrap

提出问题:如何科学埋点?tomcat

答1:直接把agent作到容器镜像里面。
咱们容器化的主要目标是开发、测试和生产环境用同一份镜像和代码,代码上实现一次编译,处处运行,解耦经过集中配置服务,configmap等实现,因此这种作法明显不符合目标。bash

答2:把pinpoint 相关的agent放到PVC上,而后经过ENV注入CATALINA_OPTS环境变量到Pod。
经过ENV注入CATALINA_OPTS环境变量到Pod这个是确定要的,可是若是把pinpoint 相关的agent放到PVC上,虽然能解决问题,可是存在耦合问题,万一PVC、PV出现问题,会致使微服务启动失败。比较好的办法,是经过init-containers来解决这个问题,关于什么是init-containers可参考官方手册:https://kubernetes.io/docs/concepts/workloads/pods/init-containers/ app

3、准备init-containers镜像

.# cd pinpoint/
# cat dockerfile 
FROM busybox
MAINTAINER yangliangwei "ylw@fjhb.cn"
ADD pp_agent.tgz /var/lib/pp_agent/

# docker build -t harbor.59iedu.com/fjhb/pp_agent:latest .
# docker push harbor.59iedu.com/fjhb/pp_agent

pp_agent.tgz包含了客户端埋点所须要的jar包和配置文件
使用init-containers知足程序猿刚需
使用init-containers知足程序猿刚需运维

4、更新微服务yaml文件

volumes:
        - name: hb-lan-server-xml
          configMap:
            name: hb-lan-server-xml
            items:
              - key: server.xml
                path: server.xml

        - name: vol-localtime
          hostPath:
            path: /etc/localtime
            type: ''
        - name: mfsdata
          persistentVolumeClaim:
            claimName: mfsdata

        - name: pp-agent
          emptyDir: {}

      initContainers:
        - name: init-pinpoint
          image: 'harbor.59iedu.com/fjhb/pp_agent:latest'
          command:
            - sh
            - '-c'
            - cp -rp /var/lib/pp_agent/* /var/init/pinpoint
          resources: {}
          volumeMounts:
            - name: pp-agent
              mountPath: /var/init/pinpoint
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          imagePullPolicy: Always

使用init-containers知足程序猿刚需

首先定义一个emptyDir类型的卷pp-agent,initcontainers容器启动的时候,将这个pp-agent卷挂载到/var/init/pinpoint目录,并把容器镜像层中的/var/lib/pp_agent/目录下的文件拷贝到pp-agent卷下面,而后initContainers的使命完成,正常退出。

containers:
        - name: tomcat-zffw
          image: 'harbor.59iedu.com/dev/fjhb6-ability-order-pay:1.22.0-SNAPSHOT-20190227044640'
          imagePullPolicy: Always
          lifecycle:
           preStop:
            exec:
              command: ["/bin/bash", "-c", "PID=`pidof java` && kill -SIGTERM $PID && while ps -p $PID > /dev/null; do sleep 1; done;"]
          env:
            - name: POD_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP

            - name: CATALINA_OPTS
              value: >-
                -javaagent:/var/init/pinpoint/pinpoint-bootstrap.jar
                -Dpinpoint.agentId=${POD_IP}
                -Dpinpoint.applicationName=dev-tomcat-zffw

            - name: JAVA_OPTS
              value: >-
                -server -Xms1024M -Xmx1024M -XX:MaxMetaspaceSize=320m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/tomcat/jvmdump/ -agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=n
                -Duser.timezone=Asia/Shanghai
                -Drocketmq.client.logRoot=/home/tomcat/logs/rocketmqlog 

          resources:
            limits:
              cpu: 2000m
              memory: 2Gi
            requests:
              cpu: '500m'
              memory: 1Gi
          volumeMounts:
            - name: hb-lan-server-xml 
              mountPath: /home/tomcat/conf/server.xml
              subPath: server.xml

            - name: vol-localtime
              readOnly: true
              mountPath: /etc/localtime
            - name: mfsdata
              mountPath: /mnt/mfs

            - name: pp-agent
              mountPath: /var/init/pinpoint

使用init-containers知足程序猿刚需

业务容器上将pod的ip作成变量POD_IP, 用于-Dpinpoint.agentId使用,经过CATALINA_OPTS变量配置pinpoint客户端相关的参数。第一行是pinpoint agent的jar包位置,为了方便后续升级,这里把具体的版本号去掉。第二行是agent的ID,这个ID是惟一的,使用POD_IP变量动态生成。第三行是采集项目的名称。
使用init-containers知足程序猿刚需
业务容器须要挂载pp-agent这个卷,这样经过使用init-containers技术就实现了客户端埋点的效果。

5、效果验证

一、客户端启动验证
使用init-containers知足程序猿刚需

二、服务端UI查看调用链
使用init-containers知足程序猿刚需
使用init-containers知足程序猿刚需

相关文章
相关标签/搜索