【问题标题】:kube-dns getsockopt no route to hostkube-dns getsockopt 没有路由到主机
【发布时间】:2018-10-04 21:57:14
【问题描述】:

我很难理解如何在 kubernetes 1.10 上使用 flannel 正确配置 kube-dns,并将 containerd 作为 CRI。

kube-dns 运行失败,报错:

kubectl -n kube-system logs kube-dns-595fdb6c46-9tvn9 -c kubedns
I0424 14:56:34.944476       1 dns.go:219] Waiting for [endpoints services] to be initialized from apiserver...
I0424 14:56:35.444469       1 dns.go:219] Waiting for [endpoints services] to be initialized from apiserver...
E0424 14:56:35.815863       1 reflector.go:201] k8s.io/dns/pkg/dns/dns.go:192: Failed to list *v1.Service: Get https://10.96.0.1:443/api/v1/services?resourceVersion=0: dial tcp 10.96.0.1:443: getsockopt: no route to host
E0424 14:56:35.815863       1 reflector.go:201] k8s.io/dns/pkg/dns/dns.go:189: Failed to list *v1.Endpoints: Get https://10.96.0.1:443/api/v1/endpoints?resourceVersion=0: dial tcp 10.96.0.1:443: getsockopt: no route to host
I0424 14:56:35.944444       1 dns.go:219] Waiting for [endpoints services] to be initialized from apiserver...
I0424 14:56:36.444462       1 dns.go:219] Waiting for [endpoints services] to be initialized from apiserver...
I0424 14:56:36.944507       1 dns.go:219] Waiting for [endpoints services] to be initialized from apiserver...
F0424 14:56:37.444434       1 dns.go:209] Timeout waiting for initialization

kubectl -n kube-system describe pod kube-dns-595fdb6c46-9tvn9
  Type     Reason     Age                 From              Message
  ----     ------     ----                ----              -------
  Warning  Unhealthy  47m (x181 over 3h)  kubelet, worker1  Readiness probe failed: Get http://10.244.0.2:8081/readiness: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
  Warning  BackOff    27m (x519 over 3h)  kubelet, worker1  Back-off restarting failed container
  Normal   Killing    17m (x44 over 3h)   kubelet, worker1  Killing container with id containerd://dnsmasq:Container failed liveness probe.. Container will be killed and recreated.
  Warning  Unhealthy  12m (x178 over 3h)  kubelet, worker1  Liveness probe failed: Get http://10.244.0.2:10054/metrics: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
  Warning  BackOff    2m (x855 over 3h)   kubelet, worker1  Back-off restarting failed container

确实没有到 10.96.0.1 端点的路由:

ip route
default via 10.240.0.254 dev ens160 
10.240.0.0/24 dev ens160  proto kernel  scope link  src 10.240.0.21 
10.244.0.0/24 via 10.244.0.0 dev flannel.1 onlink 
10.244.0.0/16 dev cni0  proto kernel  scope link  src 10.244.0.1 
10.244.1.0/24 via 10.244.1.0 dev flannel.1 onlink 
10.244.2.0/24 via 10.244.2.0 dev flannel.1 onlink 
10.244.4.0/24 via 10.244.4.0 dev flannel.1 onlink 
10.244.5.0/24 via 10.244.5.0 dev flannel.1 onlink

什么负责配置集群服务地址范围和关联路由?是容器运行时、覆盖网络(在本例中为 flannel)还是其他什么?应该在哪里配置?

10-containerd-net.conflist 配置主机和我的 pod 网络之间的桥接。这里也可以配置服务网络吗?

cat /etc/cni/net.d/10-containerd-net.conflist 
{
  "cniVersion": "0.3.1",
  "name": "containerd-net",
  "plugins": [
    {
      "type": "bridge",
      "bridge": "cni0",
      "isGateway": true,
      "ipMasq": true,
      "promiscMode": true,
      "ipam": {
        "type": "host-local",
        "subnet": "10.244.0.0/16",
        "routes": [
          { "dst": "0.0.0.0/0" }
        ]
      }
    },
    {
      "type": "portmap",
      "capabilities": {"portMappings": true}
    }
  ]
}

编辑:

从 2016 年开始遇到 this

