python - 在 Kubernetes 集群中使用 Python 设置 Prometheus
问题描述
我正在使用从https://github.com/helm/helm下载的 helm 图表将 Prometheus 集成到我的 Kubernetes 集群中。如果您必须知道,我正在使用 Azure 部署我的 AKS。在我的每个 pod 中,容器运行一个 Docker 映像,其中包含master_server.py
控制我的主 pod 中的工作流的脚本。
我正在尝试通过master_server.py
官方 Prometheus Python 包 - https://github.com/prometheus/client_python从我的主 pod 中获取一些自定义指标。我的master_server.py
长相是这样的
master_server.py
(截断)
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.websocket
import tornado.gen
import tornado.concurrent
import prometheus_client as prom
num_req = prom.Counter('number_of_request_receive_by_master',
'number of request receive by master')
num_worker = prom.Gauge('number_of_worker_available',
'number of worker available')
def main():
logging.debug('Starting up server')
.
.
.
if __name__ == "__main__":
main()
prom.start_http_server(8081)
我用谷歌搜索了一个 lil,发现我需要添加注释以允许 Prometheus 从我的主 pod 中刮取数据。因此,在我的deployment.yaml
文件中,我添加了以下代码片段,以允许 Prometheus 从我的主 pod 中抓取数据。
template:
metadata:
annotations:
prometheus.io/scrape: 'true'
prometheus.io/port: '8081'
尽管如此,它还是没有用。我在 Prometheus 查询中看不到我的自定义指标。
以下是我deployment.yaml
的master pod。
Name: kaldi-feature-test-master
Namespace: kaldi-test
CreationTimestamp: Fri, 10 Jan 2020 01:53:09 +0800
Labels: app.kubernetes.io/instance=kaldi-feature-test
app.kubernetes.io/managed-by=Tiller
app.kubernetes.io/name=kaldi-feature-test-master
helm.sh/chart=kaldi-feature-test-0.1.0
Annotations: deployment.kubernetes.io/revision: 1
Selector: app.kubernetes.io/instance=kaldi-feature-test,app.kubernetes.io/name=kaldi-feature-test-master
Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable
StrategyType: RollingUpdate
MinReadySeconds: 0
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: app.kubernetes.io/instance=kaldi-feature-test
app.kubernetes.io/name=kaldi-feature-test-master
Annotations: prometheus.io/port: 8081
prometheus.io/scrape: true
Containers:
kaldi-feature-test-master:
Image: kalditest.azurecr.io/kalditestscaled:latest
Port: 8080/TCP
Host Port: 0/TCP
Command:
/home/appuser/opt/tini
--
/home/appuser/opt/start_master.sh
Limits:
cpu: 2
memory: 2Gi
Requests:
cpu: 2
memory: 2Gi
Liveness: http-get http://:http/ delay=0s timeout=1s period=10s #success=1 #failure=3
Readiness: http-get http://:http/ delay=0s timeout=1s period=10s #success=1 #failure=3
Environment Variables from:
environment-variables-master-secret Secret Optional: false
Environment: <none>
Mounts: <none>
Volumes: <none>
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets: <none>
NewReplicaSet: kaldi-feature-test-master-79886c5d76 (2/2 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 15m deployment-controller Scaled up replica set kaldi-feature-test-master-79886c5d76 to 2
我检查了 Prometheus 目标并意识到与我的主 pod 的连接被拒绝。
我应该怎么做才能让 Prometheus 从我的主 pod 中抓取自定义指标?
解决方案
是的,感谢查尔斯的评论,我得到了它的工作!
我在端口 8080 的主 pod 中为我的应用程序运行Tornado Web 服务器,因此可能会中断 Prometheus HTTP 服务器以从主 pod 中抓取指标。
最后,我在我的主 pod 的 8081 上打开了另一个端口,deployment.yaml
就像这样,
.
.
.
containers:
- name: master-pod-name
image: master-pod-image
ports:
- name: http
containerPort: 8080 # this is for my Tornado web server
protocol: TCP
- name: prometheus
containerPort: 8081
.
.
.
然后在我在主 pod 中运行的 python 脚本中,我将 Prometheus 服务器设置为在端口 8081 上运行。最后它工作了 -prom.start_http_server(8081)
推荐阅读
- c# - 无法将“T”类型的值分配给“T”类型的实例
- mysql - mysql获取where子句天气计数是否为0
- excel - 每周粒度上的每月运行总计的 Dax 度量
- javascript - In form 仅在 if 或 both if 时才起作用
- php - navigator.getUserMedia 在非本地的 php 服务器上未定义,但在本地它可以完美运行
- node.js - 在 POSIX 和 nodeJS 中写入文件名包含“/”的文件
- r - R中for循环中的条件计数
- oracle-sqldeveloper - 如何以 PSV 格式和多个文件从 Oracle SQL Developer 导出大量数据
- python - 如何使用 Azure DevOps / VSTS 在 python 中获取查询结果
- python - 有没有人可以在这个 python 代码中帮助我?