kubernetes 使用nginx入口控制器在k8s中设置rabbitmq

emeijp43  于 2022-12-11  发布在  Kubernetes
关注(0)|答案(4)|浏览(236)

我正在尝试设置rabbitmq,部署为pod,在k8s集群中。还设置了Nginx入口控制器,以便通过使用URL对集群中的服务进行外部访问。

下面是工作配置,通过它我可以访问rabbitmq管理控制台

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-gateway
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /  
spec:
  tls:
  - hosts:
    - ***ABC***.com
    secretName: gateway-tls-secret
  rules:
  - host: ***ABC***.com 
    http:
      paths:
      - backend:
          serviceName: ie-rabbitmq
          servicePort: 15672
        path: /

登录Nginx控制器

10.202.3.59 - - [24/Dec/2019:06:59:19 +0000] "GET /api/auth HTTP/2.0" 200 57 "https://***ABC***.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36" 324 0.003 [ie-poc-ie-rabbitmq-15672] [] 10.244.5.235:15672 57 0.003 200 eed95f6d3ee6bddae7a7128b4b500152

10.202.3.59 - - [24/Dec/2019:06:59:19 +0000] "GET /js/tmpl/login.ejs?0.16274381270760774 HTTP/2.0" 200 630 "https://***ABC***.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36" 48 0.001 [ie-poc-ie-rabbitmq-15672] [] 10.244.5.235:15672 630 0.001 200 75c43c0e3e3d8de715c4ffa540a4b0a8

但是当我将backend.path/更改为/rabbit时,服务无法访问

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-gateway
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /  
spec:
  tls:
  - hosts:
    - ***ABC***.com
    secretName: gateway-tls-secret
  rules:
  - host: ***ABC***.com 
    http:
      paths:
      - backend:
          serviceName: ie-rabbitmq
          servicePort: 15672
        path: /rabbit

从Nginx控制器日志中我看到的是,对于此配置,请求被定向到[upstream-default-backend] 10.244.3.84:8080,但理想情况下,它应将请求重定向到[ie-poc-ie-rabbitmq-15672] [] 10.244.5.235:15672,这是在请求成功时观察到的。

10.202.3.59 - - [24/Dec/2019:06:57:15 +0000] "GET /api/auth HTTP/2.0" 404 21 "https://i***ABC***.com/rabbit" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36" 57 0.001 [upstream-default-backend] [] 10.244.3.84:8080 21 0.001 404 2a1d6b6abf1b7ff03884f275c4a15c14

10.202.3.59 - - [24/Dec/2019:06:57:15 +0000] "GET /js/tmpl/login.ejs?0.4076380641124395 HTTP/2.0" 404 21 "https://***ABC***.com/rabbit" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36" 47 0.001 [upstream-default-backend] [] 10.244.3.84:8080 21 0.001 404 df534e5e9b2e5aabb9fa6bb272d4b5e9

有人能帮助我了解为什么第二个配置不工作/加载rabbitmq配置

kognpnkq

kognpnkq1#

尝试下面的NGINX入口重写规则,它对我很有效:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-gateway
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
    - http:
        paths:
          - backend:
              serviceName: rmq-rabbitmq-ha
              servicePort: 15672
            path: /rabbit/(.*)

下面是截图:

顺便说一下,如果不需要子路径,Ingress配置文件如下:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-gateway
spec:
  rules:
    - http:
        paths:
          - backend:
              serviceName: rmq-rabbitmq-ha
              servicePort: 15672
            path: /
hc2pp10m

hc2pp10m2#

尝试将management.path_prefix = /rabbit添加到您的Rabbitmq配置Map中。这为我解决了这个问题。

pbpqsu0x

pbpqsu0x3#

我通过在子域的根路径上将RabbitMQ作为主机来提供服务,并使用Azure DNS区域进行配置,从而解决了这个问题。
首先,我使用Helm v3在我的AKS k8s集群上安装RabbitMQ:

helm install rabbitmq-resource -f .\rabbitmq.production-values.yaml bitnami/rabbitmq

不幸的是,图表中的Healthcheck API被配置为使用所提供主机的根路径。由于我已经使用了入口控制器的静态IP,并且还使用了DNS区域将我的自定义域绑定到集群,因此很容易为静态入口IP设置一个额外的别名,并将其配置为入口资源中的子域主机。
因此,在RabbitMQ配置值中(我在前面的命令中使用了文件rabbitmq.production-values.yaml),请确保在以下值处使用根路径:

...
rabbitmq:
  ...
  extraConfiguration: |-
    ...
    #management.path_prefix = /

...
ingress:
  ...
  enabled: true
  path: /

在Azure门户中,转到您的k8s特定集群ResourceGroup,它具有以下命名约定:

MC_<primary_cluster_resource_group>_<cluster_name>_<region>

转到绑定到入口控制器的公共IP地址。然后转到设置〉配置并点击“创建别名记录”,填写现有DNS区域的子域名。例如rabbitmq.yourdomain.com
现在编辑您的Ingress资源,使其看起来如下所示:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-resource-handler
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: letsencrypt-prod
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  tls:
  - hosts:
    - yourdomain.com
    - rabbitmq.yourdomain.com
    secretName: tls-secret
  rules:
  - host: yourdomain.com
    http:
      paths:
      - backend:
          serviceName: website
          servicePort: 80
        path: /(.*)
  - host: rabbitmq.yourdomain.com
    http:
      paths:
      - backend:
          serviceName: rabbitmq-resource
          servicePort: 15672
        path: /(.*)
  • 请注意,通过域的主命名空间,您可以在根路径上提供网站或其他服务,通过子域,您可以提供RabbitMQ(管理),也可以通过根路径提供,而不会干扰健康检查API。*

现在应用入口资源,一切都将顺利工作!

deikduxw

deikduxw4#

我通过在RabbitMQ additionalConfig中引入'management.path_prefix = /rabbit-mgmt/'修复了这个问题。

"rabbitmq" = {
    "additionalPlugins" = [
      "rabbitmq_management",
      "rabbitmq_peer_discovery_k8s",
    ]
    "additionalConfig" = <<-EOT
    management.path_prefix = /rabbit-mgmt/
    EOT      
                         
  }

相关问题