Kubernetes on k3s 无法解析自定义 DNS 服务器(fritz.box with dnsmasq)

71次阅读
没有评论

问题描述

在使用 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 服务器的方法。希望对你有帮助!

正文完