繁体   English   中英

在 Kubernetes 集群中使用 Python 设置 Prometheus

[英]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 的连接被拒绝。 主 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM