用kubectl CLI监视Kubernetes事件

如果无法使用Prometheus等工具来监视Kubernetes本身以及运行在其上的Pod的状态,我在下面的文章中介绍了一种用Shell脚本来监视kubectl get pod等命令的方法。

    kubectl CLIでPodの正常性を確認する

为了以相同的方式使用kubectl CLI并监视事件,我创建了一个用于此目的的shell脚本备忘录。

事件资源

以下是有关Event资源的API参考文档。

    https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.15/#event-v1-core

kubectl get events 的输出如下。

$ kubectl get event --all-namespaces -o wide
NAMESPACE     LAST SEEN   TYPE      REASON             KIND   SOURCE                  MESSAGE                                                                                               SUBOBJECT                 FIRST SEEN   COUNT   NAME
kube-system   4m51s       Warning   FailedScheduling   Pod    default-scheduler       0/4 nodes are available: 1 Insufficient cpu, 3 node(s) didn't match node selector.                                              22h          1533    audit-logging-fluentd-ds-kz289.15b8347ed1d0dc1b
kube-system   12m         Normal    Pulled             Pod    kubelet, 9.188.124.25   Container image "mycluster.icp:8500/ibmcom/icp-management-ingress:2.3.0" already present on machine   spec.containers{router}   9d           2860    monitoring-prometheus-collectdexporter-8c479ffcd-zwn4c.15b57dc4ecb4427d
kube-system   2m9s        Warning   BackOff            Pod    kubelet, 9.188.124.25   Back-off restarting failed container                                                                  spec.containers{router}   9d           63243   monitoring-prometheus-collectdexporter-8c479ffcd-zwn4c.15b57efcbfec5d05
$

TYPEという項目があり、Warningを監視すればよさそう

LAST SEENという項目があり、同じイベントはまとめて表示される
Eventリソースの存続時間は、apiserverの起動オプションの–event-ttlで指定されており、デフォルトは1時間。

https://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver/

观察每个单独的事件,可以发现以下的结构。

kubectl get event -n kube-system audit-logging-fluentd-ds-kz289.15b8347ed1d0dc1b -o yaml
apiVersion: v1
count: 1538
eventTime: null
firstTimestamp: "2019-08-06T02:29:49Z"
involvedObject:
  apiVersion: v1
  kind: Pod
  name: audit-logging-fluentd-ds-kz289
  namespace: kube-system
  resourceVersion: "11688159"
  uid: 343166a9-b101-11e9-b187-fa163e2fb2ab
kind: Event
lastTimestamp: "2019-08-07T01:25:33Z"
message: '0/4 nodes are available: 1 Insufficient cpu, 3 node(s) didn''t match node
  selector.'
metadata:
  creationTimestamp: "2019-08-06T02:29:49Z"
  name: audit-logging-fluentd-ds-kz289.15b8347ed1d0dc1b
  namespace: kube-system
  resourceVersion: "11844265"
  selfLink: /api/v1/namespaces/kube-system/events/audit-logging-fluentd-ds-kz289.15b8347ed1d0dc1b
  uid: 107c1e3f-b7f2-11e9-b187-fa163e2fb2ab
reason: FailedScheduling
reportingComponent: ""
reportingInstance: ""
source:
  component: default-scheduler
type: Warning

监视脚本 shì

与Pod等的状态监视一样,使用-o json选项以json格式输出,并且可以使用jq进行处理,这样很方便。假设我们将这个shell脚本每5分钟(300秒)执行一次,我们可以监视在这5分钟内观察到的警告事件。

在jq中,还有一些方便处理日期的函数。请参考手册。

    https://stedolan.github.io/jq/manual/

在kubectl的一侧,可以使用”–sort-by ‘{lastTimestamp}'”进行排序,或者使用”–field-selector type=Warning”进行筛选,但由于jq可做的更多,因此处理将更多地依赖于jq。

我编写了以下这样的脚本。

#!/bin/bash

set -eu
set -o pipefail

# kubectl get nodeを実行して結果を変数に格納
# "jq -c"は結果を改行等で整形せずコンパクトにするオプション
json=$(kubectl get event --all-namespaces -o json | jq -c .)

# 結果を時刻でソートしてから、
# Warningでフィルタリングし、
# 300秒以内であるかでフィルタリング
warnings=$(echo ${json} | jq -c '.items
  | sort_by( .lastTimestamp )
  | .[]
  | select( .type == "Warning" )
  | select( now - ( .lastTimestamp | fromdate ) <= 300 )'
)

# 結果を整形
# <時刻> <Namespace名> <イベント名> <メッセージ>
# "jq -r"は出力をクオートしないオプション
warnings=$(echo ${warnings} | jq -r '.lastTimestamp + " "
                                      + .involvedObject.namespace + " "
                                      + .involvedObject.name + " "
                                      + .message')

# warnings が空文字の場合は正常
if [ -z "${warnings}" ]; then
  echo "Warningはありません。"
else
  IFS=$'\n'
  for warning in "${warnings}"; do
    echo "${warning}"
  done
  unset IFS
  exit 1
fi

实际操作如下所示。

$ ./check-events.sh
2019-08-07T03:00:33Z kube-system audit-logging-fluentd-ds-kz289 0/4 nodes are available: 1 Insufficient cpu, 3 node(s) didn't match node selector.
2019-08-07T03:03:16Z kube-system monitoring-prometheus-collectdexporter-8c479ffcd-zwn4c Back-off restarting failed container
$

其他

在GKE上,有一个Event Exporter可将事件发送到Stackdriver。还有一些OSS可以将事件发送到Slack。

    • Events in Stackdriver

 

    • kubernetesのeventをSlackに通知する

 

    https://github.com/ultimateboy/slack8s
广告
将在 10 秒后关闭
bannerAds