无论是之前单体应用的时代,或是云原生大行其道的今天,「监控功能」一直扮演着十分重要的角色。一个良好的监控体系能够帮助工程师们快速了解运行在生产环境中的服务状态,并在服务异常时快速定位问题或者提前预警异常的发生。
Apache APISIX Ingress Controller 在最近几个版本中加强了对 Prometheus Metrics 的支持。本文将为大家介绍如何使用 Prometheus 收集 APISIX Ingress Controller 的 Metrics 数据,并通过 Grafana 进行后续可视化呈现。
步骤一:安装 APISIX Ingress Controller
首先我们通过 Helm 将 Apache APISIX、ETCD 和 APISIX Ingress Controller 部署到本地的 Kubernetes 集群中。
1helm repo add apisix https://charts.apiseven.com
2helm repo update
3kubectl create namespace ingress-apisix
4helm install apisix apisix/apisix --namespace ingress-apisix \
5 --set ingress-controller.enabled=true
安装完毕后请等待,直至所有服务都已正常运行。具体状态确认可通过下述命令进行检查。
1kubectl get all -n ingress-apisix
步骤二:启用 Prometheus 插件
大部分情况下,监控功能的涉及面肯定不止 APISIX Ingress Controller 这一个组件,如果需要同时监控 Apache APISIX,可以创建以下 ApisixClusterConfig
资源。
1apiVersion: apisix.apache.org/v2alpha1
2kind: ApisixClusterConfig
3metadata:
4 name: default
5spec:
6 monitoring:
7 prometheus:
8 enable: true
安装 Prometheus 和 Grafana
接下来我们将通过 Prometheus Operator 来启用 Prometheus 服务,因此需要先安装 Prometheus Operator(下述命令同时也会安装 Grafana)。
1helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
2heml repo update
3kubectl create namespace prometheus
4helm install prometheus prometheus-community/kube-prometheus-stack -n prometheus
安装完毕后,需要准备 Prometheus 实例的 RBAC 配置。该配置可赋予 Prometheus 实例向 Kubernetes API Server 获取 Pod 和 Service 资源的能力。
1apiVersion: v1
2kind: ServiceAccount
3metadata:
4 name: ingress-apisix
5 namespace: ingress-apisix
6---
7apiVersion: rbac.authorization.k8s.io/v1
8kind: ClusterRole
9metadata:
10 name: ingress-apisix
11rules:
12- apiGroups: [""]
13 resources:
14 - nodes
15 - nodes/metrics
16 - services
17 - endpoints
18 - pods
19 verbs: ["get", "list", "watch"]
20- apiGroups: [""]
21 resources:
22 - configmaps
23 verbs: ["get"]
24- apiGroups:
25 - networking.k8s.io
26 resources:
27 - ingresses
28 verbs: ["get", "list", "watch"]
29- nonResourceURLs: ["/metrics"]
30 verbs: ["get"]
31---
32apiVersion: rbac.authorization.k8s.io/v1
33kind: ClusterRoleBinding
34metadata:
35 name: ingress-apisix
36roleRef:
37 apiGroup: rbac.authorization.k8s.io
38 kind: ClusterRole
39 name: ingress-apisix
40subjects:
41- kind: ServiceAccount
42 name: ingress-apisix
43 namespace: ingress-apisix
完成上述实例配置后,需要定义 PodMonitor,也可以根据场景需求选择使用 ServiceMonior。下述 PodMonitor 资源将聚焦于 APISIX Ingress Controller Pod 的 Metrics 收集。
1apiVersion: monitoring.coreos.com/v1
2kind: PodMonitor
3metadata:
4 name: ingress-apisix
5 namespace: ingress-apisix
6 labels:
7 use-for: ingress-apisix
8spec:
9 selector:
10 matchLabels:
11 app.kubernetes.io/name: ingress-controller
12 podMetricsEndpoints:
13 - port: http
这里不使用 ServiceMonitor 的原因是
http
这一端口没有暴露到 Service 级别。
最后可通过下述指令进行 Prometheus 实例的定义。
1apiVersion: monitoring.coreos.com/v1
2kind: Prometheus
3metadata:
4 name: ingress-apisix
5 namespace: ingress-apisix
6spec:
7 serviceAccountName: ingress-apisix
8 podMonitorSelector:
9 matchLabels:
10 use-for: ingress-apisix
11 resources:
12 requests:
13 memory: 400Mi
14 enableAdminAPI: false
15 image: prom/prometheus:v2.31.0
将上述资源全部应用到 Kubernetes 集群后,等待相关组件就绪。
步骤三:配置 Grafana
接下来我们通过配置 Grafana 进行可视化呈现。
首先访问 prometheus-grafana
服务。注意,如果没有暴露 Service 到集群外部的手段,可以尝试使用端口转发的方式,Grafana 的管理员用户名和密码保存在 prometheus-grafana
这一 Secret 中。
打开 Grafana 后,导入 APISIX Ingress Controller 的 Dashboard 模版即可看到监控大盘,效果图如下:
创建 Dashboard 模版可参考相关 PR。
补充:监控指标释义
目前 APISIX Ingress Controller 的监控指标聚焦于它和数据面 Apache APISIX 实例的交互(配置下发)上,包括配置同步的数量与延迟等相关数据。
is_leader
:当前 APISIX Ingress Controller 实例是否为 Leader 角色。同一组 APISIX Ingress Controller 只会有一个 Leader,其余实例均为 Candidate。sync_operations
:包括 APISIX Ingress Controller 向数据面同步配置时的一些指标,包括推送次数、失败率、延迟等。通过这类指标可以监控配置下发是否正常,以此来帮助研发和运维同学进行监控预警和故障定位。
总结
本文介绍了如何使用 Prometheus 监控 APISIX Ingress Controller 的相关步骤和部分指标的展示效果。目前只包含了一些基本的监控指标,我们会在后续继续进行打磨和升级,增加更多的指标项和集成数据面 APISIX 的指标,为大家带来更好的监控体验。
当然也欢迎感兴趣的朋友参与 Apache APISIX Ingress Controller 项目的代码贡献中来,期待我们一起将 APISIX Ingress Controller 打造地更加全面化。