Kubernetes nginx ingress rabbitmq 管理和kibana

Posted

技术标签:

【中文标题】Kubernetes nginx ingress rabbitmq 管理和kibana【英文标题】:Kubernetes nginx ingress rabbitmq management and kibana 【发布时间】:2019-11-05 12:15:30 【问题描述】:

在我的 AKS 集群上,我有一个 nginx 入口控制器,用于反向代理我在 AKS 上运行的 kibana 服务。不过,我想通过 ingress、rabbitmq 管理控制台添加另一个 http 服务。

我无法同时使用以下配置:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-aegis
  namespace: dev
  annotations:
    kubernetes.io/ingress.class: nginx
    certmanager.k8s.io/cluster-issuer: letsencrypt-prod
    nginx.ingress.kubernetes.io/rewrite-target: /    
spec:
  tls:
  - hosts:
    - dev.endpoint.net
    secretName: dev-secret   
  rules:
  - host: dev.endpoint.net
    http:
      paths:
      - path: /
        backend:
          serviceName: kibana-kibana
          servicePort: 5601
      - path: /rabbit
        backend:
          serviceName: rabbitmq
          servicePort: 15672

Kibana 在根目录下工作正常,但是 RabbitMQ 无法加载 503 和除 / 之外的任何路径。如果 RabbitMQ 的路径是 /,那么它可以正常工作,但 Kibana 将无法运行。

我认为这是因为它们在内部位于根目录,即 localhost:15672,因此它重定向到 dev.endpoint.net 上的 /。

如何让 Kibana 和 RabbitmQ 等多种服务从一个端点运行?

【问题讨论】:

你是否尝试为rabbitmq专门化服务端口? 我错过了这个问题。现已添加。 为什么只创建一个入口?为什么不创建两个不同的入口,因为它是两个不同的域和两个不同的服务? 它们是不同的服务,但在同一个域下相关。它很容易让多个简单的 Web 应用程序在多个路径下工作,而不是使用 RabbitMQ 和 Kibana 等更复杂的系统。 【参考方案1】:

您需要做的是将 kibana 的 basePath 设置为 /kibana

查看以下网址

https://www.elastic.co/guide/en/kibana/current/settings.html

您希望将server.basePath 配置为/kibana。然后这将对反向代理问题进行排序,您可以将 MQ 直接保留在 root /

您还可以在 kibana pod 中设置 SERVER_BASEPATH 环境变量,它会自动从该变量中选择基本路径

【讨论】:

这是否适用于从 helm 安装的官方 Kibana? 无法确认,因为我没有使用 helm,但我认为它应该可以工作。试着告诉我你的反馈【参考方案2】:

一个想法是使用基于主机名的规则来切换后端。但是,这需要通配符或 SAN SSL 证书。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-aegis
  namespace: dev
  annotations:
    kubernetes.io/ingress.class: nginx
    certmanager.k8s.io/cluster-issuer: letsencrypt-prod
    nginx.ingress.kubernetes.io/rewrite-target: /    
spec:
  tls:
  - hosts:
    - dev.endpoint.net
    - rabbit.endpoint.net
    secretName: dev-secret   
  rules:
  - host: dev.endpoint.net
    http:
      paths:
      - path: /
        backend:
          serviceName: kibana-kibana
          servicePort: 5601
  - host: rabbit.endpoint.net
    http:
      paths:
      - path: /
        backend:
          serviceName: rabbitmq

【讨论】:

我想把它放在 dev.endpoint.net 的例子下,并拥有不同的资源,如 /resouce1 /resource2 等 这个注解你试过了吗,Service Upstream ingress.kubernetes.io/service-upstream: "true" nginx.ingress.kubernetes.io/service-上游注释禁用该行为,而是在 NGINX 中使用单个上游,服务的集群 IP 和端口 请查看Create an HTTPS ingress controller on Azure Kubernetes Service (AKS) 在此示例中,他们使用不同的注释:nginx.ingress.kubernetes.io/rewrite-target: /$1path: /(.*)path: /hello-world-two(/|$)(.*) 两者都不走运。 Rabbitmq 只是返回一个空白页面,其中包含在网络上加载但不显示的资源。 请看一下这个ticket 的天蓝色和重写问题。请使用 curl -I -k 调试您的连接。请同时验证您的 nginx-ingress 图表和应用程序版本【参考方案3】:

对于通过 ingress 的 RabbitMQ 管理 UI,在 rabbitmq.conf 文件中设置以下内容(您可以使用 configmaps 并将文件挂载到 pod 中)

management.path_prefix = /rabbit

在 Ingress 中设置以下内容:

...
   path: /rabbit(/|$)(.*)
...

见:https://www.rabbitmq.com/management.html#path-prefix

【讨论】:

以上是关于Kubernetes nginx ingress rabbitmq 管理和kibana的主要内容,如果未能解决你的问题,请参考以下文章

ingress-nginx部署

Nginx.ingress.kubernetes.io/proxy-body-size 不工作

Kubernetes Ingress Nginx 加载资源 404

Kubernetes集群 服务暴露 Nginx Ingress Controller

Kubernetes Ingress-nginx高级用法

Kubernetes Ingress-nginx高级用法