尝试使用 Zabbix 6.0 的 Kubernetes 监控功能来监控 Red Hat OpenShift
首先
在Zabbix 6.0中新增了对Kubernetes的监控功能,现在可以监控Kubernetes基础架构。
本文总结了将Kubernetes监控功能应用于OpenShift的情况。
Zabbix 6.0 的 Kubernetes 監控功能
Zabbix Helm Chartを使用してKubernetesクラスタにZabbixプロキシとZabbixエージェントをインストールし、KubernetesノードやPodに関する情報を収集します。
提供される以下のKubernetes監視用テンプレートを使用し、KubernetesノードとPodの自動検出と監視が行えます。
-
- Kubernetes nodes by HTTP
-
- Kubernetes cluster state by HTTP
-
- Kubernetes API server by HTTP
-
- Kubernetes Controller manager by HTTP
-
- Kubernetes Scheduler by HTTP
- Kubernetes kubelet by HTTP
先决条件
Kuberbetes監視の前提条件は、以下の通りです。
-
- Kubernetes cluster 1.18+
-
- Helm 3.0+
-
- Zabbix server 6.0+
- kube-state-metrics 2.13.2+
我所使用的环境
・这是之前在这里发布过文章的Zabbix Server 6.0.1环境。
・OpenShift(基于IBM Cloud的Red Hat OpenShift):v4.8.26_1542。
设置步骤
将Zabbix Helm Chart安装到OpenShift集群中。
安装 Helm 3.
如果没有安装必备的Helm,则需要在之前进行安装。
# curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
# chmod 700 get_helm.sh
# ./get_helm.sh
Downloading https://get.helm.sh/helm-v3.8.0-linux-amd64.tar.gz
Verifying checksum... Done.
Preparing to install helm into /usr/local/bin
helm installed into /usr/local/bin/helm
将1.2版本的存储库进行克隆。
# git clone https://git.zabbix.com/scm/zt/kubernetes-helm.git
Cloning into 'kubernetes-helm'...
remote: Enumerating objects: 125, done.
remote: Counting objects: 100% (125/125), done.
remote: Compressing objects: 100% (124/124), done.
remote: Total 125 (delta 70), reused 0 (delta 0)
Receiving objects: 100% (125/125), 33.44 KiB | 8.36 MiB/s, done.
Resolving deltas: 100% (70/70), done.
2022/08/21現在、branch/6.2が提供されています。必要に応じて最新のBranchを利用します。
本記事の環境では、branch/6.0を使用しています。
1.3 Chartのデフォルト設定値をzabbix_values.yamlにエクスポート
# cd kubernetes-helm
# git checkout release/6.0
# helm show values . > ./zabbix_values.yaml
1.4 值的编辑
OpenShiftにデプロイする場合のみ、valueからsecurityContext設定を削除する必要があります。
※OpenShiftはvanillaのKubernetesに比べてuid, gidの扱いが厳格になっており、デフォルトで65535より小さいuid, gidの使用が禁止されている為
参考)A Guide to OpenShift and UIDs
# vi zabbix_values.yaml
(以下を削除)
securityContext:
runAsUser: 65534
runAsGroup: 65534
fsGroup: 65534
创建一个使用Zabbix的命名空间。
这次我们选择了一个名为 zabbix-monitoring 的命名空间,但是您可以根据需要进行任意设置。
# oc new-project zabbix-monitoring
安装Kubernetes Helm 1.6。
# helm install zabbix . --dependency-update -f ./zabbix_values.yaml -n zabbix-monitoring
Getting updates for unmanaged Helm repositories...
...Successfully got an update from the "https://prometheus-community.github.io/helm-charts" chart repository
Saving 1 charts
Downloading kube-state-metrics from repo https://prometheus-community.github.io/helm-charts
Deleting outdated charts
W0316 19:54:07.223940 485684 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
W0316 19:54:10.166080 485684 warnings.go:70] policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
NAME: zabbix
LAST DEPLOYED: Wed Mar 16 19:54:06 2022
NAMESPACE: zabbix-monitoring
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Thank you for installing zabbix-helm-chrt.
Your release is named zabbix.
Zabbix agent installed: "zabbix/zabbix-agent2:alpine-6.0.2"
Zabbix proxy installed: "zabbix/zabbix-proxy-sqlite3:alpine-6.0.2"
Annotations:
app.kubernetes.io/name: zabbix-zabbix-helm-chrt
helm.sh/chart: zabbix-helm-chrt-0.0.1
app.kubernetes.io/version: "trunk"
app.kubernetes.io/managed-by: Helm
Service account created:
zabbix-service-account
To learn more about the release, try:
$ helm status zabbix
$ helm get all zabbix
以上,安装已完成。
确认已部署资源
麦克风
zabbix-agentがDaemonSetとしてデプロイされ(クラスターはWorkerNode3ノード)、zabbix-kube-state-metricsとzabbix-proxyがdeploymentでデプロイされました。
# oc get pod
NAME READY STATUS RESTARTS AGE
zabbix-agent-5spdn 1/1 Running 0 60s
zabbix-agent-cgrrx 1/1 Running 0 60s
zabbix-agent-ngnt2 1/1 Running 0 60s
zabbix-kube-state-metrics-78868498-krr6t 1/1 Running 0 60s
zabbix-proxy-5d49c88d9b-tnzjx 1/1 Running 0 60s
服务账号
# oc get sa
NAME SECRETS AGE
builder 2 6d21h
default 2 6d21h
deployer 2 6d21h
zabbix-agent-service-account 2 7m39s
zabbix-kube-state-metrics 2 7m39s
zabbix-service-account 2 7m39s
服务
# oc get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
zabbix-kube-state-metrics ClusterIP 172.21.211.142 <none> 8080/TCP 19d
zabbix-zabbix-helm-chrt-agent ClusterIP 172.21.246.99 <none> 10050/TCP 19d
zabbix-zabbix-helm-chrt-proxy ClusterIP 172.21.156.172 <none> 10051/TCP 19d
最终点
# oc get ep
NAME ENDPOINTS AGE
zabbix-kube-state-metrics 172.30.88.174:8080 29d
zabbix-zabbix-helm-chrt-agent 10.129.176.23:10050,10.129.176.27:10050,10.129.176.7:10050 29d
zabbix-zabbix-helm-chrt-proxy 172.30.17.208:10051 29d
3. Zabbix Server的设置配置
テンプレートを適用し、ZabbixServerからOpenShiftのリソース情報を取得していきます。
3.1 创建Zabbix代理
3.2 应用 Kubernetes 节点通过 HTTP 模板。
为了应用”通过HTTP监视Kubernetes节点”的模板,需要将节点注册为主机。
点击”设置>主机>创建主机”,添加集群节点的主机。
由于此环境是完全托管的OpenShift,MasterNode由IBMCloud进行管理,因此在这里我们选择了一个WorkerNode作为主机。
-
- テンプレートは、”Kubernetes nodes by HTTP” を選択
- インターフェース > エージェント にWorkerNodeのIPを入力
为创建的主机设置主机宏。
当環境では
https://c100.private.jp-tok.containers.cloud.ibm.com:31403/api{$KUBE.API.TOKEN}zabbix-service-accountシークレットから取得する[※]
※请使用以下命令来获取令牌。
#oc get secret zabbix-service-account -n monitoring -o jsonpath={.data.token} | base64 -d
应用HTTP模板的Kubernetes集群状态为3.3.
クラスター監視用テンプレート “Kubernetes cluster state by HTTP”を適用するため、ノードをホスト登録します。
(3.2で”Kubernetes nodes by HTTP”テンプレートを適用したホストに、”Kubernetes cluster state by HTTP”を適用することはできません。ディスカバリーがバッティングし、エラーとなりますので、別のホストを設定する必要があります)
点击“设置>主机>创建主机”以添加集群节点主机。
对创建的主机进行主机宏设置。
当環境では
https://c100.private.jp-tok.containers.cloud.ibm.com:31403/api{$KUBE.API.TOKEN}zabbix-service-accountシークレットから取得{$KUBE.API.HOST}当環境では、c100.private.jp-tok.containers.cloud.ibm.com{$KUBE.API.PORT}デフォルト6443
当環境の場合は31403を設定{$KUBE.API_SERVER.PORT}デフォルト6443
当環境の場合は31403を設定
以下的模板残留部分无需手动应用于主机。它们将自动适用于已发现的资源。
-
- Kubernetes API server by HTTP
-
- Kubernetes Controller manager by HTTP
-
- Kubernetes Scheduler by HTTP
- Kubernetes kubelet by HTTP
确认数据
设定完成后,我们来确认一下对于 OpenShift 的发现结果和项目数据的获取内容。
ノード情報
Node discoveryによりOpenShiftクラスターの全てのノード(当環境の場合、3WorkerNode)が検出されプロトタイプホストとして登録されていることが確認できます。
Pod数据
已经获取了在OpenShift集群上运行的所有Pod的状态和资源情况。
发现其他资源并获取数据
应用Kubernetes监控功能到OpenShift时,我注意到的一些事项。
Zabbix服务器的负载
我们使用了一个刚部署但没有运行任何应用程序的OpenShift集群作为环境,但即使如此,已发现的项目数量仍然达到了37185个。
由于执行发现操作和获取大量项目数据的负载,经常会出现处理不及时的情况,导致轮询器超时,并且无法获取项目数据。此外,由于存储数据增加,数据库在大约10天后就会崩溃。
如果要将OpenShift添加为现有的Zabbix服务器的监控目标,则很可能需要增加Zabbix服务器的资源。
某些组件无法被检测到。
在Kubernetes集群中,APIServer、Controller-Manager和Scheduler被识别并自动注册为主机的原型。然而,在我们的OpenShift环境中,无法实现它们的自动识别。
另外,尽管Controller-Manager和Scheduler实际上正在运行,但无法正确获取其状态,导致收到Unhealthy事件的通知。
# oc get clusteroperator
NAME VERSION AVAILABLE PROGRESSING DEGRADED SINCE
console 4.8.31 True False False 28d
csi-snapshot-controller 4.8.31 True False False 28d
dns 4.8.31 True False False 28d
image-registry 4.8.31 True False False 28d
ingress 4.8.31 True False False 28d
kube-apiserver 4.8.31 True False False 28d
kube-controller-manager 4.8.31 True False False 28d
kube-scheduler 4.8.31 True False False 28d
对于无法正确获取状态的问题,可能是由于以下命令输出的OpenShift 4.x已知的问题所引起的。
oc get cs
W0330 14:16:42.128291 15591 warnings.go:67] v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
controller-manager Unhealthy Get "http://127.0.0.1:10252/healthz": dial tcp 127.0.0.1:10252: connect: connection refused
scheduler Unhealthy Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused
etcd-0 Healthy {"health":"true"}
最后
关于Zabbix的Kubernetes监控功能,只要求Kubernetes集群的版本为1.18+,没有明确提及对OpenShift的支持。
然而,在模板的README中提及了OpenShift,所以可能包含在支持范围内。
在本次尝试使用完全托管的OpenShift后,遗憾的是无法实现部分预期的检测和监控,但是节点的自动检测和Pod的运行状态监控可以正常实现。