【问题标题】:Ingress rule, routing traffic to ingress controller service入口规则,将流量路由到入口控制器服务
【发布时间】:2021-08-25 21:00:26
【问题描述】:

我需要帮助将流量路由到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: /$2
      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 google-kubernetes-engine kubernetes-ingress nginx-ingress gke-networking


    【解决方案1】:

    这是我从外部获取 nginx-controller 指标的操作:

    使用来自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: /$2
        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

    【讨论】:

    • 感谢@jabbson 的回复,我看到这就像将单个服务公开为负载均衡器或 NodePort,我正在寻找一个选项,其中已经创建的入口控制器可用于将流量路由到服务。
    • 我已经更新了有关 Ingress 对象的后续消息
    • 感谢 Jabbson 添加这些详细信息,我看到我有类似的对象,只是有一条额外的行将入口添加到某个列表的一部分,我不确定我是如何获得的这种语法。我明天试试这个,看看是否有效,非常感谢
    猜你喜欢
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 2021-04-02
    相关资源
    最近更新 更多