首页 文章

traefik ingress自定义错误在kubernetes

提问于
浏览
1

我需要在kubernetes上的traefik ingress中设置自定义错误,这样当没有 endpoints 或状态为“404”或“[500-600]”时,它会重定向到另一个错误服务或另一个自定义错误消息我使用了注释,就像它在入口文件中的文档一样(注意:这是一个将注释作为yaml传递给values.yaml文件的helm模板输出)

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: frontend
  namespace: "default"
  annotations:
      external-dns.alpha.kubernetes.io/target: "domain.com"
      kubernetes.io/ingress.class: "traefik"
      traefik.ingress.kubernetes.io/error-pages: "map[/:map[backend:hello-world status:[502 503]]]"
spec:
  rules:
  - host: frontend.domain.com
    http:
      paths:
      - backend:
          serviceName: frontend
          servicePort: 3000
        path: /

3 回答

  • 1

    ldez的答案是正确的,但有几点需要注意:

    • 首先,这些注释仅适用于traefik> = 1.6.x(早期版本可能支持错误页面,但不适用于kubernetes后端)

    • 其次,通过kubernetes配置traefik后端 must . 您无法在配置文件中创建后端并将其与kubernetes一起使用,至少在traefik 1.6.x中不能使用

    这是完整的事情的样子 . foo 只是一个名字,如另一个答案中所解释的那样,可以是任何名称:

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: frontend
      namespace: "default"
      annotations:
          external-dns.alpha.kubernetes.io/target: "domain.com"
          kubernetes.io/ingress.class: "traefik"
          traefik.ingress.kubernetes.io/error-pages: |-
            foo:
              status:
              - "404"
              - "500"
              # See below on where "error-pages" comes from
              backend: error-pages
              query: "/{{status}}.html"
    spec:
      rules:
       # This creates an ingress on an non-existing host name,
       # which binds to a service. As part of this a traefik
       # backend "error-pages" will be created, which is the one
       # we use above
       - host: error-pages
         http:
           paths:
           - backend:
             serviceName: error-pages-service
             servicePort: https
    - host: frontend.domain.com
        http:
        # The configuration for your "real" Ingress goes here
    
    # This is the service to back the ingress defined above
    # Note that you can use anything for this, including an internal app
    # Also: If you use https, the cert on the other side has to be valid
    ---
    kind: Service
    apiVersion: v1
    metadata:
      name: error-pages-service
      namespace: default
    spec:
      ports:
      - name: https
        port: 443
      type: ExternalName
      externalName: my-awesome-errors.mydomain.test
    

    如果您使用此配置,并且您的应用程序发送了404,那么 https://my-awesome-errors.mydomain.test/404.html 将显示为错误页面 .

  • -1

    正确的语法是:

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: frontend
      namespace: "default"
      annotations:
          external-dns.alpha.kubernetes.io/target: "domain.com"
          kubernetes.io/ingress.class: "traefik"
          traefik.ingress.kubernetes.io/error-pages: |-
            foo:
              status:
              - "404"
              backend: bar
              query: /bar
            fii:
              status:
              - "500-600"
              backend: bar
              query: /bir
    spec:
      rules:
      - host: frontend.domain.com
        http:
          paths:
          - backend:
              serviceName: frontend
              servicePort: 3000
            path: /
    

    https://docs.traefik.io/v1.6/configuration/backends/kubernetes/#general-annotations

    请注意,目前,Helm Charts不支持此功能 .

  • 1

    Ingress不支持你们在那里使用的注释!仅使用Service支持注释,Ingress使用主机部分 .

相关问题