几周前(我忘记了发布,但它是 1.2.x,其中 x != 0) (#24429) 我们修复了路由,以便任何到达的流量 在一个以服务 IP 为目的地的节点上,将被当作它来到一个 节点端口。这意味着您应该能够为 您的服务集群 IP 范围为一个或多个节点,这些节点将 充当桥梁。这是大多数人用法兰绒做的同样的把戏 桥接覆盖。

它不完美,但它有效。未来将需要获得更多 如果您想要最佳行为(即不丢失 客户端 IP),否则我们将看到更多的非 kube-proxy 实现 服务。

这仍然相关吗?我需要为服务 CIDR 设置静态路由吗?或者问题实际上是 kube-proxy 而不是 flannel 或 containerd?

我的法兰绒配置:

cat /etc/cni/net.d/10-flannel.conflist 
{
  "name": "cbr0",
  "plugins": [
    {
      "type": "flannel",
      "delegate": {
        "hairpinMode": true,
        "isDefaultGateway": true
      }
    },
    {
      "type": "portmap",
      "capabilities": {
        "portMappings": true
      }
    }
  ]
}

还有 kube-proxy:

[Unit]
Description=Kubernetes Kube Proxy
Documentation=https://github.com/kubernetes/kubernetes

[Service]
ExecStart=/usr/local/bin/kube-proxy \
  --cluster-cidr=10.244.0.0/16 \
  --feature-gates=SupportIPVSProxyMode=true \
  --ipvs-min-sync-period=5s \
  --ipvs-sync-period=5s \
  --ipvs-scheduler=rr \
  --kubeconfig=/etc/kubernetes/kube-proxy.conf \
  --logtostderr=true \
  --master=https://192.168.160.1:6443 \
  --proxy-mode=ipvs \
  --v=2
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

编辑:

查看kube-proxy debugging stepskube-proxy 似乎无法联系到主人。我怀疑这是问题的很大一部分。我在 HAProxy 负载均衡器后面有 3 个控制器/主节点,它们绑定到 192.168.160.1:6443 并将循环转发到 10.240.0.1[1|2|3]:6443 上的每个主节点。这可以在上面的输出/配置中看到。

kube-proxy.service 中,我指定了--master=192.168.160.1:6443。为什么尝试连接到端口 443?我可以改变这个 - 似乎没有端口标志吗?是否因为某种原因需要使用 443 端口?

【问题讨论】:

    标签: kubernetes flannel kube-dns kube-proxy containerd


    【解决方案1】:

    这个答案有两个组成部分,一个是关于运行 kube-proxy,另一个是关于那些 :443 URL 的来源。

    首先,关于kube-proxy:请不要将kube-proxy 作为这样的systemd 服务运行。它被设计为由kubelet 在集群中 启动,因此 SDN 地址的行为合理,因为它们实际上是“假”地址。通过在kubelet 的控制之外运行kube-proxy,除非您花费大量精力来复制kubelet 配置其从属docker 容器的方式,否则各种奇怪的事情都会发生。


    现在,关于 :443 URL:

    E0424 14:56:35.815863 1 reflector.go:201] k8s.io/dns/pkg/dns/dns.go:192: Failed to list *v1.Service: Get https://10.96.0.1:443/api/v1/services?resourceVersion=0: dial tcp 10.96.0.1:443: getsockopt: no route to host

    ...

    为什么要尝试连接到端口 443?我可以改变这个 - 似乎没有端口标志吗?是否因为某种原因需要使用 443 端口?

    10.96.0.1 来自集群的 Service CIDR,它(并且应该)与 Pod CIDR 分开,Pod CIDR 应该与节点的子网分开,等等。集群的 Service CIDR 的 .1 是保留(或传统上分配)给kubernetes.default.svc.cluster.localService,其中一个Service.port443

    我不太确定为什么 --master 标志不会取代 /etc/kubernetes/kube-proxy.conf 中的值,但由于该文件很明显只应该由 kube-proxy 使用,为什么不直接更新文件以消除所有疑虑?

    【讨论】:

    • You will run docker, kubelet, and kube-proxy outside of a container, the same way you would run any system daemon, so you just need the bare binaries。我认为这不再正确?哪些服务应该作为 systemd 服务运行,哪些作为 pod 运行?嗯,公平的。我必须弄清楚如何将主信息添加到 kubeconfig - 一切都是 cli 标志(可能是作为 systemd 服务鼓励的)。
    • 我不知道那段,也无法理解他们为什么要写这样的东西——除非一个集群运行没有覆盖网络(SDN) ,在这种情况下,是的,我怀疑它的重要性要小得多。此时,我建议尝试kubelet的方式,如果运行kube-proxy extra-cluster 对您很重要,请在您有更多经验后再转回
    • 我已经完成了这项工作,但现在出现了kubelet does not have ClusterDNS IP configured and cannot create Pod using "ClusterFirst" policy. Falling back to "Default" policy. 的busybox 错误这可能与您的cmets rekube-proxy 有关吗?如果是这样,我会尝试使用 pod 方法。
    • 我的意思是真正的“您考虑过”的方式:您是否考虑过使用 kubespray 之类的工具让集群工作,这样您就可以检查它所采取的步骤以及生成的工作集群,并且 然后尝试从头开始构建一个?因为从锤子和梦想开始是从头开始建造房屋的糟糕方式。
    • 是的,混合了它和 Kubernetes 的艰难方式。
    猜你喜欢
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 2019-03-08
    • 2017-08-03
    • 2019-03-08
    • 1970-01-01
    • 2018-02-07
    相关资源
    最近更新 更多