【问题标题】:kubeadm join times out on non-default NIC/IPkubeadm join 在非默认 NIC/IP 上超时
【发布时间】:2020-08-29 22:50:29
【问题描述】:

我正在尝试在本地配置 K8s 集群,并且服务器正在使用多个 NIC 运行 Fedora CoreOS。

我正在将集群配置为使用非默认 NIC - 使用 2 个接口定义的绑定。所有服务器都可以通过该接口相互访问,并通过 HTTP + HTTPS 连接到互联网。

kubeadm 连接挂起:

I0513 13:24:55.516837   16428 token.go:215] [discovery] Failed to request cluster-info, will try again: Get https://${BOND_IP}:6443/api/v1/namespaces/kube-public/configmaps/cluster-info?timeout=10s: context deadline exceeded (Client.Timeout exceeded while awaiting headers)

相关的 kubeadm init 配置如下所示:

[...]
localAPIEndpoint:
  advertiseAddress: ${BOND_IP}
  bindPort: 6443
nodeRegistration:
  kubeletExtraArgs:
    volume-plugin-dir: "/opt/libexec/kubernetes/kubelet-plugins/volume/exec/"
    runtime-cgroups: "/systemd/system.slice"
    kubelet-cgroups: "/systemd/system.slice"
    node-ip: ${BOND_IP}
  criSocket: /var/run/dockershim.sock
  name: master
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
[...]

正在使用的连接配置如下所示:

apiVersion: kubeadm.k8s.io/v1beta2
kind: JoinConfiguration
discovery:
  bootstrapToken:
    token: ${TOKEN}
    caCertHashes:
    - "${SHA}"
    apiServerEndpoint: "${BOND_IP}:6443"
nodeRegistration:
  kubeletExtraArgs:
    volume-plugin-dir: "/opt/libexec/kubernetes/kubelet-plugins/volume/exec/"
    runtime-cgroups: "/systemd/system.slice"
    kubelet-cgroups: "/systemd/system.slice"

如果我尝试使用默认 eth0 对其进行配置,它可以正常工作。

这不是连接问题。端口测试工作正常:

# nc -s ${BOND_IP_OF_NODE} -zv ${BOND_IP_OF_MASTER} 6443
Ncat: Version 7.80 ( https://nmap.org/ncat )
Ncat: Connected to ${BOND_IP_OF_MASTER}:6443.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.

我怀疑这是由于 kubelet 在 eth0 上监听造成的,如果是这样,我可以将其更改为使用不同的 NIC/IP 吗?

LE:eth0 连接已完全断开(电缆断开、接口断开、连接断开)。 现在,当我们初始化时,如果我们为 kube-api 选择端口 0.0.0.0,它会默认使用我们最初想要的绑定:

kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 0.0.0.0

结果:

[certs] apiserver serving cert is signed for DNS names [emp-prod-nl-hilv-quortex19 kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.0.0.1 ${BOND_IP}]

我什至在 iptables 中添加了 6443 端口以供接受,但它仍然超时.. 我所有的 CALICO pod 都已启动并运行(在 kube-system 命名空间中的所有 pod)

LLE:

我已经测试了 calico 和 weavenet 并且都显示了同样的问题。 api-server 已启动,可以使用 curl 从 master 访问,但从节点超时。

LLLE:

在 kube-api 只是一个 HTTPS 服务器的前提下,我尝试了从节点中进行 kubeadm 连接时无法访问的两个选项:

  1. 在 6443 上运行了一个 python3 简单的 http 服务器,并且可以从节点连接
  2. 运行一个 nginx pod 并将其作为 NodePort 暴露在另一个端口上,并且可以从节点连接

该节点无法访问 6443 上的 api-server 或任何其他端口......

我做错了什么...

【问题讨论】:

  • 你检查过this吗?
  • 不,为了简单起见,我更愿意继续使用 kubeadm 是否有任何配置可以在绑定接口级别应用?我刚刚尝试了 weave-net,它在加入节点时以同样的方式失败
  • 我发送的来自 github 的 OP 正在使用 kubeadm。
  • 我已经对此进行了进一步测试:1. 在 master 上运行了一个 alpine POD 2. 安装了 nc + openssh(POD 可以访问互联网) 3. 执行 sh 进入 POD 并运行 ping, nc + ssh 到节点无法加入集群 结果:alpine POD 通过 PING、NC 和 SSH 到达超时的节点而没有问题。仔细检查了机器上的 ip 路由和绑定配置,一切看起来都完美无瑕....快用完了想法...
  • 我已经使用python http.server和不同的端口进行了测试,包括6443。通常在加入时超时的节点,可以毫无问题地卷曲它如果我卷曲api服务器,它只是超时://

标签: join kubernetes kubeadm nic


【解决方案1】:

原因:

使用的接口在类型为 ACTIVE-ACTIVE 的 BOND 中。这使得 kubeadm 尝试了来自 2 绑定的另一个接口,该接口显然与广告服务器的 IP 不在同一个子网中......

使用 ACTIVE-PASSIVE 成功了,并且能够加入节点。

LE:如果有人知道为什么 kubeadm join 不支持 LACPACTIVE-ACTIVE 键 设置在 FEDORA COREOS强>请在这里指教。否则,如果需要额外的配置,我很想知道我错过了什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 2018-12-10
    • 2012-07-17
    相关资源
    最近更新 更多