如何在GKE Ingress-gce上将HTTPS设置为默认值

时间:2020-08-09 09:11:19

标签: docker kubernetes google-cloud-platform google-kubernetes-engine kubernetes-ingress

我目前有一个工作正常的前端和后端节点端口,并带有一个由GKE的Google管理的证书的Ingress服务设置。

但是,我的问题是默认情况下当用户访问samplesite.com时,它默认使用http。。这意味着用户需要专门输入浏览器https://samplesite.com以获得我网站的https版本。

如何在GKE入口上正确禁用http,或者如何将所有流量重定向到https?我知道这也可以在我的后端代码中强制执行,但是我想分开并在我的Kubernetes设置中解决这个问题。

这是我的ingress.yaml文件:

kind: Service
apiVersion: v1
metadata:
  name: frontend-node-service
  namespace: default
spec:
  type: NodePort
  selector:
    app: frontend
  ports:
  - port: 5000
    targetPort: 80
    protocol: TCP
    name: http
---
kind: Service
apiVersion: v1
metadata:
  name: backend-node-service
  namespace: default
spec:
  type: NodePort
  selector:
    app: backend
  ports:
  - port: 8081
    targetPort: 9229
    protocol: TCP
    name: http
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: samplesite-ingress-frontend
  namespace: default
  annotations:
    kubernetes.io/ingress.global-static-ip-name: "samplesite-static-ip"
    kubernetes.io/ingress.allow-http: "false"
    networking.gke.io/managed-certificates: samplesite-ssl
spec:
  backend:
    serviceName: frontend-node-service
    servicePort: 5000
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: samplesite-ingress-backend
  namespace: default
  annotations:
    kubernetes.io/ingress.global-static-ip-name: "samplesite-backend-ip"
    kubernetes.io/ingress.allow-http: "false"
    networking.gke.io/managed-certificates: samplesite-api-ssl
spec:
  backend:
    serviceName: backend-node-service
    servicePort: 8081

1 个答案:

答案 0 :(得分:2)

当前GKE的Ingress不支持即用型HTTP-> HTTPS重定向。

这里有一个正在进行的功能请求:

有一些解决方法

  • 使用其他Ingress控制器,例如nginx-ingress
  • HTTP Cloud Console中创建HTTPS-> GCP重定向。

如何在GKE入口上正确禁用http,或者如何将所有流量重定向到https?

要在HTTP上禁用GKE,可以使用以下注释:

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

此注释将:

  • 仅允许以下端口的流量:443 (HTTPS)
  • 端口80 (HTTP)上的拒绝流量导致错误代码:404

关注前面提到的解决方法:

使用不同的Ingress控制器,例如nginx-ingress

进行HTTP-> HTTPS重定向的一种方法是使用nginx-ingress。您可以使用官方文档进行部署:

Ingress控制器将创建类型为LoadBalancer的服务,该服务将成为您流量的入口。 Ingress个对象将在LoadBalancer IP上做出响应。您可以从安装部分下载清单,然后对其进行修改以支持您在GCP中所请求的静态IP。在这里可以找到更多参考:

您将需要提供自己的证书或使用cert-manager之类的工具来获得HTTPS流量作为注解:networking.gke.io/managed-certificates将不适用于nginx-ingress

我使用了YAML这个定义,没有任何其他注释,我总是被重定向到HTTPS

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx" # IMPORTANT
spec:
  tls: # HTTPS PART
  - secretName: ssl-certificate # SELF PROVIDED CERT NAME
  rules:
  - host:
    http:
      paths:
      - path: /
        backend:
          serviceName: hello-service
          servicePort: hello-port

HTTP云控制台中创建HTTPS-> GCP重定向。

还有一个选项,手动为您的Ingress资源创建重定向规则。您将需要遵循官方文档:

使用上述文档的一部分,您将需要创建一个HTTP LoadBalancer,它在与您的Ingress资源(保留的静态IP)相同的IP上进行响应,从而将流量重定向到HTTPS。 / p>

免责声明!

您的Ingress资源将需要具有以下注释:

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

缺少此功能将导致您无法创建上述重定向。