前言
开发在需要在本地启动测试环境配置,所以配置文件数据库链接为外网地址,而集群内无法通过外网连接数据库
所以通过coredns将外网域名cname为内网
参考
https://monkeywie.cn/2020/06/28/k8s-coredns-cname/
及 阿里云大佬帮助
coredns 配置
在 coredns 官网查阅资料之后,得知可以使用rewrite插件来实现CNAME
,测试如下:
- 配置
www.baidu.com
CNAME 到www.taobao.com
自建k8s默认配置:
1 2 3 4 5
| .:53 { rewrite name www.baidu.com www.taobao.com forward . 114.114.114.114 reload }
|
阿里云默认配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| .:53 { errors health ready
kubernetes k8s.nbugs in-addr.arpa ip6.arpa {
pods verified fallthrough in-addr.arpa ip6.arpa } autopath @kubernetes #坑,必须把这个删掉 cache 30 prometheus :9153 forward . /etc/resolv.conf loop reload loadbalance }
|
修改配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| .:53 { errors health ready
kubernetes k8s.xxxx in-addr.arpa ip6.arpa {
pods verified fallthrough in-addr.arpa ip6.arpa } rewrite name qa-mysql.outernet.xxxx.com rm-xxxxxx.mysql.rds.aliyuncs.com #将外网域名cname为内网rds域名 autopath @kubernetes #坑,必须把这个删掉 cache 30 prometheus :9153 forward . /etc/resolv.conf loop reload loadbalance }
|
如果使用的是阿里云k8s
此时dig解析能够看到A解析成功,但实际ping和telnet还是外网ip
咨询大佬后得知
ping 的时候请求的其实是 qa-mysql.outernet.xxxx.com.qa.svc.k8s.xxx不是 qa-mysql.outernet.xxxx.com
是因为 pod 里面默认有 search
1 2 3 4 5
| 根据当前的配置,ping 依次按这样的顺序解析 qa-mysql.outernet.xxxx.com.qa.svc.k8s.xxxx qa-mysql.outernet.xxxx.com.svc.k8s.xxxx qa-mysql.outernet.xxxx.com.k8s.xxxx 4. qa-mysql.outernet.nbugs.com.
|
但是 coredns 配置了 autopath 以后,他就会帮你直接把 qa-mysql.outernet.xxxx.com.qa.svc.k8s.xxxx 解析成 qa-mysql.outernet.xxxx.com.
没有经过 rewrite 规则就解析到外部 IP 了
也就是autopath插件处理完后直接从上游dns(forward . /etc/resolv.conf)取到解析
所以要在需要解析的外网域名后添加domain 也就是你pod resolv resolv的domain(有三个,可以通过配置精确到只解析某个命名空间的)
最终配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| .:53 { errors health ready
kubernetes k8s.xxxx in-addr.arpa ip6.arpa {
pods verified fallthrough in-addr.arpa ip6.arpa } rewrite name qa-mysql.outernet.xxxx.com.k8s.xxxx rm-xxxxxx.mysql.rds.aliyuncs.com #将外网域名cname为内网rds域名,这个对应ping rewrite name qa-mysql.outernet.xxxx.com rm-xxxxx.mysql.rds.aliyuncs.com #这个对应dig,这个也可以不加,以防万一还是加上 cache 30 prometheus :9153 forward . /etc/resolv.conf loop reload loadbalance }
|
效果
这样,就实现外网域名转为内网了
解析为svc要写svc的FQDN
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| .:53 { errors health { lameduck 5s } ready kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } prometheus :9153 forward . /etc/resolv.conf { max_concurrent 1000 } cache 30 loop reload loadbalance } # 新加一个生效域 suosi-sit.svc.cluster.local.:53 { #后面.必须加 errors hosts { 127.0.0.1 gitlab.suosihulian.com.suosi-sit.svc.cluster.local # 这里因为是在新的域里,所以必须要带上后缀 fallthrough } rewrite name www.baidu.com.suosi-sit.svc.cluster.local suosi-gateway.suosi-sit.svc.cluster.local # 正常就这么配置,其实可以和成一份配置 health { lameduck 5s } ready kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure fallthrough in-addr.arpa ip6.arpa ttl 30 } prometheus :9153 forward . /etc/resolv.conf { max_concurrent 1000 } cache 30 loop reload loadbalance }
|