基于nginx -> traefik -> k8s的架构,某个应用需要支持商户的大量任意自定义域名,咋整呢?咱公司k8s上的应用遇到这个场景,因此研究了下,有以下两种方案:
方案1, 最直接粗暴但很lowB的方案,ingress中列出每个域名
# more ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: zhanghao-custom
annotations:
kubernetes.io/ingress.class: traefik
spec:
rules:
- host: aa.xx.com
http:
paths:
- path: /service
backend:
serviceName: zhanghao-gateway-www
servicePort: http
- path: /
backend:
serviceName: zhanghao-web
servicePort: http
- host: bb.yy.com
http:
paths:
- path: /service
backend:
serviceName: zhanghao-gateway-www
servicePort: http
- path: /
backend:
serviceName: zhanghao-web
servicePort: http
每次新增域名,都要修改ingress,不能接受。
方法2:traefik新增entryPoint,ingress对该entryPoint下的请求通配
nginx控制非自定义域名走traefik_normal,自定义域名走zhanghao_custom
upstream traefik_normal {
server traefik_server1:80;
server traefik_server2:80;
}
upstream zhanghao_custom {
server traefik_server1:81;
server traefik_server2:81;
}
traefik默认所有请求是走entryPoints: http(80端口),为自定义域名新增一个entryPoints: zhanghao-custom(81端口)
# more traefik.toml
defaultEntryPoints = ["http"]
[entryPoints]
[entryPoints.http]
address = ":80"
[entryPoints.zhanghao-custom]
address = ":81"
ingress通过注解设置自定义域名走entryPoints: zhanghao-custom(81端口);不指定host,接受所有域名的请求;
增加自定义域名不需要动配置,一劳永逸
# more ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: zhanghao-custom
annotations:
kubernetes.io/ingress.class: traefik
traefik.ingress.kubernetes.io/frontend-entry-points: zhanghao-custom
spec:
rules:
- http:
paths:
- path: /service
backend:
serviceName: zhanghao-gateway-www
servicePort: http
- path: /
backend:
serviceName: zhanghao-web
servicePort: http
traefik效果如下:
over!