首页 文章

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

提问于
浏览
3

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

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

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

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 describe ing 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 回答

  • 2

    问题确实是Nginx Ingress不是Google Cloud Platform的标准,需要手动安装 - doh!

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

    • 获取群集凭据

    这是一个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

    • 安装头盔

    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"}}}}'
    
    • 通过头盔安装Nginx Ingress

    这是绊倒我的另一个步骤 - 上述RBAC因素需要 rbac.create=true .

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

    • 创建Ingress资源

    这一步是最简单的,并且有很多样本nginx入口配置可以调整 - 请参阅上面的@JahongirRahmonov示例 . 您必须记住的是,此步骤需要半小时到一个多小时才能设置 - 如果您更改配置并立即再次检查,则不会设置,但不要将其视为含义你弄乱了什么!等一会儿先看看 .

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

  • 4

    GCP有一个默认的入口控制器,在撰写本文时 cannot 强制https .

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

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

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

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

    希望能帮助到你 .

相关问题