如何把腾讯云TKE K8s容器服务集成到Prometheus服务发现

准备工作

  • 首先打开tke集群的内网访问
  • 然后配置/etc/hosts
  • 最后配置一下k8s客户端的config文件

以上操作由于不可描述原因无法截图示意哈,请自行研究腾讯云官方文档,或者给我发邮件,附上你的腾讯云控制台账号密码, 收费150元我远程帮你操作一下哦~

  • 为每一个pod建立一个k8s service
  • 建立管理服务端口映射

以上每建一个service,收费10元,只让我示范建一个的话收费100元

  • 找一台机器装个saltmaster
  • 给每一个地区的每个集群的任意一个节点装上salt-minion

实现代码

开始贴正式的代码之前先说一下我们的模式,我们采用的是Prometheus的file_sd_configs 模式。

import os
import json
import argparse
import subprocess

def get_namespace(host_ip):
	# 你们的namespace最后有个特殊的标志,方便下面的grep过滤
	cmd_namespace = "salt {ip} cmd.run 'kubectl get ns' |awk '{{if (NR>2){{print $1}}}}'|grep xx"
	namespace_list = subprocess.check_output(cmd_namespace.format(ip=host_ip),shell=True).strip().split('\n')
	return namespace_list


def gen_prometheus_sd_json():
	def main(host_ip,namespace_list,area)
		cmd= "salt {ip} cmd.run 'kubectl get services -n {namespace}' |awk '{{if (NR>2){{print $1,$4}}}}'"
		data_list =[]
		for namespace in namespace_list:
			results = subprocess.check_output(cmd.format(ip=host_ip,namespace=namespace),shell=True)
			if not results:
				contine
			for result in results.strip().split('\n'):
				data_dict = {'lable':{},'target':[]}
				app_job_name = result.split(' ')[0]
				pod_ip = result.split(' ')[1]
				data_dict['lable']['application'] = app_job_name
				data_dict['lable']['env'] = 'prod'
				data_dict['lable']['job'] = app_job_name
				# 下面ip后面的端口请自行根据业务修改
				data_dict['target'].append(pod_ip + ':10086')
				data_list.append(data_dict)
		json_data = json.dumps(data_list, indent =4)
		json_file = 'tke_{}_sd_prod.json'.format(area)
		with open(json_file,'w') as tke:
			tke.write(json_data)
		# 自行替换salt后面的prometheus机器ip,salt文件服务器路径,Prometheus sd json路径
		deploy_cmd = 'salt 192.168.0.1 cp.get_file salt://{0} /data/prometheus/{0}'.format(json_file)
		os.system(deploy_cmd)
	# 自行替换tke集群任意节点ip, 做好博客中的准备工作
	xx_host_ip = '192.168.0.1'
	main(host_ip=xx_host_ip,namespace_list=get_namespace(), area='xx')


gen_prometheus_sd_json()

后续配置

  • 自行配置一个定时任务来跑这个脚本
  • 在Prometheus的主配置里面添加file_sd_configs 模式的服务发现,如下
- job_name: 'xx_sd_prod'
  scrape_interval: 5s
  scrape_timeout: 5s
  metrics_path: /admin/prometheus
  file_sd_configs:
  - files:
     - /xx/xx_sd_prod.json
     refresh_interval: 1m