编写使用第一个 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主要包含具体的探测逻辑以及探测结果的上报,其中探测逻辑需要开发者根据具体需求实现,而结果的上报,则只需要调用已有的状态上报接口即可。 该接口将会自动获取注入到该 prober pod 的状态上报地址(默认是prober-agent),然后上报状态。

golang 编写的 Prober

  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 编写的 Prober

  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

上述这些 pober demo 打包到镜像并执行,即可执行探测逻辑并上报探测结果。