【问题标题】:Ingress is not working for application gateway ingress controller (AGIC) add-on of AKSIngress 不适用于 AKS 的应用程序网关入口控制器 (AGIC) 插件
【发布时间】:2021-08-06 23:04:33
【问题描述】:

我在 Azure 门户中启用了 AGIC,然后创建了 Fanout Ingress。但它不起作用。我检查了规则(ingress-appgateway > 规则 > 基于路径的路由)并且路径针对正确的后端池。

当我测试运行状况探测时,它失败了(“MC_...”资源组 > ingress-appgateway > 运行状况探测 > 单击测试) - 显示错误:

您的一个或多个后端实例运行状况不佳。推荐 在连接探针之前先解决这个健康问题

我试过了:

  • 禁用和启用 AGIC -> 不起作用
  • 使用pathType: ImplementationSpecific(而不是pathType: Prefix)-> 不起作用
  • nginx.ingress.kubernetes.io/rewrite-target: /$1 & /foo(/|$)(.*) -> 没用

在“ingress-appgateway”(Azure 门户)的概述页面顶部,显示错误:

您的一个或多个后端池中的所有实例都不正常。 当您尝试访问您的 托管在应用程序网关后面的应用程序。请检查 后端运行状况并解决问题。

仅当我删除路径(/foo/bar)并针对单个服务时才有效。

仅供参考,我正在使用 Azure CNI 网络和现有 VNet(专用子网)。

deployment.yaml

apiVersion: v1
kind: Service
metadata:
  name: demo-web-app1
  namespace: demo
spec:
  selector:
    app: demo-web-app1
  type: ClusterIP
  ports:
  - protocol: TCP
    port: 4200
    targetPort: 80
    
---

apiVersion: v1
kind: Service
metadata:
  name: demo-web-app2
  namespace: demo
spec:
  selector:
    app: demo-web-app2
  type: ClusterIP
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 80

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-web-app1
  namespace: demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: demo-web-app1
  template:
    metadata:
      labels:
        app: demo-web-app1
    spec:
      containers:
      - name: demo-web-app1
        image: myacr.azurecr.io/myacr6472:375
        ports:
        - containerPort: 80
        
---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-web-app2
  namespace: demo
spec:
  replicas: 3
  selector:
    matchLabels:
      app: demo-web-app2
  template:
    metadata:
      labels:
        app: demo-web-app2
    spec:
      containers:
      - name: demo-web-app2
        image: myacr.azurecr.io/myacr6472:375
        ports:
        - containerPort: 80

---

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-demo-web-app
  namespace: demo
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  rules:
  - http:
      paths:
      - path: /foo
        pathType: Prefix
        backend:
          service:
            name: demo-web-app1
            port:
              number: 4200
      - path: /bar
        pathType: Prefix
        backend:
          service:
            name: demo-web-app2
            port:
              number: 8080

【问题讨论】:

  • 检查是否所有的 pod 都处于运行状态?
  • 使用 nginx.ingress.kubernetes.io/rewrite-target 没有意义,因为您没有使用 nginxingress 控制器。您正在使用应用程序网关入口控制器,因此请使用 appgw.ingress.kubernetes.io/backend-path-prefix 注释。将其设置为 / 并让我知道它是否解决了任何问题。
  • @Matt 它正在工作。我应该用你的提示回答吗?
  • 当然,继续。 :D
  • @Matt 现在路由不适用于/foo 公开的服务。 /foo 工作正常(命中 API 服务),但我需要访问 /foo/abc (AbcController)、/foo/xyz (XyzController),这些都不起作用。 /foo/ 之后的任何 uri 都不起作用,有什么提示吗?

标签: azure kubernetes kubernetes-ingress azure-aks


【解决方案1】:

使用appgw.ingress.kubernetes.io/backend-path-prefix: "/"我们将能够指定多个规则。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: gateway-ingress
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
    appgw.ingress.kubernetes.io/backend-path-prefix: "/"
spec:
  rules:
  - http:
      paths:
      - path: /service1/*
        pathType: Prefix
        backend:
          service:
            name: k8-boot-graphql-rest-aks-apm-test
            port:
              number: 8081
      - path: /service2/*
        pathType: Prefix
        backend:
          service:
            name: k8-sboot-restapi-test
            port:
              number: 8080

http://host/service1/actuator/health ---> Microservice 1
http://host/service2/actuator/health ---> Microservice 2

我使用的示例部署脚本

apiVersion: v1
kind: Pod
metadata:
  name: k8-boot-graphql-rest-aks-apm-test
  labels:
    app: k8-boot-graphql-rest-aks-apm-test
spec:
  containers:
  - image: sreyasvpariyath/k8-boot-graphql-rest-aks-apm-test:latest #CHANGE
    imagePullPolicy: Always
    name: k8-boot-graphql-rest-aks-apm-test
    ports:
    - containerPort: 8081
      protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
  name: k8-boot-graphql-rest-aks-apm-test
spec:
  selector:
    app: k8-boot-graphql-rest-aks-apm-test
  ports:
  - protocol: TCP
    port: 8081
    targetPort: 8081

【讨论】:

    【解决方案2】:

    appgw.ingress.kubernetes.io/backend-path-prefix: / 解决了@Matt 在评论部分指出的问题。

    我现在可以使用不同的路径定位多个后端池,例如,/api 用于 API 服务,/app 用于 UI 应用程序。

    我写了an article in my site about serving multiple APIs

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-29
      • 2022-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-20
      • 2020-06-17
      • 2023-01-03
      相关资源
      最近更新 更多