Blocked Kubernetes DNS queries when working on a VPN
If you’re using a full-traffic VPN on your development machine, are using Kubernetes (or k3d
, k3s
and such) and Go language, you might
have seen that some proxy.golang.org
requests are blocked when building your image and executing go get
.
TLDR; patch coredns
’s ConfigMap
to use DoT (DNS over TLS) instead of its own resolv.conf
.
coredns.yaml
- op: replace
path: "/data/Corefile"
value: |
.: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 . tls://1.1.1.1 tls://1.0.0.1 {
tls_servername cloudflare-dns.com
health_check 5s
}
cache 30
loop
reload
loadbalance
}
patch-coredns.sh
#!/bin/bash
KUBECONFIG= kubectl patch cm -n kube-system coredns --patch-file ~/path/to/coredns.yaml --type json
KUBECONFIG= kubectl -n kube-system rollout restart deployment coredns
And then start your cluster with
k3d cluster start; ./patch-coredns.sh
A cleaner, more lasting solution would be the get the current ConfigMap
and dynamically make the changes to replace forward . /etc/resolv.conf
with the DoT lines.
NOTE: if the default ConfigMap
changes, you’ll have to reflect the changes in the replaced one.
This solution comes from https://fizdoonk.medium.com/k3d-and-blocked-dns-5331638c98d0, I just made the patch easier to apply.