将 Prometheus 和 Kubewatch 与 Kubernetes 集群同步

Posted

技术标签:

【中文标题】将 Prometheus 和 Kubewatch 与 Kubernetes 集群同步【英文标题】:Syncing Prometheus and Kubewatch with Kubernetes Cluster 【发布时间】:2021-09-10 17:40:52 【问题描述】:

我想在某个 python 字典中获取 Kubernetes 集群中发生的所有事件,可能使用一些 API 从过去发生的事件中提取数据。我在互联网上发现,可以将 Kube-watch 的所有数据存储在 Prometheus 上,然后再访问它。我无法弄清楚如何设置它并在 python 中查看所有过去的 pod 事件。访问过去事件的任何替代解决方案也值得赞赏。谢谢!

【问题讨论】:

您想只查看 Pod 事件还是所有事件? 我想查看所有 Pod 事件 【参考方案1】:

我将描述一个不复杂且我认为满足您所有要求的解决方案。 诸如Eventrouter 之类的工具可以接收 Kubernetes 事件并将它们推送到用户指定的接收器。但是,正如您所提到的,您只需要 Pod 事件,因此我建议采用稍微不同的方法。

简而言之,您可以在 Pod 中运行 kubectl get events --watch 命令,并使用像 Loki 这样的日志聚合系统收集该命令的输出。

下面,我将提供详细的分步说明。

1。在 Pod 中运行 kubectl 命令

要仅显示 Pod 事件,您可以使用:

$ kubectl get events --watch --field-selector involvedObject.kind=Pod

我们想在 Pod 中运行这个命令。出于安全原因,我创建了一个单独的 events-collector ServiceAccount 并分配了 view 角色,我们的 Pod 将在此 ServiceAccount 下运行。注意:我创建了一个 Deployment而不是单个 Pod。

$ cat all-in-one.yml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: events-collector
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: events-collector-binding
subjects:
  - kind: ServiceAccount
    name: events-collector
    namespace: default
roleRef:
  kind: ClusterRole
  name: view
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: events-collector
  name: events-collector
spec:
  selector:
    matchLabels:
      app: events-collector
  template:
    metadata:
      labels:
        app: events-collector
    spec:
      serviceAccountName: events-collector
      containers:
      - image: bitnami/kubectl
        name: test
        command: ["kubectl"]
        args: ["get","events", "--watch", "--field-selector", "involvedObject.kind=Pod"]

应用上述清单后,event-collector 已创建并按预期收集 Pod 事件:

$ kubectl apply -f all-in-one.yml
serviceaccount/events-collector created
clusterrolebinding.rbac.authorization.k8s.io/events-collector-binding created
deployment.apps/events-collector created

$ kubectl get deploy,pod | grep events-collector
deployment.apps/events-collector           1/1     1            1           14s
pod/events-collector-d98d6c5c-xrltj            1/1     Running   0          14s

$ kubectl logs -f events-collector-d98d6c5c-xrltj
LAST SEEN   TYPE     REASON      OBJECT                                         MESSAGE
77s         Normal   Scheduled   pod/app-1-5d9ccdb595-m9d5n                     Successfully assigned default/app-1-5d9ccdb595-m9d5n to gke-cluster-2-default-pool-8505743b-brmx
76s         Normal   Pulling     pod/app-1-5d9ccdb595-m9d5n                     Pulling image "nginx"
71s         Normal   Pulled      pod/app-1-5d9ccdb595-m9d5n                     Successfully pulled image "nginx" in 4.727842954s
70s         Normal   Created     pod/app-1-5d9ccdb595-m9d5n                     Created container nginx
70s         Normal   Started     pod/app-1-5d9ccdb595-m9d5n                     Started container nginx
73s         Normal   Scheduled   pod/app-2-7747dcb588-h8j4q                     Successfully assigned default/app-2-7747dcb588-h8j4q to gke-cluster-2-default-pool-8505743b-p7qt
72s         Normal   Pulling     pod/app-2-7747dcb588-h8j4q                     Pulling image "nginx"
67s         Normal   Pulled      pod/app-2-7747dcb588-h8j4q                     Successfully pulled image "nginx" in 4.476795932s
66s         Normal   Created     pod/app-2-7747dcb588-h8j4q                     Created container nginx
66s         Normal   Started     pod/app-2-7747dcb588-h8j4q                     Started container nginx

2。安装 Loki

您可以安装Loki 来存储日志和处理查询。 Loki 就像普罗米修斯,但用于日志:)。安装 Loki 最简单的方法是使用 grafana/loki-stack Helm 图表:

