使用kubewatch来监控你的k8s集群

简介

kubewatch 还是一个不错的小工具,用来监控集群中的事件是很不错的

安装

安装就直接使用helm去安装了,首先添加repo

helm repo add bitnami https://charts.bitnami.com/bitnami

之后获取可以配置的values

helm show values bitnami/kubewatch >values.yaml

这里我就修改比较基本的东西,首先是镜像,因为是使用的本地仓库,所以修改了镜像的名字,这样就不需要每次都去dockerhub上去拉取了

1
2
3
4
image:
  registry: reg.bboysoul.cn
  repository: kubewatch
  tag: 0.1.0-debian-10-r107

之后是需要收到告警的平台,默认支持

  • hipchat
  • slack
  • mattermost
  • flock
  • msteams
  • webhook
  • smtp

因为我这里使用的是企业机器人,所以直接webhook,配置如下

1
2
3
webhook:
  enabled: true
  url: "http://wechat-webhook:8080"

接着就是配置要监控的namespace,默认不写的话就是监控所有的namespace,这里我只监控我固定的namespace

namespaceToWatch: "app"

之后是配置需要监控的资源,因为kubewatch只要集群中有事件就会自动推送,所以信息会很多,这里我只选择了关键的deployment

1
2
3
4
5
6
7
8
9
resourcesToWatch:
  deployment: true
  replicationcontroller: false
  replicaset: false
  daemonset: false
  services: false
  pod: false
  job: false
  persistentvolume: false

rbac 权限改为true

1
2
rbac:
  create: true

其他的个人觉得没有什么可以配置的

启动

helm upgrade --install --create-namespace -n kube-watch -f values.yaml kubewatch bitnami/kubewatch

接着就是写一个webhook去接收信息,然后发送到企业微信,脚本如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from flask import Flask, request
import requests
import json


app = Flask(__name__)


wechat_boot_url=""

def send_wechat(text,time):
    headers = {'Content-Type': 'application/json;charset=utf-8'}
    body = {
        "msgtype": "markdown",
        "markdown": {
            "content": "事件内容: " + text + "\n 事件时间: " + time
        }
    }
    requests.post(wechat_boot_url, json.dumps(body), headers=headers)


@app.route('/', methods=['POST'])
def index():
    message = request.data
    message = json.loads(message)
    text = message['text']
    time = message['time']
    send_wechat(text,time)
    return ('This is a website.', 200, None)

if __name__ == '__main__':
    app.run(port=8080,host="0.0.0.0")

依赖于下面两个模块

  • flask
  • requests

默认接收过来的数据格式如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
{
    'eventmeta': {
        'kind': 'deployment', 
        'name': 'app/app', 
        'namespace': '', 
        'reason': 'updated'
    }, 
    'text': 'A `deployment` in namespace `` has been `updated`:\n`app/app`', 
    'time': '2020-12-08T06: 41: 26.430943479Z'
}

可以修改一下脚本获取其他相关信息

下面是dockerfile

1
2
3
4
FROM python:3-alpine
COPY . /
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
CMD python3 main.py

然后是deployment.yaml,为了方便,我创建了一个service

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
apiVersion: v1
kind: Service
metadata:
  name: wechat-webhook
  namespace: kube-watch
  labels:
    app: wechat-webhook
spec:
  ports:
    - name: wechat-webhook
      port: 8080
      targetPort: 8080
  selector:
    app: wechat-webhook
---
apiVersion: apps/v1
kind: Deployment 
metadata:
  name: wechat-webhook
  namespace: kube-watch
  labels:
    app: wechat-webhook
spec:
  replicas: 1
  selector:
    matchLabels:
      app: wechat-webhook
  template:
    metadata:
      labels:
        app: wechat-webhook
    spec:
      containers:
        - name: wechat-webhook
          image: 
          imagePullPolicy: Always
          ports:
            - name: wechat-webhook
              containerPort: 8080

如果对kubewatch有兴趣的,可以看我下面这个repo,所有的资源都在里面

https://github.com/bboysoulcn/kubewatch

欢迎关注我的博客 www.bboy.app

Have Fun