使用pod的postStart与preStop实现服务自动注册到consul和注销。

在使用Prometheus做监控的时候,通常我们配合consul一起来实现服务自动发现的功能。例如node_exporter,我们通常会使用ansible-playbook在初始化系统的时候,安装node_exporter,最后注册到consul中,然后Prometheus配置consul consul_sd_configs。

根据相同的原理,启动一个pod之后,我们希望一个pod在启动的时候自动注册到consul ,然后pod销毁的时候自动从consul注销。省去手动操作的麻烦。

例如我们使用运行了一些nginx的pod,我们同时可以在pod中跑一个sidecar容器nginx_exporter,用来暴露nginx的metric,然后在Prometheus中来监控。

pod的container定义中,提供了lifecycle,其中postStart 用于定义容器在启动之后做的一些操作,preStop用于定义容器在退出之前做的一些操作,这两个功能正好用于实现我们上面的需求,就是在postStart中定义将服务注册到consul,preStop中定义将服务从consul中注销。其实无非就是请求consul注册与注销服务的接口。

而当前,我们的环境是这样的,例如一个deployment,他的replicaset中有多个副本,比如说我们一个pod里面跑了nginx+php-fpm,来提供WordPress的服务。这个时候,有多个nginx需要监控,这些nginx需要注册到consul中,这个时候我们可以定义consul中service的name为deployment的name,然后具体里面的instance,我们就可以用pod的name来进行区分。

另外,consul要定时检测服务的metric接口是否还存活,所以consul这里需要知道pod的地址。而这些参数需要在请求注册和注销的时候,需要提前就有,我们就可以将这些信息映射到环境变量中,这个时候就涉及到pod中Downward API的使用,也就是让容器知道pod本身的一些信息,例如pod的名字,pod的ip地址,pod的namespace等等。

这里我演示在安装nginx-ingress-controller的时候,怎样自动注册到consul来进行监控:

在容器的定义中,加入env:

一共配置了5个环境变量,其中POD_NAME,POD_NAMESPACE是官方yml文件自带的,在下面的command-line定义中,需要用到,我们这里又加了POD_IP,CONSUL_ADDR,CONSUL_PORT这三个,其中consul也部署与k8s集群中,使用helm进行部署,具体部署方法网上文章很多,这里不再赘述。

接下来,定义容器的lifecycle:

可以看到,在postStart中,我们定义将服务注册到consul,而在preStop中,我们定义将服务从consul中注销。其中postStart是执行了一个脚本,因为在请求consul注册接口的时候,请求包体太长了,在这里写不方便看。所以我将请求指令放到一个脚本中,单独用configmap挂载到容器中即可。这里看一下configmap的内容:

配置到这里,基本上已经完成,当我们apply nginx-ingress-controller的yml文件的时候,pod启动,在consul中可以看到,启动的三个ingress pod自动注册进来了:

这个时候,再去Prometheus中看,target中也出现了这三个pod:

最后在grafana中导入nginx-ingress的dashboard,大盘就可以使用了:

最终,我们实现了从pod启动,到服务注册、然后Prometheus监控、grafana大盘展示的一条龙服务。

留下评论