关于Ingress按端口配置后端规则及Google云HTTPS跳转的技术问询
我来帮你解决这两个问题哈~
一、如何按端口配置Ingress后端规则
Ingress本身是基于HTTP/HTTPS协议的路由规则,后端端口的配置本质是关联到Kubernetes Service的暴露端口——你只需要在Ingress的backend字段里指定目标Service的名称及其对应的端口号即可。
举个实际场景的例子:假设你有两个Service,api-service(端口8080提供API服务)和web-service(端口3000提供前端页面),想要通过同一个域名的不同路径分别指向这两个不同端口的服务,对应的Ingress YAML配置如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: multi-port-ingress spec: rules: - host: your-domain.com http: paths: - path: /api pathType: Prefix backend: service: name: api-service port: number: 8080 # 指向api-service的8080端口 - path: / pathType: Prefix backend: service: name: web-service port: number: 3000 # 指向web-service的3000端口
如果是同一个路径需要区分不同端口(这种场景较少,通常对应不同协议,但Ingress仅处理HTTP/HTTPS),你可以拆分不同的Host规则来实现。
二、GKE Ingress实现HTTP自动跳转HTTPS的方案
你说得没错,GKE的原生Ingress控制器确实没有直接的“强制SSL”配置项,但我们可以通过两种靠谱的方式实现HTTP请求自动重定向到HTTPS,不用让用户手动输入https://:
方法1:使用BackendConfig配置CLB重定向(推荐)
Google Cloud Load Balancer(CLB)本身支持HTTP到HTTPS的重定向,我们可以通过BackendConfig资源把这个能力关联到你的Ingress上:
- 首先创建一个
BackendConfig资源,开启HTTPS重定向:
apiVersion: cloud.google.com/v1 kind: BackendConfig metadata: name: http-redirect-config spec: redirectToHttps: enabled: true responseCodeName: MOVED_PERMANENTLY # 返回301永久重定向,也可选用TEMPORARY_REDIRECT返回302
- 修改你的whoami Service,给80端口绑定上述BackendConfig:
apiVersion: v1 kind: Service metadata: name: whoami-service annotations: # 给Service的80端口绑定重定向配置 cloud.google.com/backend-config: '{"ports": {"80":"http-redirect-config"}}' spec: ports: - name: http port: 80 targetPort: 80 - name: https port: 443 targetPort: 443 selector: app: whoami
- 更新Ingress规则,同时包含HTTP和HTTPS路由:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: whoami-ingress annotations: kubernetes.io/ingress.class: "gce" # 指定使用GKE原生Ingress控制器 networking.gke.io/managed-certificates: "your-managed-cert" # 关联你的GKE管理证书 spec: tls: - hosts: - whoami.domain.com # 若使用自管理证书,需添加secretName字段指定证书Secret # secretName: whoami-tls-secret rules: - host: whoami.domain.com http: paths: - path: / pathType: Prefix backend: service: name: whoami-service port: number: 80 # HTTP流量触发BackendConfig的重定向 - host: whoami.domain.com http: paths: - path: / pathType: Prefix backend: service: name: whoami-service port: number: 443 # HTTPS流量直接走原服务端口
这样用户访问http://whoami.domain.com时,CLB会自动返回301重定向到HTTPS地址,完全不用用户手动切换协议。
方法2:部署专门的重定向服务
如果因为版本限制等原因无法使用BackendConfig,可以部署一个轻量的重定向服务(比如用Nginx):
- 创建Nginx重定向配置的ConfigMap:
apiVersion: v1 kind: ConfigMap metadata: name: redirect-nginx-config data: nginx.conf: | events {} http { include /etc/nginx/mime.types; server { listen 80; server_name whoami.domain.com; return 301 https://$host$request_uri; } }
- 部署重定向服务的Deployment和Service:
apiVersion: apps/v1 kind: Deployment metadata: name: redirect-deployment spec: replicas: 2 selector: matchLabels: app: redirect template: metadata: labels: app: redirect spec: containers: - name: nginx image: nginx:alpine volumeMounts: - name: config mountPath: /etc/nginx/nginx.conf subPath: nginx.conf volumes: - name: config configMap: name: redirect-nginx-config --- apiVersion: v1 kind: Service metadata: name: redirect-service spec: ports: - port: 80 targetPort: 80 selector: app: redirect
- 更新Ingress规则,拆分HTTP和HTTPS流量:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: whoami-ingress annotations: kubernetes.io/ingress.class: "gce" networking.gke.io/managed-certificates: "your-managed-cert" spec: tls: - hosts: - whoami.domain.com rules: - host: whoami.domain.com http: paths: - path: / pathType: Prefix backend: service: name: redirect-service port: number: 80 # HTTP流量走重定向服务 - host: whoami.domain.com http: paths: - path: / pathType: Prefix backend: service: name: whoami-service port: number: 443 # HTTPS流量走原服务
这种方法也能实现同样效果,只是需要额外维护一个轻量服务。
内容的提问来源于stack exchange,提问作者pjotr_dolphin

