基于GCP与Kubernetes实现www到非www的永久重定向方案咨询
实现GKE GCE Ingress的www到非www永久重定向
要解决手动配置GCP负载均衡器高级规则会被Ingress覆盖、更新延迟的问题,直接通过Kubernetes资源配置永久重定向即可,步骤如下:
1. 创建重定向专用FrontendConfig
创建www-to-naked-redirect.yml文件,定义301永久重定向规则,同时保留HTTPS强制跳转:
apiVersion: networking.gke.io/v1beta1 kind: FrontendConfig metadata: name: www-to-naked-redirect namespace: production spec: redirectToHttps: enabled: true responseCodeName: MOVED_PERMANENTLY_DEFAULT urlRedirect: hostRedirect: marutitech.com pathRedirect: / redirectResponseCode: MOVED_PERMANENTLY_DEFAULT stripQuery: false
这个配置会把所有www.marutitech.com的请求,永久重定向到marutitech.com,同时保留原路径和查询参数。
2. 配置占位服务(Dummy Service)
GCE Ingress要求每个路由规则必须绑定后端服务,即使是重定向规则。创建一个占位服务:
apiVersion: v1 kind: Service metadata: name: dummy-service namespace: production spec: ports: - port: 80 targetPort: 80 selector: app: dummy
如果集群里已有闲置Pod,直接修改selector指向该Pod的标签即可,无需额外创建Pod。
3. 拆分Ingress配置
将原Ingress拆分为两个,分别处理非www正常流量和www重定向流量:
非www域名Ingress(正常服务)
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: naked-domain-ingress namespace: production annotations: kubernetes.io/ingress.class: "gce" networking.gke.io/managed-certificates: gke-managed-cert networking.gke.io/v1beta1.FrontendConfig: ssl-redirect spec: rules: - host: marutitech.com http: paths: - pathType: Prefix path: / backend: service: name: maruti-nextjs port: number: 80
www域名Ingress(重定向专用)
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: www-redirect-ingress namespace: production annotations: kubernetes.io/ingress.class: "gce" networking.gke.io/managed-certificates: gke-managed-cert networking.gke.io/v1beta1.FrontendConfig: www-to-naked-redirect spec: rules: - host: www.marutitech.com http: paths: - pathType: Prefix path: / backend: service: name: dummy-service port: number: 80
4. 确认托管证书覆盖双域名
确保你的GKE托管证书同时包含两个域名,否则www域名会出现SSL错误:
apiVersion: networking.gke.io/v1 kind: ManagedCertificate metadata: name: gke-managed-cert namespace: production spec: domains: - marutitech.com - www.marutitech.com
应用配置
依次执行以下命令生效:
kubectl apply -f dummy-service.yml kubectl apply -f www-to-naked-redirect.yml kubectl apply -f naked-domain-ingress.yml kubectl apply -f www-redirect-ingress.yml # 若需更新证书,执行: kubectl apply -f managed-cert.yml
配置完成后,所有访问www.marutitech.com的请求都会被负载均衡器直接返回301重定向到marutitech.com,且配置完全由Kubernetes管理,不会被后续Ingress更新覆盖。
内容的提问来源于stack exchange,提问作者Preet Patel
相关产品推荐
相关产品推荐

