【问题标题】:Routing troubleshooting with Kubernetes Ingress使用 Kubernetes Ingress 进行路由故障排除
【发布时间】:2019-09-25 08:26:06
【问题描述】:

我尝试使用前端 pod (cup-fe) 和后端 pod 设置 GKE 环境,用于在登录时对用户进行身份验证 (cup-auth),但我无法让我的入口正常工作。

以下是运行 nginx 的前端 pod (cup-fe) 和 Angular 应用程序。我还创建了一个由“cup.xxx.it”和“cup-auth.xxx.it”dns解析的静态IP地址:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: cup-fe
  namespace: default
  labels:
    app: cup-fe
spec:
  replicas: 2
  selector:
    matchLabels:
      app: "cup-fe"
  template:
    metadata:
      labels:
        app: "cup-fe"
    spec:
      containers:
      - image: "eu.gcr.io/xxx-cup-yyyyyy/cup-fe:latest"
        name: "cup-fe"
      dnsPolicy: ClusterFirst

然后是auth pod(cup-auth):

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: cup-auth
  namespace: default
  labels:
    app: cup-auth
spec:
  replicas: 1
  selector:
    matchLabels:
      app: cup-auth
  template:
    metadata:
      labels:
        app: cup-auth
    spec:
      containers:
        image:  "eu.gcr.io/xxx-cup-yyyyyy/cup-auth:latest"
        imagePullPolicy: Always
        name: cup-auth
        ports:
        - containerPort: 8080
          protocol: TCP
        - containerPort: 8443
          protocol: TCP
        - containerPort: 8778
          name: jolokia
          protocol: TCP
        - containerPort: 8888
          name: management
          protocol: TCP
      dnsPolicy: ClusterFirst

然后我创建了两个 NodePort 来暴露上面的 pod:

kubectl expose deployment cup-fe --type=NodePort --port=80
kubectl expose deployment cup-auth --type=NodePort --port=8080

最后,我创建了一个入口来将外部 http 请求路由到服务:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: http-ingress
  namespace: default
  labels:
    app: http-ingress
spec:
  rules:
  - host: cup.xxx.it
    http:
      paths:
      - path: /*
        backend:
          serviceName: cup-fe
          servicePort: 80
  - host: cup-auth.xxx.it
    http:
      paths:
      - path: /*
        backend:
          serviceName: cup-auth

所以,我可以通过 http://cup.xxx.it 到达前端 pod,角度应用程序将我重定向到 http://cup-auth.xxx.it/login,但我只收到 502 个错误请求。使用kubectl describe ingress 命令,我可以看到cup-auth pod 的后端不健康。

我使用 cup-auth 标签粘贴成功的输出:

$ kubectl exec -it cup-fe-7f979bb747-6lqfx wget cup.xxx.it/login
Connecting to cup.xxx.it
login                100% |********************************|  1646  0:00:00 ETA

然后是不工作的输出:

$ kubectl exec -it cup-fe-7f979bb747-6lqfx wget cup-auth.xxx.it/login
Connecting to cup-auth.xxx.it
wget: server returned error: HTTP/1.1 502 Bad Gateway
command terminated with exit code 1

【问题讨论】:

  • 我尝试重现您的场景,但 Ingress 服务的定义似乎不完整。如果我没有为 cup-auth 服务指定 servicePort,我会收到错误消息。能否提供 Ingress 服务的完整 YAML 定义?根据您收到的错误似乎是后端问题,可能在您的应用程序中。您如何处理 cup-auth.xxx.it/login 上的重定向,或者请求的输出是什么?
  • 谢谢你的回复,我忘了servicePort:8080。我不处理cup-auth.xxx.it/login上的重定向,因为我认为入口必须这样做。 cup-auth pod内的curl localhost:8080/login返回给我正确的登录页面,但由于404错误,我无法访问公共地址cup-auth.xxx.it/login。

标签: kubernetes google-kubernetes-engine kubernetes-ingress


【解决方案1】:

我尽可能多地尝试并复制了您的设置,但没有任何问题。 我可以在 pod 内部和外部正常调用cup-auth.testdomain.internal/login

通常,502 错误发生在接收到 LB 的请求无法转发到后端时。既然你提到你看到一个不健康的后端,这可能就是原因。

这可能是由于健康检查配置错误或您的应用程序出现问题。

首先,我会查看日志以了解请求失败的原因,并排除运行状况检查或应用程序本身没有问题。

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    • 2019-10-01
    • 2016-04-28
    • 1970-01-01
    相关资源
    最近更新 更多