Azure 入口规则不适用于LoadBalancer类型的服务

Azure 入口规则不适用于LoadBalancer类型的服务,azure,kubernetes,kubernetes-helm,kubernetes-ingress,azure-aks,Azure,Kubernetes,Kubernetes Helm,Kubernetes Ingress,Azure Aks,我正在尝试向内部负载平衡器添加入口规则。根据dock,它可以重定向到服务。只要服务是“ClusterIP”,它就可以工作,但当它的“LoadBalancer”运行时,它会转到无限重定向 行得通但不行。区别在于aks helloworld是一个集群,但演示后端是一个负载平衡器 apiVersion: extensions/v1beta1 kind: Ingress metadata: name: demo-ingress annotations: kubernetes.io/ing

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

行得通但不行。区别在于aks helloworld是一个集群,但演示后端是一个负载平衡器

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
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
13:33$kubectl获得服务
名称类型CLUSTER-IP外部IP端口年龄
aks helloworld ClusterIP 10.0.204.168 80/TCP 15米
kubernetes ClusterIP 10.0.0.1 443/TCP 16h
演示后端LoadBalancer 10.0.198.251 23.99.128.86 80:30332/TCP 15h

如果您对资源使用入口,为什么要将服务公开为“LoadBalancer”类型?本质上,您是在访问入口loadbalancer,然后访问另一个服务loadbalancer,这可能是导致此重定向问题的原因。

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

请参见我这边的测试结果:

互联网接入:

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

但我不认为这是一个好办法,路线交通都在这两种方式到一个服务。如果您通过入口使用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的流量。因此,我猜您错过了部署,因此您可以访问您的应用程序。

问题是因为引擎控制器添加了以下标题

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

回答

虽然我不知道你关于LB的问题的具体答案,因为我不能说我已经尝试过那种特定的设置,但别忘了你可以创建一个
demo-backend2
服务
,具有相同的
端口:
选择器:
,并指出你的入口,如果没有其他原因,除了作为一个有趣的故障排除练习,它确实看起来像是
重写目标
在您的设置中没有任何积极作用;你试过移除它吗?更好的是,你想用它做什么?你有这个注释`service.beta.kubernetes.io/azure-load-balancer-internal:“true”`在你的演示后端LoadBalancer服务上吗?@MatthewLDaniel我试着用ClusterIP创建演示后端2,但指出入口仍然不起作用。也移除了重新布线目标。它只是说“页面没有正确重定向”,我在跟随@Alex我添加了注释,似乎没有任何区别。它的用途是什么,最初创建服务负载平衡器是为了内部服务对服务通信。但正如我在评论中提到的,我创建了一个重复的服务,类型为ClusterIP,选择相同的后端。但似乎不起作用。我理解您对LoadBalancer的担忧,一旦入口工作,我将删除它。我通过helm安装了演示应用程序,但我自己的应用程序通过清单安装---apiVersion:v1种类:服务元数据:名称:演示后端标签:应用程序:myapp规范:类型:ClusterIP选择器:应用程序:我的端口:-名称:http端口:80 targetPort:8080对于HTTPS,我是否需要在服务中添加以下内容?-名称:https端口:443 targetPort:8080如果您将入口与TLS一起使用来解析https,则无需在部署中为您的应用程序公开端口443。Ingress为您解决它。好的,明白了,但是当我为路由到我的部署的服务提供映射时,它只到达404默认后端,当我点击指向服务的路由并与helm创建的部署对话时,它工作了。通过头盔部署和应用部署有什么区别manifest@NeilHelm只是一个用于Kubernetes的工具,如apt或yum for Linux。我认为除了方便之外没有什么区别。