【问题标题】:How to fix "503 Service Temporarily Unavailable"如何修复“503 服务暂时不可用”
【发布时间】:2020-02-21 16:46:03
【问题描述】:

仅供参考:

  1. 我在 docker desktop for mac 上运行 Kubernetes
  2. 基于Nginx镜像的网站

我在 Kubetesetes 上运行 2 个简单的网站部署并使用 NodePort 服务。然后我想使用入口路由到网站。当我打开浏览器并访问该网站时,我收到如下图所示的错误 503。那么,我该如何解决这个错误呢?

### Service
apiVersion: v1
kind: Service
metadata:
  name: app-svc
  labels:
    app: app1
spec:
  type: NodePort
  ports:
  - port: 80
  selector:
    app: app1
---
apiVersion: v1
kind: Service
metadata:
  name: app2-svc
  labels:
    app: app2
spec:
  type: NodePort
  ports:
  - port: 80
  selector:
    app: app2

### Ingress-Rules
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: app-ingress
  annotations:
    ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /app1
        backend:
          serviceName: app-svc
          servicePort: 30092
      - path: /app2
        backend:
          serviceName: app2-svc
          servicePort: 30936


enter image description here

【问题讨论】:

  • 尝试将服务设置为ClusterIP,而不是NodePort,并将servicePort设置为80
  • @Jonas 将服务类型更改为 ClusterIP 后出现错误 404。
  • 您在 404 上获得了哪些 http 标头? Server Header 和 openresty 类似吗?您是否尝试按照 :/app1 访问您的 nginx-ingress?

标签: kubernetes kubernetes-ingress nginx-ingress docker-desktop


【解决方案1】:

是的,我最终遇到了同样的错误。一旦我将服务类型更改为“ClusterIP”,它对我来说效果很好。

【讨论】:

    【解决方案2】:

    在搜索 nginx 的解决方案后发现此页面,尽管服务名称都已正确配置,但仍不断返回 503 响应。对我来说,问题是我已经在特定的命名空间中配置了 kubernetes 服务,但没有将入口组件更新为在同一个命名空间中。尽管是一个如此简单的解决方案,但它一点也不明显!

    【讨论】:

      【解决方案3】:

      我建议你使用服务类型 ClusterIP 看看这篇有用的文章:services-kubernetes

      如果您使用 Ingress,您必须知道 Ingress 不是一种服务,而是一个对象,它充当反向代理和集群的单个入口点,将请求路由到不同的服务。最基本的 Ingress 是 NGINX Ingress Controller,NGINX 在其中扮演反向代理的角色,同时也起到 SSL 的作用。在下图中,您可以看到环境对象的特定组件之间的工作流。

      Ingress 通过 ClusterIP 和 Kubernetes 代理、NodePort 或 LoadBalancer 向集群外部公开,并根据配置的规则路由传入流量。

      服务定义示例:

      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: app-svc
        labels:
          app: app1
      spec:
        type: ClusterIP
        ports:
        - port: 80
        selector:
          app: app1
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: app2-svc
        labels:
          app: app2
      spec:
        type: ClusterIP
        ports:
        - port: 80
        selector:
          app: app2
      

      如果有帮助,请告诉我。

      【讨论】:

      • 将服务更改为 ClusterIP 后得到 404。
      • 是的,即使我在更改后也得到了 503。
      【解决方案4】:

      首先,您需要将app-service 的服务类型更改为ClusterIP,因为Ingress 对象将从集群内部访问这些Pods(服务)。 (当您希望允许访问集群内的 pod 时使用 ClusterIP 服务。

      其次,通过运行kubectl get services 确保服务正在运行,并根据Ingress 路由规则中backend 部分中的名称检查正在运行的服务名称

      【讨论】:

        【解决方案5】:

        这次旅程有点晚了,但这是我对这个问题的评论。 我有同样的问题和相同的环境。 (基于 Docker 桌面的 Kubernetes 和 WSL2)

        几项可能会有所帮助。

        1. 在规则部分添加主机条目。并且值将是 kubernetes.docker.internal 如下所示

        rules:
            - host: kubernetes.docker.internal
            http:
              paths:
              - path....
        1. 使用kubectl get services 检查端点,以确认每个后端服务的入口规则定义中都存在相同的端口。

        backend:
          service:
            name: my-apple-service
              port:
                number: 30101
        kubectl get services
        

        NAME                TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)     AGE
        my-apple-service    ClusterIP   10.106.121.95   <none>        30101/TCP   9h
        my-banada-service   ClusterIP   10.99.192.112   <none>        30101/TCP   9h

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-08-18
          • 2011-12-19
          • 2018-09-16
          • 1970-01-01
          • 2019-12-29
          • 2013-10-31
          • 2021-10-03
          • 2023-04-06
          相关资源
          最近更新 更多