【问题标题】:kubernetes ingress TLS validation and redirection issuekubernetes 入口 TLS 验证和重定向问题
【发布时间】:2020-07-28 00:01:50
【问题描述】:

我有两个 kubernetes 环境,它们使用入口作为代理来重定向请求以提供静态(前端)和后端休息服务。

这样的请求可以通过其中一个环境中的两个主机 URL 访问(一个主机配置了 tls 证书密码),而在另一个环境中,我没有配置任何 tls 密码,它只能由一个访问主机网址

在第一个环境中(只有一个主机且没有 TLS 密码)我有以下内容:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "70"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "1000"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "1000"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
  creationTimestamp: "XXXX"
  generation: 9
  labels:
    app: myapp
    chart: myapp-0.1.0
    heritage: Helm
    release: myapp-ingress
  name: myapp-ingress
  namespace: myapp-namespace
  resourceVersion: "25745018"
  selfLink: /apis/extensions/v1beta1/namespaces/my-app-namespace/ingresses/my-app-ingress
  uid: 34c3d902-1517
spec:
  rules:
  - host: hostOne
    http:
      paths:
      - backend:
          serviceName: myapp-front
          servicePort: 8080
        path: /(.*)
      - backend:
          serviceName: myapp-backend
          servicePort: 8080
        path: /myappapi/(.+)
  tls:
  - hosts:
    - hostOne
status:
  loadBalancer:
    ingress:
    - {}

在这一个中,我可以通过 HTTP 完美地发出请求,并且一切正常。对于 HTTPS 请求,我得到一个 SSLExcepcion,因为客户端中没有安装证书(这是正常且明显的)

在第二个集群中,我有 TLS 密钥和两个主机 URL:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "70"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "1000"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "1000"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
  creationTimestamp: "XXXX"
  generation: 9
  labels:
    app: myapp
    chart: myapp-0.1.0
    heritage: Helm
    release: myapp-ingress
  name: myapp-ingress
  namespace: myapp-namespace
  resourceVersion: "25745018"
  selfLink: /apis/extensions/v1beta1/namespaces/my-app-namespace/ingresses/my-app-ingress
  uid: 34c3d902-1517
spec:
  rules:
  - host: hostOne
    http:
      paths:
      - backend:
          serviceName: myapp-front
          servicePort: 8080
        path: /(.*)
      - backend:
          serviceName: myapp-backend
          servicePort: 8080
        path: /myappapi/(.+)
  - host: hostTwo
    http:
      paths:
      - backend:
          serviceName: myapp-front
          servicePort: 8080
        path: /(.*)
      - backend:
          serviceName: myapp-backend
          servicePort: 8080
        path: /myappapi/(.+)
  tls:
  - hosts:
    - hostTwo
    secretName: tlsSecret
  - hosts:
    - hostOne
status:
  loadBalancer:
    ingress:
    - {}

在这种情况下,当使用 HTTP 进行请求时,我会在两个 URL(hostOne 和 hostTwo)中重定向到 HTTPS 时收到 803 错误

我希望在仅对 hostTwo 使用 http 时进行重定向,该 hostTwo 配置了证书和 TLS 机密。

为什么入口会响应 http 的重定向而在第一种情况下却没有?我应该改变什么?

当我向 https 发送带有 RestTemplate 的请求时,我得到一个 SSLException:

2020-05-08 12:57:05,586 ERROR class=ExceptionHandler Received fatal alert: handshake_failure; nested exception is javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

我尝试安装证书和广告 TLS1.2,如下所述: Spring RestTemplate: SSL handshake failure

但它不起作用,我无法使用 http 发送请求,只是为了检查服务是否是良好的代码。

【问题讨论】:

    标签: rest http redirect kubernetes nginx-ingress


    【解决方案1】:

    我建议你有 2 个单独的 Ingress 对象。一个用于 SSL 主机,另一个用于非 SSL 主机。请检查以下 2 个入口对象。

    对于 HostOne - 不需要重定向

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/proxy-connect-timeout: "70"
        nginx.ingress.kubernetes.io/proxy-read-timeout: "1000"
        nginx.ingress.kubernetes.io/proxy-send-timeout: "1000"
        nginx.ingress.kubernetes.io/rewrite-target: /$1
      generation: 9
      labels:
        app: myapp
        chart: myapp-0.1.0
        heritage: Helm
        release: myapp-ingress
      name: myapp-ingress-non-ssl
      namespace: myapp-namespace
    spec:
      rules:
      - host: hostOne
        http:
          paths:
          - backend:
              serviceName: myapp-front
              servicePort: 8080
            path: /(.*)
          - backend:
              serviceName: myapp-backend
              servicePort: 8080
            path: /myappapi/(.+)
      tls:
      - hosts:
        - hostOne
    status:
      loadBalancer:
        ingress:
        - {}
    

    对于 HostTwo - 需要重定向的地方#添加了重定向注释

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      annotations:
        nginx.ingress.kubernetes.io/proxy-connect-timeout: "70"
        nginx.ingress.kubernetes.io/proxy-read-timeout: "1000"
        nginx.ingress.kubernetes.io/proxy-send-timeout: "1000"
        nginx.ingress.kubernetes.io/rewrite-target: /$1
        nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
      generation: 9
      labels:
        app: myapp
        chart: myapp-0.1.0
        heritage: Helm
        release: myapp-ingress
      name: myapp-ingress-ssl
      namespace: myapp-namespace
    spec:
      rules:
      - host: hostTwo
        http:
          paths:
          - backend:
              serviceName: myapp-front
              servicePort: 8080
            path: /(.*)
          - backend:
              serviceName: myapp-backend
              servicePort: 8080
            path: /myappapi/(.+)
      tls:
      - hosts:
        - hostTwo
        secretName: tlsSecret
    status:
      loadBalancer:
        ingress:
        - {}
    

    【讨论】:

      【解决方案2】:

      我找到了。 https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/

      只是添加 nginx.ingress.kubernetes.io/force-ssl-redirect: "false",因为默认值为true。 @nischay,您的解决方案不起作用,因为在第一个入口中应该添加 nginx.ingress.kubernetes.io/force-ssl-redirect: "false" 并且拆分入口比添加注释更复杂, 无论如何,非常感谢。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-12-24
        • 1970-01-01
        • 2018-09-23
        • 1970-01-01
        • 2020-02-29
        • 2020-08-18
        • 1970-01-01
        • 2017-08-15
        相关资源
        最近更新 更多