教程:创建定制监视器
在 IBM Cloud Pak for Data 4.7 版本支持结束之前,升级到 IBM Software Hub 5.1 版本。 更多信息,请参阅 IBM Software Hub 版本 5.1 文档中的升级 IBM Software Hub。
您可以使用本教程来构建跟踪持久卷声明的定制监视器,并根据状态报告事件。
如果 PVC 已绑定,将为该 PVC 注册 info。 如果 PVC 处于未绑定或故障状态,将记录 critical 事件。 此监视器基于 Python 3.7 ,并使用 Kubernetes Python SDK 与集群进行交互。
步骤 1:创建 Python 脚本以监视和记录 PVC 状态
以下脚本使用集群内配置向 Kubernetes 进行认证并访问资源。 缺省情况下,您可以访问以下卷:
zen-service-broker-secret
在 cron 作业初始化过程中会提供以下环境变量:
ICPD_CONTROLPLANE_NAMESPACE:控制平面名称空间。
以下 Python 脚本 (pvc-monitor.py) 列出 PVC 并根据其状态生成事件。 所有非绑定 PVC 都会以紧急严重性进行记录。 这些事件会以 JSON 数组的形式发送到 POST events 端点,并通过服务代理程序令牌进行授权。
import os
import requests
import json
from kubernetes import client, config, watch
def main():
# setup the namespace
ns = os.environ.get('ICPD_CONTROLPLANE_NAMESPACE')
if ns is None:
ns = ""
monitor_type = "sample-monitor"
event_type = "check-pvc-bound"
# configure client
config.load_incluster_config()
api = client.CoreV1Api()
# configure post request and set secret headers
url = 'https://zen-watchdog-svc:4444/zen-watchdog/v1/monitoring/events'
with open('/var/run/sharedsecrets/token', 'r') as file:
secret_header = file.read().replace('\n', '')
headers = {'Content-type': 'application/json', 'secret': secret_header}
# Print PVC list, set status as critical for unbound or failed pvc
pvcs = api.list_namespaced_persistent_volume_claim(namespace=ns, watch=False)
events = []
for pvc in pvcs.items:
severity = "info"
print("pvc {}: {}".format(pvc.metadata.name, pvc.status.phase))
if pvc.status.phase != 'Bound':
severity = "critical"
metadata = "{}={}".format("Phase", str(pvc.status.phase))
data = {"monitor_type":monitor_type, "event_type":event_type, "severity":severity, "metadata":metadata, "reference":pvc.metadata.name, "namespace": pvc.metadata.namespace}
if pvc.metadata.labels is not None and "icpdsupport/addOnId" in pvc.metadata.labels:
data["addon_id"] = pvc.metadata.labels["icpdsupport/addOnId"]
events.append(data)
json_string = json.dumps(events)
print("events: {}".format(json_string))
# post call to zen-watchdog to record events
r = requests.post(url, headers=headers, data=json_string, verify=False)
print("status code: {}".format(r.status_code))
if __name__ == '__main__':
main()
步骤 2:创建和运行 Dockerfile
要使 Python 脚本在容器化环境中运行,您需要访问包含 Kubernetes Python SDK 的 Python 可执行文件。
您需要以下 requirements.txt:
kubernetes==11.0.0
您需要以下 Dockerfile:
# set base image (host OS)
FROM python:3.8
RUN mkdir /pvc-monitor
# set the working directory in the container
WORKDIR /pvc-monitor
ADD . /pvc-monitor
# install dependencies
RUN pip install -r requirements.txt
# command to run on container start
CMD [ "python", "./pvc-monitor.py" ]
requirements.json 文件包含映像的所有必需软件包。 项目的最终结构将类似于以下示例:
-----Python app to monitor and alert for PVCs
Pvc-monitor/
pvc-monitor.py
Requirements.txt
Dockerfile
此结构到位后,您可以使用以下命令来构建 Docker 映像:
docker build -f Dockerfile -t pvc-monitor:latest .
最后,标记 Docker 映像并将其推送到 OpenShift® 注册表中,以便警报 cron 作业可以访问该映像。
docker tag <docker-image-id> <docker-registry>/<namespace>/pvc-monitor:latest
docker push <docker-registry>/<namespace>/pvc-monitor:latest
步骤 3:为监视器设置扩展 configmap
将 Docker 映像推送到 OpenShift 注册表后,可以创建指向该映像的扩展 configmap。 此步骤确保警报管理器拾取该映像,并创建 cron 作业,该作业确保脚本按调度时间间隔运行。
您可以使用以下样本 configmap:
apiVersion: v1
kind: ConfigMap
metadata:
name: sample-monitor-extension
labels:
icpdata_addon: "true"
icpdata_addon_version: "1.0.0"
data:
extensions: |
[
{
"extension_point_id": "zen_alert_monitor",
"extension_name": "zen_alert_monitor_sample",
"display_name": "Sample alert monitor",
"details": {
"name":"sample-monitor",
"description": "sample monitor description",
"image": "image-registry.openshift-image-registry.svc:5000/zen/pvc-monitor:latest",
"schedule": "*/10 * * * *",
"event_types": [
{
"name": "check-pvc-bound",
"simple_name": "PVC bound check",
"alert_type": "platform",
"short_description": "A monitor that checks whether a PVC is bound.",
"long_description": "PVC status phase: <Phase>"
}
]
}
}
]