当想要查看Kubernetes的事件时,却发现它已经消失了

在我进行 Kubernetes 故障排除时的背景下。

「听说应用程序出了问题,Kubernetes上有什么异常情况吗?」
运维人员:「好的,我会查看Kubernetes事件来找出问题的原因。」

我认为这样做就是直奔Kubernetes集群。(图1)

image.png

当你奔跑向某处时,你可以做的事情包括:

通过获取在Kubernetes集群中发生的事件,您可以大致了解发生了什么。
然而,由于事件仅保留1小时,因此如果通知延迟或者响应速度慢,可能会错过这些事件。(参见图2)

image.png

研究Event的持久化机制(通过通知机制进行持久化)(Event导出器)。

Kubecon EU 2019上发布的kubernetes-event-exporter是一种方法。
Github链接:https://github.com/opsgenie/kubernetes-event-exporter

在下述页面中,关于向Slack发送通知的方法有详细说明,对我非常有帮助。
由于kubernetes-event-exporter v0.8(2020/06发布版)支持向MS Teams发送通知,因此我打算进行验证。
参考来源: https://qiita.com/kob-u/items/125bccf9dba5a7dd9a90

搭建Kubernetes事件导出工具的配置

从Github获取

git clone https://github.com/opsgenie/kubernetes-event-exporter

写下适用于Teams的设置

默认配置(deploy/01-config.yaml)如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: event-exporter-cfg
  namespace: monitoring
data:
  config.yaml: |
    logLevel: error
    logFormat: json
    route:
      routes:
        - match:
            - receiver: "dump"
    receivers:
      - name: "dump"
        file:
          path: "/dev/stdout"

在 data.config.yaml 文件中的 receivers 部分进行 Teams 接收器的设置

团队的设置示例与Github的指南一致。

将以下的endpoint部分替换为webhook endpoint。

# ...
receivers:
  - name: "ms_teams"
    teams:
      endpoint: "https://outlook.office.com/webhook/..."
      layout: # Optional

设定示例

cat 01-config.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: event-exporter-cfg
  namespace: monitoring
data:
  config.yaml: |
    logLevel: error
    logFormat: json
    route:
      routes:
        - match:
            - receiver: "ms_teams"
    receivers:
      - name: "dump"
        file:
          path: "/dev/stdout"
      - name: "ms_teams"
        teams:
          endpoint: "https://outlook.office.com/webhook/..."

部署

❯ k apply -f 00-roles.yaml              
namespace/monitoring created
serviceaccount/event-exporter created
clusterrolebinding.rbac.authorization.k8s.io/event-exporter created

❯ k apply -f 01-config.yaml             
configmap/event-exporter-cfg created

❯ k apply -f 02-deployment.yaml         
deployment.apps/event-exporter created

❯ k get po
NAME                              READY   STATUS    RESTARTS   AGE
event-exporter-555d56c958-w9cld   1/1     Running   0          3s

❯ k logs event-exporter-555d56c958-w9cld 

❯ k run nginx --image nginx
pod/nginx created

我可以确认团队会收到事件的通知

image.png

实际应用的方法

由于本来通知所有事件并不开心,所以只希望在发生OOMKilled、CrashLoopBackOff和ImagePullBackOff事件时通知。

只需一种选项,请将以下内容用中文进行表达:
试试将事件的类型设为警告以便通知。

通过在config.yaml文件的route.routes[].drop中设置type: Normal,可以将正常事件设定为非通知。

apiVersion: v1
kind: ConfigMap
metadata:
  name: event-exporter-cfg
  namespace: monitoring
data:
  config.yaml: |
    logLevel: error
    logFormat: json
    route:
      routes:
        - match:
            - receiver: "ms_teams"
          drop:
            - type: "Normal"
    receivers:
      - name: "dump"
        file:
          path: "/dev/stdout"
      - name: "ms_teams"
        teams:
          endpoint: "https://outlook.office.com/webhook/..."

试试通过指定一个不存在的osushi镜像来触发ImagePullBackOff。

如果没有寿司,就会被生气地责备。

❯ k run nginx --image osushi  
pod/nginx created

❯ k get event | grep Warn
6s          Warning   Failed              pod/nginx                              Failed to pull image "osushi": rpc error: code = Unknown desc = failed to pull and unpack image "docker.io/library/osushi:latest": failed to resolve reference "docker.io/library/osushi:latest": pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed
6s          Warning   Failed              pod/nginx                              Error: ErrImagePull
6s          Warning   Failed              pod/nginx                              Error: ImagePullBackOff
image.png

其他的事件出口

纯粹是作为出口商角色封闭的类型

由于不需负责通知部分,可以使用单独的Prometheus规则来灵活设置警报。

Opsgenie本身可以独立运行,但它需要依赖于收集指标的 Prometheus 和 Alertmanager 等前提条件,因此根据用途来看。

踩云/事件导出器 (Caiyun/

总结

    • kubernetesのトラブルシュートのためにEventを別途保持する仕組みとして、kubernetes-event-exporterを調査した。

 

    • 2020/06リリースのv0.8にてMS Teams向けに通知を行えるようになったので、実際に検証しうまく通知されることを確認した。

 

    Teams内にてEventを保持することで、普段からMS Teamsを使用している場合にシームレスにトラブル対応に移行することが期待できる
广告
将在 10 秒后关闭
bannerAds