0

我已经构建了具有 3 个工作节点和一个管理节点的集群。工作节点部署并设置了 kube-dns 和 calica。每台机器都有自己的外部 IP 和关联的 DNS。我成功运行了 nginx-ingress-controller 并且它的默认 404-endpoint 可以从外部访问。

现在,问题是由于某种原因不允许工作人员中的 pod 建立出站连接。当我将 exec 放入 pod 时,我无法 curl 也无法 ping,即使网络似乎在 pod 内配置得很好。我试图检查 calico 配置,但它非常混乱,我不知道它怎么可能是错误的。是否有任何默认的 calico/k8s 设置禁止从其节点传出连接?或者也许有人面临类似的问题?

我将按需提供日志输出,因为我不确定在检查这个问题时哪些信息是宝贵的。

4

1 回答 1

2

感谢评论,经过几个小时的排查,终于发现问题出在kube-dns配置错误。当您部署 kube-dns 时,它会自动从您的机器 /etc/resolv.conf 导入名称服务器列表。它工作得很好,除非您安装了带有 systemd-resolve DNS 服务器的 ubuntu(并且默认情况下已安装)。它作为代理 DNS 服务器工作,地址为 127.0.0.53,并且无法从 pod 内部访问。这就是为什么即使在 kube-dns 安装并激活之后 DNS 名称服务器也无法访问的原因。

我使用的此问题的解决方法如下:

  1. 检查您的机器使用的名称服务器是什么 - 对我来说它位于 /run/systemd/resolve/resolv.conf

  2. 创建新的 ConfigMap 替换 kube-dns 的默认配置,填写如下:

    apiVersion: v1
    kind: ConfigMap
    metadata:
      labels:
        addonmanager.kubernetes.io/mode: EnsureExists
      name: kube-dns
      namespace: kube-system
    data:
      upstreamNameservers: |
        ["Your nameserver address"]
    
  3. 重新部署 kube-dns。您正确的 DNS 现在应该可以工作了

于 2018-08-10T18:20:25.087 回答