问题描述
在使用 k3s 上的 Kubernetes 时遇到了一个问题。他在 192.168.0.19 上运行了一个自定义域名服务器,用于解析 .fritz.box 等自定义域名。他在单节点集群上安装了 Rancher,并使用以下命令将其安装在 server2.fritz.box 子域名上:
helm install rancher-latest/rancher \
--name rancher \
--namespace cattle-system \
--set hostname=server2.fritz.box
Rancher 显示一些服务不可用,并且来自 cattle 的日志显示 server2.fritz.box 不可用。由于 Kubernetes 有自己的 DNS 系统,用户查看了文档,并发现需要设置 .19 的 DNS 服务器,以便 Kubernetes 知道如何解析 .fritz.box 域名。类似的问题也在一些其他问题中出现,例如:https://stackoverflow.com/questions/41448095/kube-dns-does-not-resolve-external-hosts-on-kubeadm-bare-metal-cluster
用户创建了以下 YAML 文件:
# https://github.com/kubernetes/kops/issues/4986
apiVersion: v1
kind: ConfigMap
metadata:
name: kube-dns
namespace: kube-system
data:
stubDomains: |
{"fritz.box": ["192.168.0.19"]}
upstreamNameservers: |
["192.168.0.19"]
并使用 kubectl apply -f dns.yml
加载了该文件。然后创建了一个 busybox 测试 Pod:
~$ kubectl exec -it busybox -- ping server2.fritz.box
ping: bad address 'server2.fritz.box'
为什么这个方法不起作用?在 Kubernetes 中解析自定义 DNS 服务器需要做什么?
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
根据 ibuildthecloud 的提示,我们可以通过修改 coredns
的 ConfigMap 来解决这个问题。首先,我们需要找到 coredns
的 ConfigMap,并修改其中的 Corefile
配置文件。
以下是手动修改 coredns
的步骤:
1. 使用命令 kubectl edit cm -n kube-system coredns
打开 coredns
的 ConfigMap。
2. 将 proxy . 1.1.1.1
替换为你的 DNS 服务器地址(在本例中为 192.168.0.19)。
3. 保存并关闭编辑器。
如果你想自动化这个过程,可以使用以下命令:
kubectl get cm -n kube-system coredns -o yaml | sed "s/proxy . 1.1.1.1/proxy . 192.168.0.19/g" > coredns-fixed.yml
kubectl apply -f coredns-fixed.yml
方案2
根据 k3s 的 GitHub 问题,这可能是 k3s 的一个当前 bug,上游 DNS 地址被硬编码为 1.1.1.1。这个问题可能会很快得到解决。
测试
为了测试解决方案是否生效,可以创建一个 busybox Pod,并尝试使用你的 DNS 解析一个主机。以下是一个示例 YAML 文件:
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
containers:
- image: busybox
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
name: busybox
restartPolicy: Always
使用以下命令创建 Pod:
kubectl create -f busybox.yml
然后尝试使用以下命令 ping 一个由你的 DNS 解析的主机:
~$ kubectl exec -it busybox -- ping -c1 server2.fritz.box
PING server2.fritz.box (192.168.0.37): 56 data bytes
64 bytes from 192.168.0.37: seq=0 ttl=61 time=0.386 ms
在应用我们的 DNS 之前(使用 1.1.1.1),这将会抛出解析错误:
~$ kubectl exec -it busybox -- ping -c1 server2.fritz.box
ping: bad address 'server2.fritz.box'
以上是解决在 k3s 上无法解析自定义 DNS 服务器的方法。希望对你有帮助!