使用AWS Load Balancer Controller暴露应用遇404问题求助
问题:EKS中使用AWS Load Balancer Controller暴露game-2048应用返回404
我参考示例在EKS上使用AWS Load Balancer Controller通过负载均衡器暴露应用,仅在Ingress注解中添加alb.ingress.kubernetes.io/group.name后,echoserver示例可正常访问,配置如下:
apiVersion: "v1" kind: "Namespace" metadata: name: "echoserver" --- apiVersion: "apps/v1" kind: "Deployment" metadata: name: "echoserver" namespace: "echoserver" spec: selector: matchLabels: app: "echoserver" replicas: 1 template: metadata: labels: app: "echoserver" spec: containers: - image: "k8s.gcr.io/e2e-test-images/echoserver:2.5" imagePullPolicy: "Always" name: "echoserver" ports: - containerPort: 8080 --- apiVersion: "v1" kind: "Service" metadata: name: "echoserver" namespace: "echoserver" spec: ports: - port: 80 targetPort: 8080 protocol: "TCP" type: "NodePort" selector: app: "echoserver" --- apiVersion: "networking.k8s.io/v1" kind: "Ingress" metadata: name: "echoserver" namespace: "echoserver" annotations: alb.ingress.kubernetes.io/subnets: "subnet-1,subnet-2,subnet-3" alb.ingress.kubernetes.io/tags: "Environment=dev,Team=test" alb.ingress.kubernetes.io/group.name: "test.apps" alb.ingress.kubernetes.io/scheme: "internal" spec: ingressClassName: "alb" rules: - http: paths: - path: "/echoserver" pathType: "Prefix" backend: service: name: "echoserver" port: number: 80
通过Ingress外部IP加/echoserver路径访问可获得预期输出。但部署game-2048应用时,访问Ingress的/game路径却返回404 Not Found,配置如下:
--- apiVersion: "v1" kind: "Namespace" metadata: name: "game-2048" --- apiVersion: "apps/v1" kind: "Deployment" metadata: namespace: "game-2048" name: "deployment-2048" spec: selector: matchLabels: app.kubernetes.io/name: "app-2048" replicas: 5 template: metadata: labels: app.kubernetes.io/name: "app-2048" spec: containers: - image: "alexwhen/docker-2048" imagePullPolicy: "Always" name: "app-2048" ports: - containerPort: 80 --- apiVersion: "v1" kind: "Service" metadata: namespace: "game-2048" name: "service-2048" spec: ports: - port: 80 targetPort: 80 protocol: "TCP" type: "NodePort" selector: app.kubernetes.io/name: "app-2048" --- apiVersion: "networking.k8s.io/v1" kind: "Ingress" metadata: namespace: "game-2048" name: "ingress-2048" annotations: alb.ingress.kubernetes.io/subnets: "subnet-1,subnet-2,subnet-3" alb.ingress.kubernetes.io/tags: "Environment=dev,Team=test" alb.ingress.kubernetes.io/group.name: "test.apps" alb.ingress.kubernetes.io/scheme: "internal" spec: ingressClassName: "alb" rules: - http: paths: - path: "/game" pathType: "Prefix" backend: service: name: "service-2048" port: number: 80
请问我遗漏了什么配置?
解决方案
问题出在路径转发逻辑上:game-2048的Web服务默认仅响应**根路径(/)**的请求,而你的Ingress配置了/game前缀,ALB会直接把/game开头的请求原样转发给后端服务,但应用本身没有/game对应的路由,所以返回404。而echoserver之所以正常,是因为它支持任意路径的请求,会返回请求的详细信息,不受路径前缀影响。
你需要在game-2048的Ingress注解中添加路径重写配置,让ALB在转发请求时去掉/game前缀,将请求路径改为根路径,添加的注解如下:
alb.ingress.kubernetes.io/rewrite-target: /
修改后的完整Ingress配置如下:
apiVersion: "networking.k8s.io/v1" kind: "Ingress" metadata: namespace: "game-2048" name: "ingress-2048" annotations: alb.ingress.kubernetes.io/subnets: "subnet-1,subnet-2,subnet-3" alb.ingress.kubernetes.io/tags: "Environment=dev,Team=test" alb.ingress.kubernetes.io/group.name: "test.apps" alb.ingress.kubernetes.io/scheme: "internal" alb.ingress.kubernetes.io/rewrite-target: / spec: ingressClassName: "alb" rules: - http: paths: - path: "/game" pathType: "Prefix" backend: service: name: "service-2048" port: number: 80
更新配置后,ALB会将/game开头的请求重写为根路径转发给game-2048服务,就能正常访问了。
内容的提问来源于stack exchange,提问作者Spencer Trinh
相关产品推荐
相关产品推荐

