背景
最近开展云平台项目,该项目分为前后端两部分。前端服务由于是静态资源,在交付的时候上传到 OSS 平台。后端服务需要部署到 K8s 集群中。由于是基础设施服务,所以不需要接入 Istio,而是通过 Ingress-NGINX 的方式配置 SLB,并绑定公网域名。
云平台服务的访问要求是不能直接使用 OSS 的 CDN 域名,而是与后端服务共用域名。
集群版本
- K8s 版本:v1.21.3
- Istio 版本:1.13.1
思考
通过需求分析,我们想到的方案是,为前端资源创建 ExternalName 类型的 Service。然后配置 Ingress ruler,将 / 下的访问转发到该 Service。对于后端服务,我们配置额外的 Ingress 规则,将 /api 下的流量导入该服务对应的 Service。这样就解决二者域名共用的问题了。
实践
1、为前端创建 Service
| 12
 3
 4
 5
 6
 7
 8
 9
 
 | apiVersion: v1kind: Service
 metadata:
 name: cloud-native-web
 namespace: devops-test
 spec:
 externalName: cdn-test.tubetrue01.com
 sessionAffinity: None
 type: ExternalName
 
 | 
以上 cdn-test.tubetrue01.com 就是我们要转发的目标域名。
2、创建前端 Ingress 规则
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 
 | apiVersion: networking.k8s.io/v1kind: Ingress
 metadata:
 name: cloud-native-platform-web
 namespace: devops-test
 annotations:
 nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
 nginx.ingress.kubernetes.io/upstream-vhost: "cdn-test.tubetrue01.com"
 nginx.ingress.kubernetes.io/rewrite-target: "/index.html"
 spec:
 ingressClassName: inner-ingress
 rules:
 - host: cloud-test.tubetrue01.com
 http:
 paths:
 - backend:
 service:
 name: cloud-native-web
 port:
 number: 443
 path: /
 pathType: Prefix
 tls:
 - hosts:
 - cloud-test.tubetrue01.com
 secretName: tls-test-tubetrue01-wildcard
 
 | 
我们要注意的两个注解:nginx.ingress.kubernetes.io/upstream-vhost: "cdn-test.tubetrue01.com 指定了我们要转发的 host,nginx.ingress.kubernetes.io/rewrite-target: "/index.html" 为我们要转发的路径。
host: cloud-test.tubetrue01.com 是我们入口域名。以上的配置实现的逻辑是当访问 https://cloud-test.tubetrue01.com 时,自动转发到 https://cdn-test.tubetrue01.com/index.html。
3、创建后端 Ingress 规则
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 
 | apiVersion: networking.k8s.io/v1kind: Ingress
 metadata:
 name: cloud-native-platform
 namespace: devops-test
 spec:
 ingressClassName: inner-ingress
 rules:
 - host: cloud-test.tubetrue01.com
 http:
 paths:
 - backend:
 service:
 name: cloud-native-platform
 port:
 number: 80
 path: /api
 pathType: Prefix
 tls:
 - hosts:
 - cloud-test.tubetrue01.com
 secretName: tls-test-tubetrue01-wildcard
 
 | 
以上规则则用于将 https://cloud-test.tubetrue01.com/api 的流量引入后端的 cloud-native-platform 服务。