本文档描述了两种不同的安装和配置 Prometheus 和 Grafana 的方法。- 使用 Pod Annotations 安装 Prometheus 和 Grafana。这会将 Prometheus 和 Grafana 安装在与 NGINX Ingress 相同的命名空间中 - 使用服务监视器安装 Prometheus 和 Grafana。这会将 Prometheus 和 Grafana 安装在两个不同的命名空间中。这是首选方法,helm 图表默认支持此方法。
本教程将向您展示如何安装Prometheus和Grafana以抓取 NGINX Ingress 控制器的指标。
重要的
此示例使用emptyDirPrometheus 和 Grafana 的卷。这意味着一旦 pod 终止,您将丢失所有数据。
NGINX Ingress 控制器应该已经按照此处的部署说明进行了部署。
控制器应配置为导出指标。这需要对控制器进行 3 种配置。这些配置是:
controller.metrics.enabled=true
controller.podAnnotations."prometheus.io/scrape"="true"
controller.podAnnotations."prometheus.io/port"="10254"
为指标配置控制器的最简单方法是通过 helm upgrade。假设您已将 ingress-nginx 控制器安装为名为 ingress-nginx 的 helm 版本,那么您只需键入如下所示的命令:
helm upgrade ingress-nginx ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx \
--set controller.metrics.enabled=true \
--set-string controller.podAnnotations."prometheus\.io/scrape"="true" \
--set-string controller.podAnnotations."prometheus\.io/port"="10254"
- 您可以通过查看已安装版本的值来验证控制器是否配置了指标,如下所示:
helm get values ingress-nginx --namespace ingress-nginx
- 您应该能够看到如下所示的值:
..
controller:
metrics:
enabled: true
service:
annotations:
prometheus.io/port: "10254"
prometheus.io/scrape: "true"
..
- 如果您不使用 helm,则必须像这样编辑清单:
- 服务清单:
apiVersion: v1
kind: Service
metadata:
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "10254"
..
spec:
ports:
- name: prometheus
port: 10254
targetPort: prometheus
..
- 部署清单:
apiVersion: v1
kind: Deployment
metadata:
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "10254"
..
spec:
ports:
- name: prometheus
containerPort: 10254
..
部署和配置 Prometheus 服务器¶
请注意,本教程中使用的 kustomize 基础存储在GitHub 存储库kubernetes/ingress-nginx的deploy文件夹中。
- 必须配置 Prometheus 服务器,以便它可以发现服务的端点。如果 Prometheus 服务器已经在集群中运行,并且它的配置方式可以找到入口控制器 pod,则不需要额外的配置。
- 如果没有现有的 Prometheus 服务器正在运行,本教程的其余部分将指导您完成部署正确配置的 Prometheus 服务器所需的步骤。
- 运行以下命令会在 Kubernetes 中部署 prometheus:
kubectl apply --kustomize github.com/kubernetes/ingress-nginx/deploy/prometheus/
普罗米修斯仪表板¶
- 在 Web 浏览器中打开 Prometheus 仪表板:
kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default-http-backend ClusterIP 10.103.59.201 <none> 80/TCP 3d
ingress-nginx NodePort 10.97.44.72 <none> 80:30100/TCP,443:30154/TCP,10254:32049/TCP 5h
prometheus-server NodePort 10.98.233.86 <none> 9090:32630/TCP 1m
- 获取正在运行的集群中节点的 IP 地址:
kubectl get nodes -o wide
- 在某些节点只有内部 IP 地址的情况下,我们需要执行:
kubectl get nodes --selector=kubernetes.io/role!=master -o jsonpath={.items[*].status.addresses[?\(@.type==\"InternalIP\"\)].address}
10.192.0.2 10.192.0.3 10.192.0.4
- 打开浏览器并访问以下 URL:http://{node IP address}:{prometheus-svc-nodeport}以加载 Prometheus Dashboard。
- 根据上面的例子,这个 URL 将是 http://10.192.0.3:32630
格拉法纳¶
- 使用以下命令安装 grafana
kubectl apply --kustomize github.com/kubernetes/ingress-nginx/deploy/grafana/
- 看服务
kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default-http-backend ClusterIP 10.103.59.201 <none> 80/TCP 3d
ingress-nginx NodePort 10.97.44.72 <none> 80:30100/TCP,443:30154/TCP,10254:32049/TCP 5h
prometheus-server NodePort 10.98.233.86 <none> 9090:32630/TCP 10m
grafana NodePort 10.98.233.87 <none> 3000:31086/TCP 10m
- 打开浏览器并访问以下 URL:http://{node IP address}:{grafana-svc-nodeport}以加载 Grafana Dashboard。根据上面的例子,这个 URL 将是 http://10.192.0.3:31086
用户名和密码是admin
- 登录后,您可以通过以下步骤从官方仪表板导入 Grafana 仪表板:
- 导航到 grafana 的左侧面板
- 将鼠标悬停在配置的齿轮图标上,然后单击“数据源”
- 点击“添加数据源”
- 选择“普罗米修斯”
- 输入详细信息(注意:我使用了 http://CLUSTER_IP_PROMETHEUS_SVC:9090)
- 左侧菜单(悬停在 + 上)-> 仪表板
- 点击“导入”
- 从 https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/grafana/dashboards/nginx.json 输入复制粘贴的 json
- 单击导入 JSON
- 选择 Prometheus 数据源
- 点击“导入”
注意事项¶
通配符入口¶
- 默认情况下,请求指标标有主机名。当您有通配符域入口时,该入口将没有指标(以防止指标在基数上爆炸)。要在这种情况下获取指标,您需要运行入口控制器--metrics-per-host=false(您将丢失主机名标签,但仍具有入口标签)。
使用入口资源的 Grafana 仪表板¶
- 如果您想使用入口资源公开 grafana 的仪表板,那么您可以:
- 将 prometheus-server 服务和 grafana 服务的服务类型更改为“ClusterIP”,如下所示:
kubectl -n ingress-nginx edit svc grafana
- 这将在您的 shell (vi/nvim/nano/other) 中配置的默认编辑器中打开当前部署的服务 grafana
- 向下滚动到第 34 行,看起来像“type: NodePort”
- 将其更改为“类型:ClusterIP”。保存并退出。
- 创建一个入口资源,后端为“grafana”,端口为“3000”
- 同样,您可以编辑服务“prometheus-server”并添加入口资源。
使用服务监视器安装 Prometheus 和 GRAFANA¶
本文档假设您使用 helm 并使用 kube-prometheus-stack 包安装 Prometheus 和 Grafana。
验证 NGINX Ingress 控制器是否已安装¶
- NGINX Ingress 控制器应该已经按照此处的部署说明进行了部署。
- 要检查是否部署了 Ingress 控制器,
kubectl get pods -n ingress-nginx
- 结果应该类似于:NAME READY STATUS RESTARTS AGE ingress-nginx-controller-7c489dc7b7-ccrf6 1/1 Running 0 19h
验证 Prometheus 是否已安装¶
- 要检查 Prometheus 是否已部署,请运行以下命令:
helm ls -A
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
ingress-nginx ingress-nginx 10 2022-01-20 18:08:55.267373 -0800 PST deployed ingress-nginx-4.0.16 1.1.1
prometheus prometheus 1 2022-01-20 16:07:25.086828 -0800 PST deployed kube-prometheus-stack-30.1.0 0.53.1
- 请注意,prometheus 安装在与 ingress-nginx 不同的命名空间中
- 如果没有安装prometheus,那么可以从这里安装
重新配置 NGINX 入口控制器¶
- 需要重新配置 Ingress NGINX 控制器以导出指标。这需要对控制器进行 3 项额外配置。这些配置是:
controller.metrics.enabled=true
controller.metrics.serviceMonitor.enabled=true
controller.metrics.serviceMonitor.additionalLabels.release="prometheus"
- 最简单的方法是掌舵升级
helm upgrade ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--set controller.metrics.enabled=true \
--set controller.metrics.serviceMonitor.enabled=true \
--set controller.metrics.serviceMonitor.additionalLabels.release="prometheus"
- 这里controller.metrics.serviceMonitor.additionalLabels.release="prometheus"应该匹配 helm release 的名称kube-prometheus-stack
- 您可以通过查看已安装版本的值来验证控制器是否已成功重新配置为导出指标,如下所示:
helm get values ingress-nginx --namespace ingress-nginx
controller:
metrics:
enabled: true
serviceMonitor:
additionalLabels:
release: prometheus
enabled: true
配置普罗米修斯¶
- 由于 Prometheus 在不同的命名空间中运行,而不是在 ingress-nginx 命名空间中,因此它在安装时将无法在其他命名空间中发现 ServiceMonitors。重新配置您的 kube-prometheus-stack Helm 安装以将serviceMonitorSelectorNilUsesHelmValues标志设置为 false。默认情况下,Prometheus 仅在其自己的命名空间内发现 PodMonitors。这应该通过设置podMonitorSelectorNilUsesHelmValues为 false来禁用
- 所需的配置是:
prometheus.prometheusSpec.podMonitorSelectorNilUsesHelmValues=false
prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false
- 最简单的方法是使用helm upgrade ...
helm upgrade prometheus prometheus-community/kube-prometheus-stack \
--namespace prometheus \
--set prometheus.prometheusSpec.podMonitorSelectorNilUsesHelmValues=false \
--set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false
- 您可以通过查看已安装版本的值来验证 Prometheus 是否已重新配置,如下所示:
helm get values prometheus --namespace prometheus
- 您应该能够看到如下所示的值:
prometheus:
prometheusSpec:
podMonitorSelectorNilUsesHelmValues: false
serviceMonitorSelectorNilUsesHelmValues: false
连接并查看 Prometheus 仪表板¶
- 端口转发到 Prometheus 服务。使用以下命令找出 prometheus 服务的名称:
kubectl get svc -n prometheus
此命令的结果如下所示:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
alertmanager-operated ClusterIP None <none> 9093/TCP,9094/TCP,9094/UDP 7h46m
prometheus-grafana ClusterIP 10.106.28.162 <none> 80/TCP 7h46m
prometheus-kube-prometheus-alertmanager ClusterIP 10.108.125.245 <none> 9093/TCP 7h46m
prometheus-kube-prometheus-operator ClusterIP 10.110.220.1 <none> 443/TCP 7h46m
prometheus-kube-prometheus-prometheus ClusterIP 10.102.72.134 <none> 9090/TCP 7h46m
prometheus-kube-state-metrics ClusterIP 10.104.231.181 <none> 8080/TCP 7h46m
prometheus-operated ClusterIP None <none> 9090/TCP 7h46m
prometheus-prometheus-node-exporter ClusterIP 10.96.247.128 <none> 9100/TCP 7h46m
prometheus-kube-prometheus-prometheus 是我们想要移植到的服务。我们可以使用以下命令来做到这一点:
kubectl port-forward svc/prometheus-kube-prometheus-prometheus -n prometheus 9090:9090
当您运行上述命令时,您应该会看到如下内容:
Forwarding from 127.0.0.1:9090 -> 9090
Forwarding from [::1]:9090 -> 9090
- 打开您的浏览器并访问以下 URL http://localhost:{port-forwarded-port} 根据上面的示例它将是 http://localhost:9090
连接和查看 Grafana 仪表板¶
- 端口转发到 Grafana 服务。使用以下命令找出 Grafana 服务的名称:
kubectl get svc -n prometheus
此命令的结果如下所示:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
alertmanager-operated ClusterIP None <none> 9093/TCP,9094/TCP,9094/UDP 7h46m
prometheus-grafana ClusterIP 10.106.28.162 <none> 80/TCP 7h46m
prometheus-kube-prometheus-alertmanager ClusterIP 10.108.125.245 <none> 9093/TCP 7h46m
prometheus-kube-prometheus-operator ClusterIP 10.110.220.1 <none> 443/TCP 7h46m
prometheus-kube-prometheus-prometheus ClusterIP 10.102.72.134 <none> 9090/TCP 7h46m
prometheus-kube-state-metrics ClusterIP 10.104.231.181 <none> 8080/TCP 7h46m
prometheus-operated ClusterIP None <none> 9090/TCP 7h46m
prometheus-prometheus-node-exporter ClusterIP 10.96.247.128 <none> 9100/TCP 7h46m
prometheus-grafana 是我们想要移植到的服务。我们可以使用以下命令来做到这一点:
kubectl port-forward svc/prometheus-grafana 3000:80 -n prometheus
当您运行上述命令时,您应该会看到如下内容:
Forwarding from 127.0.0.1:3000 -> 3000
Forwarding from [::1]:3000 -> 3000
- 打开浏览器并访问以下 URL http://localhost:{port-forwarded-port} 根据上面的示例应该是 http://localhost:3000 默认用户名/密码是 admin/prom-operator -登录后,您可以通过以下步骤从
官方仪表板导入 Grafana 仪表板:
- 导航到 grafana 的左侧面板
- 将鼠标悬停在配置的齿轮图标上,然后单击“数据源”
- 点击“添加数据源”
- 选择“普罗米修斯”
- 输入详细信息(注意:我使用 http://10.102.72.134:9090 这是 Prometheus 服务的 CLUSTER-IP)
- 左侧菜单(悬停在 + 上)-> 仪表板
- 点击“导入”
- 从 https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/grafana/dashboards/nginx.json 输入复制粘贴的 json
- 单击导入 JSON
- 选择 Prometheus 数据源
- 点击“导入”