随着现网生产环境容器化改造逐步完成,核心的业务都由K8S集群中的pod对外提供服务。各个微服务应用间的内部资源调用次数、调用链耗时、调用阈值告警、超时错误等信息指标对保障业务健康运行来讲显得很是重要。因为现网使用的是云容器引擎服务,公有云提供了一整套的解决方案。下面是华为云和阿里云相关的产品介绍,整体来讲,借助这类的工具,能够快速的查看微服务的各项指标和调用状况,定位相关的问题。html
https://support.huaweicloud.com/apm/index.html
https://help.aliyun.com/document_detail/63796.html?spmjava
那么刚需来了,程序猿但愿内网开发和测试环境能对照现网生产环境也来这么一套差很少的监控工具,一些隐藏的问题不须要等到上了生产环境才能发现。
问:运维同窗要怎么知足这个需求呢?
答:开发和测试环境也迁移上公有云。
PS:内心想一想就算了!git
本文介绍使用pinpoint知足程序猿这个合理需求。github
pinpoint是开源在github上的一款APM监控工具,它是用Java编写的,用于大规模分布式系统监控。关于pinpoint服务端的部署可参考下列的文档。
http://www.javashuo.com/article/p-tzaotqzn-a.htmldocker
一、开始前咱们要先准备好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
.# 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包和配置文件运维
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
首先定义一个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
业务容器上将pod的ip作成变量POD_IP, 用于-Dpinpoint.agentId使用,经过CATALINA_OPTS变量配置pinpoint客户端相关的参数。第一行是pinpoint agent的jar包位置,为了方便后续升级,这里把具体的版本号去掉。第二行是agent的ID,这个ID是惟一的,使用POD_IP变量动态生成。第三行是采集项目的名称。
业务容器须要挂载pp-agent这个卷,这样经过使用init-containers技术就实现了客户端埋点的效果。
一、客户端启动验证
二、服务端UI查看调用链