首页 > 解决方案 > 使用 aws elb 作为控制平面端点时,kubeadm init 失败

问题描述

我正在尝试在 AWS 中配置一个 HA kubernetes 集群,并且我一直没有运气使用 ELB 作为控制平面(现在是一个带有 TLS 侦听器的 NLB,但也尝试过使用 ALB 和 HTTPS)。无论我做什么,它总是在等待控制平面步骤上失败。如果我提高输出的详细程度,我可以看到它在此步骤中每秒卷曲我的负载均衡器端点,4 分钟后它失败了。没有任何迹象表明负载均衡器的响应是什么,这是我看到的输出示例:

curl -k -v -XGET  -H "Accept: application/json, */*" -H "User-Agent: kubeadm/v1.17.3 (linux/amd64) kubernetes/06ad960" 'https://<load-balancer-dns>:443/healthz?timeout=10s'
I0408 13:51:07.899477   27075 round_trippers.go:443] GET https://<load-balancer-dns>:443/healthz?timeout=10s  in 4 milliseconds
I0408 13:51:07.899497   27075 round_trippers.go:449] Response Headers:

(响应标头之后没有任何内容)。

奇怪的是,当 init 运行时,我可以在浏览器中拉起 /healthz 端点,这只会导致页面显示“ok”。我也可以从另一个终端窗口卷曲它,我得到一个 HTTP 200,一切看起来都很好。

更多细节 - 在 init 失败后,没有崩溃的 docker 容器。Kubeadm 建议检查 kubelet 服务状态和日志,我看到这样的行:

E0408 14:50:36.738997   11649 reflector.go:153] k8s.io/client-go/informers/factory.go:135: Failed to list *v1beta1.CSIDriver: Get https://<load-balancer-dns>:443/apis/storage.k8s.io/v1beta1/csidrivers?limit=500&resourceVersion=0: x509: certificate signed by unknown authority

卷曲该地址不会给我任何证书错误,尽管它确实给了我 403。证书应该被信任,因为它的链(我相信)正确导入。所以我不确定为什么 kubelet 会抱怨它。

这个问题似乎与我正在使用的 --control-plane-endpoint 标志有关。如果我只是让它默认为单个实例的 IPkubeadm init将成功完成并且集群已初始化,我可以将工作人员加入其中,等等。

FWIW,我的 init 命令如下所示:

kubeadm init --control-plane-endpoint "<load-balancer-dns>:<port>" --ignore-preflight-errors=ImagePull --apiserver-bind-port=30400 --v=10

我可以检查什么来尝试准确地确定问题所在?

标签: kuberneteskubeadmkubelet

解决方案


我在这里回答了一个类似的问题:https ://stackoverflow.com/a/70799078/9284676

在 HA 主场景中为您使用 ELB 时--control-plane-endpoint,您需要创建Target Groupusing 类型IP addresses而不是Instances. 该文本在创建目标组时很有帮助:

“促进路由到同一实例上的多个 IP 地址和网络接口。”

然后我能够使用此设置成功地初始化我的集群:

kubeadm init --control-plane-endpoint "<myELBname>:6443" --upload-certs

推荐阅读