编写第一个 Prober

Prober 探测集主要包含具体的探测逻辑以及探测结果的上报,下文将通过一个简单的 Demo 介绍 Prober 的使用与开发方法。

Prober 示例

如下为一个简单的 Prober 示例,其 Spec 主要包含两部分内容:Policy 和 Template。

  • Policy 用于定义 Prober 的运行方式,单次运行或周期运行。若未定义 Policy,则将以 Job 方式运行该 Prober;若定义了 Policy,则将以 Cronjob 的方式运行该 Prober。
  • Template 即 PodSpec,用于描述具体的运行负载 Pod,其探测上报逻辑以镜像的方式保存于 Pod Image 中。
  1. # prober-demo-example.yaml
  2. apiVersion: kubeprober.erda.cloud/v1
  3. kind: Probe
  4. metadata:
  5. name: prober-demo-example
  6. namespace: kubeprober
  7. spec:
  8. # if remove policy block, prober will run as a job; else it will run as a cronjob
  9. policy:
  10. # unit: minute
  11. runInterval: 30
  12. # template block is podSpec in fact
  13. template:
  14. containers:
  15. - name: prober-demo-example
  16. image: kubeprober/demo-example:v0.0.1
  17. resources:
  18. requests:
  19. cpu: 10m
  20. memory: 50Mi
  21. restartPolicy: Never

运行该 Prober 前,需先 安装 prober-agent 。随后运行该 Prober 执行具体的探测逻辑并上报探测结果,示例如下:

  1. ## 运行上文中的 prober-demo-example.yaml,去掉 policy, 以 job 的方式运行一次
  2. # kubectl apply -f prober-demo-example.yaml
  3. ## 查看 prober
  4. # kubectl -n kubeprober get probe
  5. NAME RUNINTERVAL IMAGE AGE
  6. prober-demo-example kubeprober/demo-example:v0.0.1 10m
  7. ## 查看 job
  8. # kubectl -n kubeprober get job
  9. NAME COMPLETIONS DURATION AGE
  10. prober-demo-example 1/1 3s 10m
  11. ## 查看 pod
  12. # kubectl -n kubeprober get pod|grep -i demo
  13. prober-demo-example-jzmnv 0/1 Completed 0 11m
  14. ## 查看运行结果 probestatus
  15. # kubectl -n kubeprober get probestatus
  16. NAME STATUS MESSAGE LASTRUN AGE
  17. prober-demo-example ERROR do check item2 failed, reason: ... 11m
  18. # kubectl -n kubeprober get probestatus prober-demo-example -o yaml
  19. apiVersion: kubeprober.erda.cloud/v1
  20. kind: ProbeStatus
  21. metadata:
  22. name: prober-demo-example
  23. namespace: kubeprober
  24. spec:
  25. checkers:
  26. - name: checker1 item1
  27. status: PASS
  28. - message: 'do check item2 failed, reason: ...'
  29. name: checker1 item2
  30. status: ERROR
  31. status:
  32. message: 'do check item2 failed, reason: ...'
  33. status: ERROR

Prober 编写

上文通过一个已有的 Prober 介绍基本使用方法,下文将通过具体案例介绍如何编写一个简单的 Prober。

Prober 主要包含具体的探测逻辑以及探测结果的上报,其中探测逻辑需要开发者根据具体需求实现,而结果的上报则调用已有的状态上报接口即可。该接口将自动获取注入到该 Prober Pod 的状态上报地址(默认为 prober-agent),随后上报状态。

通过 Golang 编写

  1. package main
  2. import (
  3. "github.com/sirupsen/logrus"
  4. kubeproberv1 "github.com/erda-project/kubeprober/apis/v1"
  5. probestatus "github.com/erda-project/kubeprober/pkg/probe-status"
  6. )
  7. func main() {
  8. // checker1 item1
  9. // do real check ..., and get check status
  10. // prober status shoud be stored in struc: kubeproberv1.ProbeCheckerStatus
  11. item1 := kubeproberv1.ProbeCheckerStatus{
  12. Name: "checker1 item1",
  13. Status: kubeproberv1.CheckerStatusPass,
  14. Message: "",
  15. }
  16. // checker1 item2
  17. // do real check ..., and get check status
  18. item2 := kubeproberv1.ProbeCheckerStatus{
  19. Name: "checker1 item2",
  20. Status: kubeproberv1.CheckerStatusError,
  21. Message: "do check item2 failed, reason: ...",
  22. }
  23. // send prober status using: func probestatus.ReportProbeStatus([]kubeproberv1.ProbeCheckerStatus) error
  24. err := probestatus.ReportProbeStatus([]kubeproberv1.ProbeCheckerStatus{item1, item2})
  25. if err != nil {
  26. logrus.Errorf("report probe status failed, error: %v", err)
  27. }
  28. }

通过 Shell 编写

  1. #!/bin/bash
  2. function checker2_item1_check() {
  3. # checker2 item1
  4. # do real check ..., and report check status
  5. report-status --name=checker2_item1 --status=pass --message="-"
  6. }
  7. function checker2_item2_check() {
  8. # checker2 item2
  9. # do real check ..., and report check status
  10. report-status --name=checker2_item2 --status=error --message="checker2 item2 failed, reason: ..."
  11. }
  12. checker2_item1_check
  13. checker2_item2_check

该 Shell Prober 需使用 Prober 基础镜像 kubeprober/probe-base:v0.1.2,镜像中包含上报接口程序 report-status

将上述 Prober Demo 打包到镜像并执行,即可执行探测逻辑并上报探测结果。