[英]Setting Up Prometheus with Python in Kubernetes Cluster
我正在使用从https://github.com/helm/helm下载的 helm chart 将 Prometheus 集成到我的 Kubernetes 集群中。 如果您必须知道,我正在使用 Azure 来部署我的 AKS。 在我的每个 pod 中,容器运行一个 Docker 映像,其中包含控制我的主 pod 中的工作流的master_server.py
脚本。
我正在尝试使用官方 Prometheus Python 包 - https://github.com/prometheus/client_python通过master_server.py
从我的主 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 查询中看不到我的自定义指标。
下面是我的master pod的deployment.yaml
。
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 端口的 master pod 中为我的应用程序运行Tornado Web 服务器,因此这可能会中断 Prometheus HTTP 服务器以从 master pod 中抓取指标。
最后,我在主 pod 的deployment.yaml
打开了另一个 8081 端口,如下所示,
.
.
.
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 服务器设置为在端口prom.start_http_server(8081)
上运行。最后它起作用了 - prom.start_http_server(8081)
从Python代码和你提供的部署YAML文件可以看出,HTTP服务器监听的是8081端口,但是你只暴露了8080端口,没有包括8081端口。
因此,解决方案是您需要在部署的容器kaldi-feature-test-master
和将请求路由到部署应用程序的服务中公开端口 8081。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.