入口规则,将流量路由到入口控制器服务

Ingress rule, routing traffic to ingress controller service

我需要帮助将流量路由到 Ingress controller's 自己的服务之一,metric service。 我已经部署了一个 Nginx Ingress Controller 并启用了 metrics 选项,它会在控制器 internal-controller 的名称之后自动创建名称为 internal-controller-metrics 的服务。该服务有端口 10254/TCP 来抓取指标,如果我从集群内发出 curl 请求,我可以看到这些指标。

但我想从外部 Prometheus scraper 抓取那些。 因此,我想将请求路由到此服务,为此我编写了以下入口规则。但是请求 curl http://dnsname.of.ingress.controller.com/metric/metrics,它以 404.

响应
apiVersion: v1
items:
- apiVersion: networking.k8s.io/v1
  kind: Ingress
  metadata:
    annotations:
      nginx.ingress.kubernetes.io/rewrite-target: /
      kubernetes.io/ingress.class: nginx-internal
    name: metrics-ingress
  spec:
    rules:
    - host: dnsname.of.ingress.controller.com
      http:
        paths:
        - backend:
            service:
              name: nginx-internal-controller-metrics
              port:
                number: 10254
          path: /metric(/|$)(.*)
          pathType: Prefix
kind: List

我无法在控制器日志中找到任何请求未路由的原因。 Nginx 控制器版本为 nginx version: nginx/1.20.1 GKE 节点版本 1.17.17.

谢谢

这是我从外部获取 nginx 控制器指标所做的工作:

使用 documentation 中的以下命令安装了 nginx-controller:

kubectl create clusterrolebinding cluster-admin-binding \
  --clusterrole cluster-admin \
  --user $(gcloud config get-value account)
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.0/deploy/static/provider/cloud/deploy.yaml

然后我更改了服务清单和部署清单以根据 documentation(好吧,差不多)公开服务:

服务:

apiVersion: v1
kind: Service
metadata:
 annotations:
   prometheus.io/scrape: "true"
   prometheus.io/port: "10254"
..
spec:
  ports:
    - name: prometheus
      port: 10254
      targetPort: prometheus
      ..

部署(文档更改了 DaemonSet,这对我来说不存在):

..
ports:
  - name: prometheus
    containerPort: 10254
  ..

然后我检查我的控制器的外部 IP:

k get svc -n ingress-nginx | grep 10254

ingress-nginx-controller             LoadBalancer   10.140.7.150   35.xxx.xx.xx   10254:32677/TCP,80:31999/TCP,443:30632/TCP   52m

为指标卷曲外部 ip:

curl -s 35.xxx.xx.xx:10254/metrics | head -5

# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 4.9442e-05
go_gc_duration_seconds{quantile="0.25"} 0.000166662
go_gc_duration_seconds{quantile="0.5"} 0.000188861

更新: 为了让它与 Ingress 一起工作,我是这样做的:

我创建了一个 Cloud DNS A 记录,指向我的负载均衡器,然后从以下清单创建了一个 Ingress 对象:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    kubernetes.io/ingress.class: nginx
  name: metrics-ingress
spec:
  rules:
  - host: <Cloud-DNS-A-record>
    http:
      paths:
      - backend:
          service:
            name: ingress-nginx-controller
            port:
              number: 10254
        path: /metric(/|$)(.*)
        pathType: Prefix

并将其应用于我的集群

k apply -f ingress.yaml -n ingress-nginx

然后我在浏览器中打开了这个页面以查看指标: http:///Cloud-DNS-A-Record/metric/metrics