【问题标题】:Kubernetes ingress-nginx gives 502 error (Bad Gateway)Kubernetes ingress-nginx 给出 502 错误(错误网关)
【发布时间】:2019-10-21 18:33:07
【问题描述】:

我有一个我想要的 EKS 集群: - 每个集群 1 个负载均衡器, - 指向正确命名空间和正确服务的入口规则。

我一直在关注本指南:https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nginx-ingress-with-cert-manager-on-digitalocean-kubernetes

我的部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-world
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: hello-world
  template:
    metadata:
      labels:
        app: hello-world
    spec:
      containers:
      - name: hello-world
        image: IMAGENAME
        ports:
        - containerPort: 8000
          name: hello-world


---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: bleble
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: bleble
  template:
    metadata:
      labels:
        app: bleble
    spec:
      containers:
      - name: bleble
        image: IMAGENAME
        ports:
        - containerPort: 8000
          name: bleble


这些部署的服务:


apiVersion: v1
kind: Service
metadata: 
  name: hello-world-svc
spec: 
  ports: 
     -  port: 8080
        protocol: TCP
        targetPort: 8000
  selector: 
    app: hello-world
  type: NodePort

---

apiVersion: v1
kind: Service
metadata: 
  name: bleble-svc
spec: 
  ports: 
     -  port: 8080
        protocol: TCP
        targetPort: 8000
  selector: 
    app: bleble
  type: NodePort

我的负载均衡器:

kind: Service
apiVersion: v1
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-internal: "true"
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  externalTrafficPolicy: Local
  type: LoadBalancer
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  ports:
    - name: http
      port: 80
      targetPort: http

我的入口:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: simple-fanout-example
  namespace : default
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: internal-lb.aws.com
    http:
      paths:
      - path: /bleble
        backend:
          serviceName: bleble-svc
          servicePort: 80
      - path: /hello-world
        backend:
          serviceName: hello-world-svc
          servicePort: 80

我已经用这个设置了 Nginx 入口控制器:kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.24.1/deploy/mandatory.yaml

我不确定为什么我得到一个服务暂时不可用的 503 服务和另一个服务的一个 502...我猜这是端口或命名空间的问题?在指南中,他们没有为部署定义命名空间...

每个资源都可以正确创建,我认为入口实际上是在工作,但对去哪里感到困惑。

感谢您的帮助!

【问题讨论】:

  • 我尝试在我的 LB 中使用“Cluster”而不是“Local”,它返回 400 Not found
  • 你用什么命令来查询你的服务?
  • @Fei 到底是哪个服务?
  • 你提到你得到 503 / 502。你是怎么得到的?通过浏览器/Curl/其他命令?
  • 哦,我是通过浏览 lb 地址 + /nameservice 得到的。我和 curl 一样

标签: kubernetes kubernetes-ingress nginx-ingress amazon-eks


【解决方案1】:

找到了! Deployment 中的 containerPort 设置为 8000,也是服务的目标端口,但是编写代码的 Dockerfile 的人暴露了 80 端口。这就是它获得 502 Bad getaway 的原因!

也非常感谢@Fei,他一直是一位出色的帮手!

【讨论】:

    【解决方案2】:

    一般来说,使用externalTrafficPolicy: Cluster 而不是Local。您可以通过使用Local 获得一些性能(延迟)改进,但您需要付出很多努力来配置这些 pod 分配。这些错误配置会导致 5xx 错误。此外,ClusterexternalTrafficPolicy 的默认选项。

    在您的ingress 中,您将/bleble 路由到服务bleble,但您的服务名称实际上是bleble-svc。请让它们保持一致。此外,您需要将 servicePort 设置为 8080,因为您在服务配置中公开了 8080。

    对于像bleble-svc 这样的内部服务,Cluster IP 在您的情况下就足够了,因为它不需要外部访问。

    希望这会有所帮助。

    【讨论】:

    • 您好!使用 Cluster 而不是 Local puts 返回 400 Not found。可能是因为入口配置不正确?
    • 你试过 curl -H "Host: internal-lb.aws.com" http://${your_LB}/bleble
    • 所以我现在使用的地址(我还没有向我的部门询问 DNS 名称)是内部负载均衡器地址(internal-letternumbers-numbers.region.elb.amazonaws. com)。明确的名称将使用我们拥有的子域。
    • 我刚试过是的。 /bleble 返回 curl 命令 503 和 /hello-world 返回 502
    • 操作。对不起,我错过了一个非常明显的地方。让我更新我的答案。但是请切换到集群并尝试一下。
    猜你喜欢
    • 1970-01-01
    • 2011-05-14
    • 2019-06-05
    • 2015-08-10
    • 2020-09-07
    • 2020-02-13
    • 2021-11-19
    • 2012-09-25
    • 2014-12-07
    相关资源
    最近更新 更多