【问题标题】:Expose ingress path inside cluster but not on public?在集群内公开入口路径但不公开?
【发布时间】:2019-08-08 03:22:00
【问题描述】:

我有一个包含以下图表的 pod:

ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: nginx
    // ...
  paths:
    - /api/myservice

我的 pod 公开了 api 以及一个可通过 /api/myservice/prometheus 访问的 /prometheus 端点。

我想让prometheus 在我的集群中可见,但在/api/myservice/prometheus 中不可见。我怎样才能做到这一点?

【问题讨论】:

    标签: kubernetes kubernetes-helm kubernetes-ingress nginx-ingress


    【解决方案1】:

    您可以添加将端点重定向到默认后端的 Ingress 规则:

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: block
      annotations:
        ingress.kubernetes.io/ssl-redirect: "true"
        ingress.kubernetes.io/rewrite-target: /
    spec:
      tls:
      - hosts:
        - myapp.to
      rules:
      - host: myapp.to
        http:
          paths:
          - path: /metrics
            backend:
              serviceName: ingress-default-backend
              servicePort: 8080
    

    【讨论】:

      【解决方案2】:

      如果您只需要内部访问,我认为您不应该将其放入 ingress。您已经可以将DNS Service 与 Kubernetes 集群一起使用。

      如果您的 prometheus 服务与您的工作 pod 运行相同的命名空间,您可以使用以下地址访问它。

      http://prometheus-svc-name
      

      如果您的 prometheus 服务在不同的命名空间中运行,您可以使用:

      http://prometheus-svc-name.prometheus-namespace.svc.cluster.local
      

      访问服务。

      更新:

      cmets之后的问题更清楚了。

      您可以编写另一个规则来隐藏您的 /prometheus 端点,如下所示:

      ingress:
        enabled: true
        annotations:
          kubernetes.io/ingress.class: nginx
          // ...
        paths:
          - /api/myservice => myservice
          - /api/myservice/prometheus => 404 default backend.
      

      nginx-ingress 将首先匹配最长的路由。它将把/api/myservice/prometheus 路由到404。See this documentation

      【讨论】:

      • 在我的 pod 中,我需要外部 API,同时需要一个由 prometheus 内部抓取的端点(可通过/prometheus 访问)
      • 哦,我明白你的意思了。将更新我的答案。你需要另一个入口来实现这一点。
      • 请参考Amityo的回答。不过,您需要运行默认后端服务。检查此 yaml 配置,例如:github.com/kubernetes/ingress-nginx/blob/…
      【解决方案3】:

      实现这一点的最佳方法是从入口中删除 prometheus 端点,如果您知道 prometheus 支持使用服务上的注释自动发现,请为 k8s 自动发现配置 prometheus,然后在您的服务 yaml 文件中添加注释。 https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config

      【讨论】:

      • 好的,但是我应该如何从入口中删除普罗米修斯端点?它位于/api/myservice 下方,因此从外部世界可以通过/api/myservice/prometheus 访问它。
      【解决方案4】:

      更改端点以指向您的 API。 /api/myservice/my-api 或使用 app-root 注释,指向 /api/myservice 中的 api:

      nginx.ingress.kubernetes.io/app-root: /path/to/my/app/root/dir
      

      更多详情:https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#rewrite

      【讨论】:

      • 然后我将如何访问集群中的/prometheus 端点?
      • 如果您不想为 /Prometheus 使用入口,则可以使用端口转发来访问集群内的 /Prometheus,前提是使用 clusterIP 公开服务(默认行为)。该服务也可以使用 node-port 公开,可以从任何 : 使用,但同时使用这两者几乎没有任何意义。选项: 1.使用单个入口可以解决两者的问题,但两者都会暴露,只是不要使用 app-root。 2.对两者使用单独的入口,并在入口中对 Prometheus 使用身份验证。这样您仍然可以控制谁可以访问它。
      猜你喜欢
      • 2019-08-15
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 2020-10-14
      相关资源
      最近更新 更多