用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