如何在 GKE Ingress-gce 上将 HTTPS 设置为默认值
How to set HTTPS as default on GKE Ingress-gce
我目前有一个工作的前端和后端节点端口,其中的 Ingress 服务设置使用 GKE 的 Google 管理的证书。
但是,我的问题是默认情况下 当用户转到 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
目前GKE
Ingress不支持开箱即用HTTP
->HTTPS
重定向。
这里有一个正在进行的功能请求:
有一些解决方法:
- 使用不同的
Ingress
控制器,例如 nginx-ingress
。
- 在
GCP
Cloud Console 中创建 HTTP
->HTTPS
重定向。
How do I properly disable http on GKE ingress, or how do I redirect all my traffic to https?
要在 GKE
上禁用 HTTP
,您可以使用以下注释:
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
在 GCP
Cloud Console 中创建 HTTP
->HTTPS
重定向。
还有一个选项可以手动为您的Ingress
资源创建重定向规则。您将需要遵循官方文档:
使用上述文档的一部分,您需要创建一个 HTTP
LoadBalancer 响应与您的 Ingress
资源相同的 IP(保留的静态 IP),将流量重定向到 HTTPS
.
Disclaimer!
Your Ingress
resource will need to have following annotation:
kubernetes.io/ingress.allow-http: "false"
Lack there of will result in forbidding you to create a redirection mentioned above.
我目前有一个工作的前端和后端节点端口,其中的 Ingress 服务设置使用 GKE 的 Google 管理的证书。
但是,我的问题是默认情况下 当用户转到 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
目前GKE
Ingress不支持开箱即用HTTP
->HTTPS
重定向。
这里有一个正在进行的功能请求:
有一些解决方法:
- 使用不同的
Ingress
控制器,例如nginx-ingress
。 - 在
GCP
Cloud Console 中创建HTTP
->HTTPS
重定向。
How do I properly disable http on GKE ingress, or how do I redirect all my traffic to https?
要在 GKE
上禁用 HTTP
,您可以使用以下注释:
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
在 GCP
Cloud Console 中创建 HTTP
->HTTPS
重定向。
还有一个选项可以手动为您的Ingress
资源创建重定向规则。您将需要遵循官方文档:
使用上述文档的一部分,您需要创建一个 HTTP
LoadBalancer 响应与您的 Ingress
资源相同的 IP(保留的静态 IP),将流量重定向到 HTTPS
.
Disclaimer!
Your
Ingress
resource will need to have following annotation:
kubernetes.io/ingress.allow-http: "false"
Lack there of will result in forbidding you to create a redirection mentioned above.