问题描述
我使用 calico 设置了一个 Kubernetes 集群。 设置很“简单”
- 1x master(本地网络,可以)
- 1x 节点(本地网络,没问题)
- 1x 节点(云服务器,不行)
所有带有 docker 19.03 的 debian buster
在云服务器上,calico pods 没有出现:
calico-kube-controllers-token-x:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
normal SandBoxChanged 47m (x50 over 72m) kubelet Pod sandBox changed,it will be killed and re-created.
Warning FailedMount 43m kubelet MountVolume.SetUp Failed for volume "calico-kube-controllers-token-x" : Failed to sync secret cache: timed out waiting for the condition
normal SandBoxChanged 3m41s (x78 over 43m) kubelet Pod sandBox changed,it will be killed and re-created.
calico-node-x:
Warning Unhealthy 43m (x5 over 43m) kubelet Liveness probe Failed: calico/node is not ready: Felix is not live: Get "http://localhost:9099/liveness": dial tcp [::1]:9099: connect: connection refused
Warning Unhealthy 14m (x77 over 43m) kubelet Readiness probe Failed: calico/node is not ready: BIRD is not ready: Error querying BIRD: unable to connect to BIRDv4 socket: dial unix /var/run/bird/bird.ctl: connect: no such file or directory
Warning BackOff 4m26s (x115 over 39m) kubelet Back-off restarting Failed container
我的猜测是 IP/网络配置有问题,但没有弄清楚是哪个。
- 需要的端口(k8s&BGP)从路由器转发,也试过master直连互联网
- --control-plane-endpoint 是一个主机名,可公开解析
- Calico 正在使用 BGP 对等(使用公共 IP 作为对等)
这个条目确实让我最担心:
- 显示本地ip:kubectl get --raw /api
我想办法把这个改成master的公网IP,没有成功。
有人知道下一步要尝试什么吗?
解决方法
经过额外的分析,问题恰好是分布式 api ip 地址是本地地址,而不是 dns-name。
创建了一个从云节点到本地master的带有wireguard的vpn,所以从云节点可以访问到master的本地ip。
不知道这是否是最干净的解决方案,但它有效。