kubeadm 加入非默认超时 NIC/IP
kubeadm join times out on non-default NIC/IP
我正在尝试在本地配置 K8s 集群,服务器是 运行 Fedora CoreOS 使用多个 NIC。
我正在将集群配置为使用非默认 NIC - 一个由 2 个接口定义的绑定。所有服务器都可以通过该接口相互访问,并通过 HTTP + HTTPS 连接到互联网。
kubeadm join 挂起于:
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 pods 都已启动并且 运行(所有 pods 都在kube 系统命名空间)
LLE:
我测试过 calico 和 weavenet,两者都显示相同的问题。 api-服务器已启动,可以使用 curl 从主服务器访问,但它从节点超时。
LLLE:
在kube-api只是一个HTTPS服务器的前提下,我尝试了两个在kubeadm join时无法访问的节点选项:
- 运行 一个 python3 超过 6443 的简单 http 服务器并且能够从节点
连接
- 运行 一个 nginx pod 并将其作为 NodePort 暴露在另一个端口上并且能够从节点连接
节点无法到达 6443 上的 api 服务器或任何其他端口....
我做错了什么...
原因:
使用的接口是 ACTIVE-ACTIVE 类型的 BOND。这使得 kubeadm 尝试了来自 2 bonded 的另一个接口,它显然与广告服务器的 IP 不在同一个子网中......
使用 ACTIVE-PASSIVE 成功了并且能够加入节点。
LE:如果有人知道为什么 kubeadm join 不支持 LACP with ACTIVE-ACTIVE bond 在 FEDORA COREOS 上的设置请在此处提供建议。否则,如果需要额外的配置,我很想知道我错过了什么。
我正在尝试在本地配置 K8s 集群,服务器是 运行 Fedora CoreOS 使用多个 NIC。
我正在将集群配置为使用非默认 NIC - 一个由 2 个接口定义的绑定。所有服务器都可以通过该接口相互访问,并通过 HTTP + HTTPS 连接到互联网。
kubeadm join 挂起于:
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 pods 都已启动并且 运行(所有 pods 都在kube 系统命名空间)
LLE:
我测试过 calico 和 weavenet,两者都显示相同的问题。 api-服务器已启动,可以使用 curl 从主服务器访问,但它从节点超时。
LLLE:
在kube-api只是一个HTTPS服务器的前提下,我尝试了两个在kubeadm join时无法访问的节点选项:
- 运行 一个 python3 超过 6443 的简单 http 服务器并且能够从节点 连接
- 运行 一个 nginx pod 并将其作为 NodePort 暴露在另一个端口上并且能够从节点连接
节点无法到达 6443 上的 api 服务器或任何其他端口....
我做错了什么...
原因:
使用的接口是 ACTIVE-ACTIVE 类型的 BOND。这使得 kubeadm 尝试了来自 2 bonded 的另一个接口,它显然与广告服务器的 IP 不在同一个子网中......
使用 ACTIVE-PASSIVE 成功了并且能够加入节点。
LE:如果有人知道为什么 kubeadm join 不支持 LACP with ACTIVE-ACTIVE bond 在 FEDORA COREOS 上的设置请在此处提供建议。否则,如果需要额外的配置,我很想知道我错过了什么。