【问题标题】:Kubernetes kubeadm init fails due to dial tcp 127.0.0.1:10248: connect: connection refusedKubernetes kubeadm init 由于拨打 tcp 127.0.0.1:10248 失败:连接:连接被拒绝
【发布时间】:2019-07-10 17:08:23
【问题描述】:

我正在尝试在 vSphere 私有云中设置一个非常简单的 2 节点 k8s 1.13.3 集群。这些虚拟机运行的是 Ubuntu 18.04。出于测试目的关闭防火墙。但由于连接被拒绝,初始化失败。除了端口被阻止之外,还有其他可能导致此问题的原因吗?我是 k8s 的新手,正在努力解决所有这些问题。

我已经在 /etc/kubernetes/ 中放置了一个 vsphere.conf,如本要点所示。 https://gist.github.com/spstratis/0395073ac3ba6dc24349582b43894a77

我还创建了一个配置文件,当我运行kubeadm init 时指向它。这是它的内容示例。 https://gist.github.com/spstratis/086f08a1a4033138a0c42f80aef5ab40

当我跑步时 sudo kubeadm init --config /etc/kubernetes/kubeadminitmaster.yaml 它超时并出现以下错误。

[kubelet-check] Initial timeout of 40s passed.
[kubelet-check] It seems like the kubelet isn't running or healthy.
[kubelet-check] The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get http://localhost:10248/healthz: dial tcp 127.0.0.1:10248: connect: connection refused.

检查 sudo systemctl status kubelet 显示 kubelet 正在运行。我暂时关闭了我的主 VM 上的防火墙以进行测试,以便我可以验证集群将自行引导。

   Loaded: loaded (/lib/systemd/system/kubelet.service; enabled; vendor preset: enabled)
  Drop-In: /etc/systemd/system/kubelet.service.d
           └─10-kubeadm.conf
   Active: active (running) since Sat 2019-02-16 18:09:58 UTC; 24s ago
     Docs: https://kubernetes.io/docs/home/
 Main PID: 16471 (kubelet)
    Tasks: 18 (limit: 4704)
   CGroup: /system.slice/kubelet.service
           └─16471 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml --cloud-config=/etc/kubernetes/vsphere.conf --cloud-provider=vsphere --cgroup-driver=systemd --network-plugin=cni --pod-i

下面是一些额外的日志,显示与https://192.168.0.12:6443/ 的连接被拒绝。所有这些似乎都导致 kubelet 失败并阻止 init 进程完成。

    Feb 16 18:10:22 k8s-master-1 kubelet[16471]: E0216 18:10:22.633721   16471 kubelet.go:2266] node "k8s-master-1" not found
    Feb 16 18:10:22 k8s-master-1 kubelet[16471]: E0216 18:10:22.668213   16471 reflector.go:134] k8s.io/kubernetes/pkg/kubelet/kubelet.go:453: Failed to list *v1.Node: Get https://192.168.0.12:6443/api/v1/nodes?fieldSelector=metadata.name%3Dk8s-master-1&limit=500&resourceVersion=0: dial tcp 192.168.0.1
Feb 16 18:10:22 k8s-master-1 kubelet[16471]: E0216 18:10:22.669283   16471 reflector.go:134] k8s.io/kubernetes/pkg/kubelet/kubelet.go:444: Failed to list *v1.Service: Get https://192.168.0.12:6443/api/v1/services?limit=500&resourceVersion=0: dial tcp 192.168.0.12:6443: connect: connection refused
    Feb 16 18:10:22 k8s-master-1 kubelet[16471]: E0216 18:10:22.670479   16471 reflector.go:134] k8s.io/kubernetes/pkg/kubelet/config/apiserver.go:47: Failed to list *v1.Pod: Get https://192.168.0.12:6443/api/v1/pods?fieldSelector=spec.nodeName%3Dk8s-master-1&limit=500&resourceVersion=0: dial tcp 192.1
    Feb 16 18:10:22 k8s-master-1 kubelet[16471]: E0216 18:10:22.734005   16471 kubelet.go:2266] node "k8s-master-1" not found

【问题讨论】:

    标签: kubernetes vsphere kubeadm


    【解决方案1】:

    为了解决错误(dial tcp 127.0.0.1:10248: connect: connection denied.),运行以下命令:

    sudo mkdir /etc/docker
    cat <<EOF | sudo tee /etc/docker/daemon.json
    {
      "exec-opts": ["native.cgroupdriver=systemd"],
      "log-driver": "json-file",
      "log-opts": {
        "max-size": "100m"
      },
      "storage-driver": "overlay2"
    }
    EOF
    sudo systemctl enable docker
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    sudo kubeadm reset
    sudo kubeadm init
    

    如果在配置工作节点时出现相同的错误,请使用相同的命令。

    【讨论】:

    • 您能否提供关于这些命令的什么功能的补充说明?这将帮助未来的读者了解如何解决相似(但不是相同)问题。如果读者首先了解自己的工作,它还可以帮助读者在他们的系统上更轻松地执行这些操作。
    【解决方案2】:

    您不能使用 bootstrap-kubeconfig 来初始化 master 的 kubelet,因为 - 正如您所遇到的那样 - 它没有 api 服务器可以联系以生成其私钥和证书。第 22 条军规。我有 80% 的把握从 kubelet 参数中删除 --bootstrap-kubeconfig 将有助于这种情况。我期望 kubelet 已经在/var/lib/kubelet/pki 中拥有它的密钥和证书,所以这也可能值得检查。

    另外,假设您使用/etc/kubernetes/manifests 目录来运行apiserver 和controllermanager,请确保/var/lib/kubelet/config.yaml 中的staticPodPath: 指向正确的目录。这不太可能是问题,但检查起来非常便宜。

    【讨论】:

    • 感谢您的回答,我验证了 kubelet 的证书和密钥实际上在 PKI 文件夹中。老实说,当您说我不能使用 bootstrap-kubeconfig 时,我不确定您的意思。在这一点上,我所做的只是将我提到的配置文件放在他们的文件夹中,然后在 master 上运行 kubeadm init 命令。在此之前我还应该做些什么吗?我对 k8s 真的很陌生,并且正在遵循指南。
    • 跟进,我还检查了/var/lib/kubelet/config.yaml,发现它不包含staticPodPath 属性。
    • 为什么我不能使用 bootstrap-kubeconfig 因为该机制是为(正负)裸机部署而设计的,例如在 AWS 中使用自动缩放组(或其 GCP 等效项)- 仅使用 kubeletkubeadm 二进制文件,您可以通过联系 API 获取集群配置,将一台空机器加入集群,然后使用引导令牌进行足够长的身份验证以从 API 请求证书对。这就是“bootstrap-kubeconfig”部分:使用令牌进行身份验证,然后从中生成真正的kubelet.conf。但是,没有 API 服务器,没有引导过程
    • 那么我应该从我的初始化命令中删除--config /etc/kubernetes/kubeadminitmaster.yaml 吗?
    • kubelet 似乎无法启动它需要的任何容器。
    猜你喜欢
    • 2018-12-26
    • 1970-01-01
    • 2020-02-21
    • 2019-12-12
    • 2019-02-07
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    相关资源
    最近更新 更多