在 Azure Kubernetes 集群 (AKS) 上的 Nginx Ingress 上配置 TCP 端口

问题描述

我需要在我的 AKS 集群上配置一个 TCP 端口以允许 RabbitMQ 工作

我已经使用 helm 安装了 nginx-ingress,如下所示:

kubectl create namespace ingress-basic

helm repo add ingress-Nginx https://kubernetes.github.io/ingress-Nginx

helm install nginx-ingress ingress-Nginx/ingress-Nginx \
    --namespace ingress-basic \
    --set controller.replicaCount=2 \
    --set controller.nodeselector."beta\.kubernetes\.io/os"=linux \
    --set defaultBackend.nodeselector."beta\.kubernetes\.io/os"=linux \
    --set controller.admissionWebhooks.patch.nodeselector."beta\.kubernetes\.io/os"=linux

我已与我们的 DNS 提供商设置了一条 A 记录,以指向入口控制器的公共 IP。

我创建了一个 TLS 密钥(以启用 https)

我创建了一个入口路由:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
Metadata:
  name: rabbit-ingress
  namespace: default
  annotations:
    kubernetes.io/ingress.class: Nginx
    Nginx.ingress.kubernetes.io/use-regex: "true"
    Nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  tls:
  - hosts:
    - my.domain.com
    secretName: tls-secret
  rules:
    - http:
        paths:
          - backend:
              serviceName: rabbitmq-cluster
              servicePort: 15672
            path: /(.*)

我可以通过域名从外部导航到我的集群,并使用有效的 https 查看控制面板(内部在 15672 上)。因此入口已启动并正在运行,我可以创建队列等...因此 rabbitmq 可以正常工作。

但是,我无法让 TCP 部分工作以从集群外部发布到队列。

我已经通过 azure 编辑了我认为是控制器(nginx-ingress-ingress-Nginx-controller)的配置映射(azure - cluster - configuration - nginx-ingress-ingress-Nginx-controller)的 yaml门户界面并将其添加到末尾

data:
  '5672': 'default/rabbitmq-cluster:5672'

然后我通过 azure 门户为服务本身编辑了他们的 yaml 并将其添加到末尾

  - name: amqp
      protocol: TCP
      port: 5672

但是,当我尝试使用测试客户端访问我的域时,请求会超时。 (当我使用 LoadBalancer 并且只命中集群的外部 IP 时,客户端可以工作,所以我知道客户端代码应该可以工作)

还有什么我应该做的吗?

解决方法

我认为这里的问题是 helm 配置了太多我自己的东西,我无法自定义太多。

我用 helm 卸载了入口并将入口创建脚本更改为:

helm install nginx-ingress ingress-nginx/ingress-nginx \
    --namespace ingress-basic \
    --set controller.replicaCount=2 \
    --set controller.nodeSelector."beta\.kubernetes\.io/os"=linux \
    --set defaultBackend.nodeSelector."beta\.kubernetes\.io/os"=linux \
    --set controller.admissionWebhooks.patch.nodeSelector."beta\.kubernetes\.io/os"=linux \
    --set tcp.5672="default/rabbitmq-cluster:5672"

它预先配置了 TCP 端口转发,我不需要做任何其他事情。我不知道它是否影响了它,但这似乎“破坏”了我的 SSL 实现,所以我将入口路由创建脚本从 v1beta 升级到 v1,https 再次完美运行。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: rabbit-ingress
  namespace: default
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  tls:
  - hosts:
      - my.domain.com
    secretName: tls-secret
  rules:
  - host: my.domain.com
    http:
      paths:
      - path: /(.*)
        pathType: Prefix
        backend:
          service:
            name: rabbitmq-cluster
            port:
              number: 15672