kubernetes nginx ingress无法将HTTP重定向到HTTPS

时间:2018-02-01 05:10:09

标签: nginx kubernetes google-cloud-platform

我有一个托管在Google云平台上的网络应用程序,它位于负载均衡器后面,负载均衡器本身位于入口后面。入口使用SSL证书设置并按预期接受HTTPS连接,但有一个问题:我无法将非HTTPS连接重定向到HTTPS。例如,如果我使用网址http://foo.comfoo.com连接到它,则只会转到foo.com,而不是我期望的https://foo.com。连接到https://foo.com显式生成所需的HTTPS连接。

我已经尝试了每个注释和配置可以想象,但它固执地拒绝,虽然它甚至不应该是必要的,因为如果指定TLS,文档暗示重定向是自动的。我是否从根本上误解了入口资源的工作原理?

更新:是否有必要在GCP上手动安装 nginx ingress?现在我想到了,我一直认为它在平台上的可用性是理所当然的,但在了解了如何在Google容器引擎上安装nginx入口的信息后,我意识到答案可能比我简单得多思想。将进一步调查。

Kubernetes版本: 1.8.5-gke.0

Ingress YAML文件:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: https-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    ingress.kubernetes.io/ssl-redirect: "true" 
    ingress.kubernetes.io/secure-backends: "true"    
    ingress.kubernetes.io/force-ssl-redirect: "true"
spec:
  tls:
    - hosts:
      - foo.com
      secretName: tls-secret
  rules:
    - host: foo.com
      http:
        paths:
          - path: /*
            backend:
              serviceName: foo-prod
              servicePort: 80

kubectl描述了https-ingress 输出

Name:             https-ingress
Namespace:        default
Address:
Default backend:  default-http-backend:80 (10.56.0.3:8080)
TLS:
  tls-secret terminates foo.com
Rules:
  Host            Path  Backends
  ----            ----  --------
  foo.com
                  /*   foo-prod:80 (<none>)
Annotations:
  force-ssl-redirect:  true
  secure-backends:     true
  ssl-redirect:        true
Events:                <none>

2 个答案:

答案 0 :(得分:5)

问题确实是Nginx Ingress在Google云平台上不是标准版,需要手动安装 - 呵呵!

然而,我发现安装它比预期困难得多(特别是因为我的需求特别针对GCP),所以我将概述我从头到尾采取的每一步,希望能帮助其他人谁使用特定的云并具有特定的需求,并找到不太适合该法案的通用指南。

  1. 获取群集凭据
  2. 这是一个GCP特定的步骤让我吵了一阵 - 如果你遇到奇怪的错误,你就会处理它,如

    kubectl unable to connect to server: x509: certificate signed by unknown authority

    尝试运行kubectl命令时。运行此命令以设置控制台:

    gcloud container clusters get-credentials YOUR-K8s-CLUSTER-NAME --z YOUR-K8S-CLUSTER-ZONE

    1. 安装头盔
    2. Helm本身并不难安装,并且可以在GCP自己的文档中找到方向;然而,他们忽略的是,在新版本的K8上,需要RBAC配置才能让Tiller安装东西。在helm init

      之后运行以下命令
      kubectl create serviceaccount --namespace kube-system tiller
      kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
      kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'
      
      1. 通过Helm安装Nginx Ingress
      2. 这是绊倒我的另一个步骤 - rbac.create=true对于前面提到的RBAC因素是必要的。

        helm install --name nginx-ingress-release stable/nginx-ingress --set rbac.create=true

        1. 创建Ingress资源
        2. 这一步是最简单的,并且有很多样本nginx入口配置可以调整 - 请参阅上面的@JahongirRahmonov示例。您必须记住的是,此步骤需要半小时到一个多小时才能设置 - 如果您更改配置并立即再次检查,则不会设置,但不要设置,但不要把它搞砸了,你搞砸了!等一会儿,先看看。

          很难相信这就是现在用Kubernetes将HTTP重定向到HTTPS需要多少钱,但我希望这本指南可以帮助其他人坚持这样一个看似简单而又如此迫切的需求。

答案 1 :(得分:2)

GCP有一个默认的入口控制器,在撰写本文时不能强制使用https。

您需要明确管理NGINX Ingress控制器。

有关如何在GCP上执行该操作,请参阅this article

然后将此注释添加到您的入口:

kubernetes.io/ingress.allow-http: "false"

希望它有所帮助。