k8s通过coredns配置cname

前言

开发在需要在本地启动测试环境配置,所以配置文件数据库链接为外网地址,而集群内无法通过外网连接数据库

所以通过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

image-20210513212457778
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
}

效果

image-20210513213807440

这样,就实现外网域名转为内网了

解析为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
}