Kubernetes 集群中没有传出网络连接

No outgoing network connection in Kubernetes cluster

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

现在,问题是由于某些原因 pods 不允许工作人员建立出站连接。当我 shell exec 进入 pod 时,我无法卷曲,也无法 ping,即使这样网络似乎在 pod 内配置得很好。我试图检查 calico 配置,但它非常混乱,我不知道它怎么会出错。是否有任何默认 calico/k8s 设置禁止从其节点传出连接?或者也许有人遇到过类似的问题?

我会按需提供日志输出,因为我不确定哪些信息对检查此问题很有价值。

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

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

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

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

    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 现在应该可以使用了