1. 前言
本文记录Ingress的常用配置,备忘。
关于Ingress更基础的内容,请参考《K8S中安装使用Ingress》
2. 支持websocket
推荐方法:
1 | apiVersion: networking.k8s.io/v1 |
参考文档:
- ingress-nginx Websockets
- ingress-nginx Annotations
- Advanced Configuration with Annotations
- WebSocket support
历史方法:
1 | apiVersion: networking.k8s.io/v1 |
3. 域名证书配置
3.1. 普通域名配置证书
1、创建secret
1 | kubectl create secret tls cert \ |
secret.yaml 结构如下:
1 | apiVersion: v1 |
其中,tls.crt是base64加密后的证书,tls.key是base64加密后的key。
2、ingress添加tls定义
1 | spec: |
3.2. 泛域名配置证书
泛域名的证书配置方法,和普通域名的证书配置方法完全一致。
1 | spec: |
参考文档:
3.3. 多个域名配置泛域名证书
多个域名使用同一个泛域名证书,建议集中配置泛域名证书。
1、域名证书配置
1 | spec: |
2、路由配置
1 | spec: |
3.4. 批量修改域名证书
已知条件:
- k8s集群中,使用ingress配置了很多四级域名,例如 test0.intl.voidking.com 和 test1.intl.voidking.com
- 除了四级域名,还有五级域名,例如 web.core.intl.voidking.com 和 api.core.intl.voidking.com
- 每个域名都有一个自己的ingress配置文件,包含tls配置
- ingress位于不同的namespace
需求:*.intl.voidking.com
域名证书过期,需要批量修改k8s中对应的四级域名证书,不要影响五级域名证书。
脚本实现:patch-ingress-tls
4. 前后端分离
需求描述:前端后端是两个服务,位于两个namespace,要配置ingress,使发往路由/
的流量打到前端服务,发往/api
的流量打到后端服务。
方法一:
在一个namespace中,创建一个ingress和一个externalname类型的service。在ingress中配置两个path。
方法二:
在两个namespace中,分别创建一个ingress。host相同,配置不同的path,ingress-controller会自动合并这两个配置。
5. 设置max_client_body_size
ingress-nginx-controller有一个全局配置文件(configmap),类似于nginx中的nginx.conf,通过它可以配置一些通用配置,例如max_client_body_size。
1、编辑配置文件
1 | kubectl edit cm ingress-nginx-controller -n ingress-nginx |
修改data部分的配置:
1 | data: |
2、重启ingress-nginx-controller
1 | kubectl rollout restart deployment ingress-nginx-controller -n ingress-nginx |
6. 修改日志格式
1、编辑配置文件
1 | kubectl edit cm ingress-nginx-controller -n ingress-nginx |
修改data部分的配置:
1 | data: |
这里的日志格式参考《Nginx入门篇》
2、重启ingress-nginx-controller
1 | kubectl rollout restart deployment ingress-nginx-controller -n ingress-nginx |
7. 路径重写
参考文档:
- How to proxy_pass with nginx-ingress?
- ingress-resources/rewrites
- Advanced Configuration with Annotations
需求:发往 /api/*
的流量,变成 /*
转发到 api-service ;发往 /cms/*
的流量,变成 /*
转发到 cms-service;其余流量发往 frontend-service。
配置方法:
1 | apiVersion: networking.k8s.io/v1 |
其中,path中的(.*)
是第一个匹配,与rewrite-target中的$1
对应。
需求:发往 /api/*
的流量,变成 /api/v1/*
转发到 api-service ;发往 /api-v2/*
的流量,变成 /api/v2/*
转发到 api-service。
配置方法:
1 | apiVersion: networking.k8s.io/v1 |
需求:发往 /tea/*
的流量,变成 /*
转发到 tea-svc ;发往 /coffee/*
的流量,变成 /beans/*
转发到 api-service。
配置方法:
1 | apiVersion: networking.k8s.io/v1 |
8. 域名重定向
需求:访问 voidking.com
域名的请求,自动跳转到 www.voidking.com
。
配置方法:
1 | kind: Ingress |
注意:这里的 pathType 需要配置为 ImplementationSpecific
,不能配置为 Prefix
。否则,哪怕配置了 nginx.ingress.kubernetes.io/force-ssl-redirect
,跳转前的voidking.com
也是需要配置证书的。
其实,更简单的方法是使用dnspod的显性URL
记录类型解析。但是,并不是所有的DNS服务器都支持这种显性URL
记录类型,所以很多情况下还是需要用到ingress的域名重定向。
参考文档:Ingress-Nginx Controller Rewrite
9. 404重定向到首页
需求:访问URL test.voidking.com/x/y/z
时,如果路径不存在出现404,那么自定义404页面或者跳转到首页。
配置方法:开启custom-http-errors,创建一个自定义backend,出现404等错误时都重定向到这个backend。
1、创建自定义backend,包括deployment和svc,资源清单为custom-default-backend.yaml
1 | kubectl create -f custom-default-backend.yaml -n ingress-nginx |
2、修改ingress-nginx的配置
1 | kubectl edit cm ingress-nginx-controller -n ingress-nginx |
添加配置:
1 | data: |
3、修改ingress-nginx启动参数
1 | kubectl edit deployment ingress-nginx-controller -n ingress-nginx |
启动命令的参数中添加:
1 | --default-backend-service=ingress-nginx/nginx-errors |
注意这里的 ingress-nginx/nginx-errors
对应的格式为 namespace/name
。
ingress-nginx重启后,报错404时会提示The page you're looking for could not be found.
如果想要自定义404页面,那么可以添加一个configmap.yaml,然后挂载到custom-default-backend.yaml
如果想要404重定向到首页,那么可以在该域名的ingress的annotations配置中,添加配置:
1 | metadata: |
参考文档:Ingress-Nginx Custom Errors
10. 404重定向到不同路径
需求:访问URL test.voidking.com/x/y/z
时,如果路径不存在出现404,那么跳转到 test.voidking.com/x
。其中 x
、y
、z
都代表一个字符串。
结论:单纯使用ingress,是无法实现这个配置的。
对于静态页面,可以借助Nginx进行配置,参考文档:《好好学Nginx:Nginx入门篇》。
对于动态页面,可以在后端服务代码中自行处理404的跳转。
11. 查看最终的nginx配置
我们编写的ingress,实际上最终会生成nginx.conf,可以在ingress-nginx-controller中查看是否符合预期。
1 | kubectl exec -it ingress-nginx-controller-xxx -- /bin/bash |