背景
最近开展云平台项目,该项目分为前后端两部分。前端服务由于是静态资源,在交付的时候上传到 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
1 2 3 4 5 6 7 8 9
| apiVersion: v1 kind: 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 规则
1 2 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/v1 kind: 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 规则
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| apiVersion: networking.k8s.io/v1 kind: 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
服务。