kubernetes nginx入口无法将HTTP重定向到HTTPS

Art*_*rov 4 nginx google-cloud-platform kubernetes

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

我已经尝试了所有可以想到的注释和配置,但是它固执地拒绝了,尽管甚至没有必要,因为文档暗示如果指定了TLS,重定向是自动的。我是从根本上误解了入口资源是如何工作的吗?

更新:是否有必要在GCP上手动安装 Nginx Ingress?现在我考虑了一下,我一直在理所当然地将其在平台上的可用性,但是在遇到了有关如何在Google Container Engine上安装nginx ingress的信息之后,我意识到答案可能比我想象的要简单得多。将进一步调查。

Kubernetes版本:1.8.5-gke.0

入口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
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

Art*_*rov 5

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

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

  1. 获取群集凭据

这是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. 安装头盔

头盔本身并不难安装,可以在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"}}}}'
Run Code Online (Sandbox Code Playgroud)
  1. 通过Helm安装Nginx Ingress

这是令我震惊的另一个步骤- rbac.create=true对于上述RBAC因子而言是必需的。

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

  1. 创建您的Ingress资源

这是最简单的步骤,并且有许多示例的Nginx入口配置需要调整-请参见上面的@JahongirRahmonov的示例。您必须记住的是,此步骤需要花费半小时到一个小时以上的时间才能完成设置-如果您更改配置并立即再次检查,则不会进行设置,但是请不要将其视为暗示。你搞砸了!请稍等片刻。

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