我正在尝试对 coredns 添加重写,以将域指向集群负载均衡器(以便对该域的请求重定向回集群)。我似乎找不到影响 k3s coredns 配置的方法。有办法改变吗
(这是为了解决 https://github.com/jetstack/cert-manager/issues/1292#issuecomment-757283796,其中 pod 尝试通过指向路由器的 DNS 名称来联系集群中的另一个服务IP,由于 NAT 的工作原理而失败。)
可以通过添加
CoreDNS
规则将 rewrite
配置为将一个域映射到另一个域。
假设您有域 example.com
并且您希望该域指向 google.com
域。
要在
CoreDNS
中执行此操作,您可以使用 rewrite
插件。
CoreDNS
的配置存储在coredns
命名空间中的ConfigMap
kube-system
中。
您可以使用以下方式编辑它:root@kmaster:~# kubectl edit cm coredns -n kube-system
只需添加一条
rewrite
规则,如下例所示:apiVersion: v1
data:
Corefile: |
.:53 {
errors
health
rewrite name example.com google.com # mapping example.com to google.com
ready
...
接下来您需要重新加载
CoreDNS
,以使用新的配置。您可以删除 coredns Pod
(coredns
部署为 Deployment
,因此将创建新的 Pod
),或者您可以向其发送 SIGUSR1
告诉它重新加载。
最后我们可以检查它是如何工作的:
root@kmaster:~# kubectl run -it --rm --image=infoblox/dnstools:latest dnstools
dnstools# host -t A google.com
google.com has address 172.217.21.238
dnstools# host -t A example.com
example.com has address 172.217.21.238
您可以在Coredns重写文档中找到有关重写插件的更多信息。
正如 Jan W 所说(我经历了惨痛的教训),对 coredns ConfigMap 的任何更改最终都会丢失。
改用 coredns-custom 配置映射:
apiVersion: v1
kind: ConfigMap
metadata:
name: coredns-custom
namespace: kube-system
data:
default.override: |
rewrite name example.com google.com # mapping example.com to google.com
rewrite name regex (.*)\.bar\.com google.com # mapping *.bar.com to google.com
并通过
应用它kubectl apply -f coredns-custom.yml
这些规则将被删除在标准 coredns 配置中指定
import /etc/coredns/custom/*.override
的位置。
.:53 {
errors
health
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
}
hosts /etc/coredns/NodeHosts {
ttl 60
reload 15s
fallthrough
}
prometheus :9153
forward . /etc/resolv.conf
cache 30
loop
reload
loadbalance
import /etc/coredns/custom/*.override
}