$ helm repo add grafana https://grafana.github.io/helm-charts
"grafana" has been added to your repositories

$ helm repo update
...
Update Complete. ⎈Happy Helming!⎈

$ helm upgrade --install loki grafana/loki-stack


$ kubectl get pods | grep loki
loki-0                            1/1     Running   0          76s
loki-promtail-hm8kn               1/1     Running   0          76s
loki-promtail-nkv4p               1/1     Running   0          76s
loki-promtail-qfrcr               1/1     Running   0          76s

3。使用 LogCLI 查询 Loki

您可以使用LogCLI 工具对 Loki 服务器运行 LogQL 查询。有关安装和使用此工具的详细信息,请参阅LogCLI documentation。我将演示如何在 Linux 上安装它:

$ wget https://github.com/grafana/loki/releases/download/v2.2.1/logcli-linux-amd64.zip

$ unzip logcli-linux-amd64.zip
Archive:  logcli-linux-amd64.zip
  inflating: logcli-linux-amd64
  
$ mv logcli-linux-amd64 logcli

$ sudo cp logcli /bin/

$ whereis logcli
logcli: /bin/logcli

要从 Kubernetes 集群外部查询 Loki 服务器,您可能需要使用 Ingress 资源公开它:

$ cat ingress.yml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /
  name: loki-ingress
spec:
  rules:
    - http:
        paths:
          - backend:
              serviceName: loki
              servicePort: 3100
            path: /
            
 
$ kubectl apply -f ingress.yml
ingress.networking.k8s.io/loki-ingress created

$ kubectl get ing
NAME           CLASS    HOSTS   ADDRESS         PORTS   AGE
loki-ingress   <none>   *      <PUBLIC_IP>      80      19s

最后,我创建了一个简单的 python 脚本,我们可以使用它来查询 Loki 服务器:注意:我们需要设置 LOKI_ADDR 环境变量,如 @ 中所述987654329@。您需要将 &lt;PUBLIC_IP&gt; 替换为您的 Ingress IP。

$ cat query_loki.py
#!/usr/bin/env python3

import os

os.environ['LOKI_ADDR'] = "http://<PUBLIC_IP>"

os.system("logcli query 'app=\"events-collector\"'")


$ ./query_loki.py
...
2021-07-02T10:33:01Z  2021-07-02T10:33:01.626763464Z stdout F 0s          Normal    Pulling       pod/backend-app-5d99cf4b-c9km4                               Pulling image "nginx"
2021-07-02T10:33:00Z  2021-07-02T10:33:00.836755152Z stdout F 0s          Normal    Scheduled     pod/backend-app-5d99cf4b-c9km4                               Successfully assigned default/backend-app-5d99cf4b-c9km4 to gke-cluster-1-default-pool-328bd2b1-288w
2021-07-02T10:33:00Z  2021-07-02T10:33:00.649954267Z stdout F 0s          Normal    Started       pod/web-app-6fcf9bb7b8-jbrr9                                 Started container nginx2021-07-02T10:33:00Z  2021-07-02T10:33:00.54819851Z stdout F 0s          Normal    Created       pod/web-app-6fcf9bb7b8-jbrr9                                 Created container nginx
2021-07-02T10:32:59Z  2021-07-02T10:32:59.414571562Z stdout F 0s          Normal    Pulled        pod/web-app-6fcf9bb7b8-jbrr9                                 Successfully pulled image "nginx" in 4.228468876s
...

【讨论】:

感谢您的回答,非常有用。但我无法弄清楚第 3 步。我已经设置了 Loki,并且能够使用 grafana 和 loki 访问所有 pod 事件,但我不知道如何在 python 程序中导入这些数据。另外,我应该使用 Ingress 公开哪个服务?目前,我的集群中运行着 loki、loki-grafana、loki-stack 和 loki-headless。 @Dragnoid99 我编辑了我的答案并提供了更多详细信息。如果要从集群外部访问loki 服务,则需要公开它。此外,我创建了一个简单的 python 脚本来说明它是如何工作的。

以上是关于将 Prometheus 和 Kubewatch 与 Kubernetes 集群同步的主要内容,如果未能解决你的问题,请参考以下文章

为了解决 Prometheus 大内存问题,我竟然强行将 Prometheus Operator 给肢解了

全面学习Prometheus

如何将Prometheus仪表板添加到Grafana

zabbix 集成 prometheus 数据

一款开源监控和警报平台:Prometheus

将 prometheus 就绪应用程序添加到 Prometheus