【问题标题】:Ingress rule does not work with Service of type LoadBalancer入口规则不适用于 LoadBalancer 类型的服务
【发布时间】:2019-02-09 08:12:38
【问题描述】:

我正在尝试向内部负载平衡器添加入口规则。根据码头,它可以被重定向到服务。只要服务是“ClusterIP”,它就可以工作,但当它的“LoadBalancer”时会无限重定向

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: demo-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  tls:
  - hosts:
    - demo.azure.com
    secretName: aks-ingress-tls
  rules:
  - host: demo.azure.com
    http:
      paths:
      - path: /
        backend:
          serviceName: aks-helloworld
          servicePort: 80
      - path: /demo
        backend:
          serviceName: demo-backend
          servicePort: 80

https://demo.azure.com 有效,但 https://demo.azure.com/demo 无效。区别在于 aks-helloworld 是 ClusterIP 而 demo-backend 是 LoadBalancer

13:33 $ kubectl get services
NAME                  TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)        AGE
aks-helloworld        ClusterIP      10.0.204.168   <none>         80/TCP         15m
kubernetes            ClusterIP      10.0.0.1       <none>         443/TCP        16h
demo-backend   LoadBalancer   10.0.198.251   23.99.128.86   80:30332/TCP   15h

【问题讨论】:

  • 虽然我不知道你关于 LB 问题的具体答案,因为我不能说我已经尝试过那个特定的设置,但不要忘记你总是可以创建一个 @987654327 @Service 使用相同的 ports:selector: 并将您的 Ingress 指向 那个,如果没有其他原因,只是作为一个有趣的故障排除练习
  • 根据the fine manual,确实看起来rewrite-target 在您的设置中没有做任何积极的事情;你试过删除它吗?更好的是,您试图用它做什么?
  • 您的演示后端 LoadBalancer 服务上是否有此注释 `service.beta.kubernetes.io/azure-load-balancer-internal: "true"`?
  • @MatthewLDaniel 我尝试使用 ClusterIP 创建 demo-backend2 并指出入口仍然无法正常工作。也删除了 rewrite-target 。它只是说“页面没有正确重定向”我正在关注docs.microsoft.com/en-us/azure/aks/ingress-own-tls
  • @Alex 我添加了 annonation ,似乎没有任何区别。这是为了什么,

标签: azure kubernetes kubernetes-helm kubernetes-ingress azure-aks


【解决方案1】:

对于您的问题,我认为不是一个具有 clusterIP 类型而另一个具有 LoadBalancer 类型的问题。当流量通过这两种方式进入时,它们都会重定向到服务,在你的情况下是演示后端。

看看我这边的测试结果:

从互联网访问:

我没有添加 TLS,但我认为无论是否有 TLS,流量都会重定向到服务。当我通过 helm 安装第二个应用程序时,我只是用 --set serviceType="LoadBalancer" 更改命令。所以你可以检查你的步骤是否有问题。

但我认为这不是将这两种方式的流量路由到一个服务的好方法。如果你通过 Ingress 使用 TLS,同时有 LoadBalancer 的方式将不安全。因为流量会通过 LoadBalancer 绕过 TLS。

更新

根据您的评论,我认为您需要为您的应用程序创建一个部署,然后使用它创建一个服务,文件如下:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: yourImage
        ports:
        - containerPort: 80
          name: myapp
---
apiVersion: v1 
kind: Service 
metadata: 
    name: demo-backend 
    labels: 
        app: myapp 
spec: 
    type: ClusterIP 
    selector: 
        app: myapp 
    ports: 
    - port: 80
      name: http

部署是应用程序的基础,服务只是接受 pod 的流量。所以我猜你错过了部署,以便你可以访问你的应用程序。

【讨论】:

  • 我了解您对 LoadBalancer 的担忧,一旦 ingress 工作,我将删除它。我通过 helm 安装了演示应用程序,但我自己的应用程序通过清单安装 --- apiVersion:v1 种类:服务元数据:名称:演示后端标签:应用程序:myapp 规范:类型:ClusterIP 选择器:应用程序:我的端口: - 名称:http 端口:80 目标端口:8080
  • 对于 HTTPS,我还需要在服务中添加以下内容吗? - 名称:https 端口:443 目标端口:8080
  • 如果您使用带有 TLS 的入口来解析 HTTPS,则无需在部署中为您的应用程序公开端口 443。 Ingress 为您解决。
  • 好的,知道了,但是当我为正在路由到我的部署的服务提供映射时,它只能到达 404 默认后端,当我点击指向与由 helm 创建的部署,它可以工作。通过 helm 部署与应用清单有什么区别
  • @Neil Helm 只是 Kubernetes 的一个工具,就像 Linux 的 apt 或 yum 一样。我认为除了方便没有区别。
【解决方案2】:

如果您使用 Ingress 作为资源,为什么要将服务公开为“LoadBalancer”类型?您实际上是在访问一个入口负载均衡器,然后再访问另一个服务负载均衡器,这可能是导致此重定向问题的原因。

【讨论】:

  • 最初创建服务负载平衡器是为了内部服务到服务的通信。但正如我在 cmets 中提到的,我创建了一个重复的服务,类型为 ClusterIP,选择相同的后端。但似乎也没有工作
【解决方案3】:

问题是由于引擎控制器添加了以下标头。

X-FORWARDED-PROTO: https
X-FORWARDED-PORT: 443

回复https://stackoverflow.com/a/54880257/747456

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    • 2022-06-20
    • 2022-10-16
    • 2020-08-28
    • 2018-07-03
    • 2019-02-25
    • 2013-09-02
    相关资源
    最近更新 更多