0%

背景

最近开展云平台项目,该项目分为前后端两部分。前端服务由于是静态资源,在交付的时候上传到 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 服务。