加入集群需要永远
Joining cluster takes forever
我已经设置了我的主节点,我正在尝试加入一个工作节点,如下所示:
kubeadm join 192.168.30.1:6443 --token 3czfua.os565d6l3ggpagw7 --discovery-token-ca-cert-hash sha256:3a94ce61080c71d319dbfe3ce69b555027bfe20f4dbe21a9779fd902421b1a63
但是命令在以下状态下永远挂起:
[preflight] Running pre-flight checks
[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
既然这只是一个警告,为什么它实际上失败了?
编辑:我在 /var/log/syslog
中注意到以下内容
Mar 29 15:03:15 ubuntu-xenial kubelet[9626]: F0329 15:03:15.353432 9626 server.go:193] failed to load Kubelet config file /var/lib/kubelet/config.yaml, error failed to read kubelet config file "/var/lib/kubelet/config.yaml", error: open /var/lib/kubelet/config.yaml: no such file or directory
Mar 29 15:03:15 ubuntu-xenial systemd[1]: kubelet.service: Main process exited, code=exited, status=255/n/a
Mar 29 15:03:15 ubuntu-xenial systemd[1]: kubelet.service: Unit entered failed state.
我在 CentOS 7 上确实遇到了同样的错误,但在我的情况下,加入命令没有问题,所以它确实只是一个警告。
> [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker
> cgroup driver. The recommended driver is "systemd". Please follow the
> guide at https://kubernetes.io/docs/setup/cri/ [preflight] Reading
> configuration from the cluster... [preflight] FYI: You can look at
> this config file with 'kubectl -n kube-system get cm kubeadm-config
> -oyaml' [kubelet-start] Downloading configuration for the kubelet from the "kubelet-config-1.14" ConfigMap in the kube-system namespace
如官方文档所述,有两个常见问题导致 init 挂起(我想它也适用于 join 命令):
the default cgroup driver configuration for the kubelet differs from
that used by Docker. Check the system log file (e.g. /var/log/message)
or examine the output from journalctl -u kubelet. If you see something
like the following:
首先尝试 official documentation 中的步骤,如果不起作用,请提供更多信息,以便我们在需要时进一步排除故障。
这个问题与 kubeadm
没有安装开箱即用的网络 CNI 兼容解决方案有关;
因此,如果没有这一步,kubernetes
nodes/master 将无法建立任何形式的通信;
以下任务解决了该问题:
- name: kubernetes.yml --> Install Flannel
shell: kubectl -n kube-system apply -f https://raw.githubusercontent.com/coreos/flannel/bc79dd1505b0c8681ece4de4c0d86c5cd2643275/Documentation/kube-flannel.yml
become: yes
environment:
KUBECONFIG: "/etc/kubernetes/admin.conf"
when: inventory_hostname in (groups['masters'] | last)
我有一堆 k8s 部署脚本最近因同样的错误消息而崩溃...看起来 docker 更改了它的安装。试试这个——
之前的安装:
apt-get isntall docker-ce
更新安装:
apt-get install docker-ce docker-ce-cli containerd.io
首先,如果您想在工作人员加入主服务器时查看更多详细信息,请使用:
kubeadm join 192.168.1.100:6443 --token m3jfbb.wq5m3pt0qo5g3bt9 --discovery-token-ca-cert-hash sha256:d075e5cc111ffd1b97510df9c517c122f1c7edf86b62909446042cc348ef1e0b --v=2
使用上面的命令我可以看到我的工人无法与主人建立连接,所以我只是停止了防火墙:
systemctl stop firewalld
如何创建/var/lib/kubelet/config.yaml?
关于 /var/lib/kubelet/config.yaml: no such file or directory
错误。
为了创建上述文件,工作节点上应执行以下步骤。
1 ) 创建 /var/lib/kubelet/
文件夹。
如前所述安装kubelet服务时创建here:
sudo apt-get update && sudo apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
2 ) 创建config.yaml
。
kubeadm 加入流程应该发生,所以当你 运行 kubeadm join
时,kubeadm 使用 Bootstrap 令牌凭证来执行 TLS bootstrap,它获取凭证需要下载 kubelet-config-1.X
ConfigMap 并将其写入 /var/lib/kubelet/config.yaml
.
成功执行后,您应该会看到以下日志:
.
.
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
.
.
因此,完成这 2 个步骤后,您应该 /var/lib/kubelet/config.yaml
到位了。
kubeadm 加入流程失败
在你的情况下,似乎 kubeadm join flow failed which might happen due to multiple reasons like bad configuration of iptables, ports that are already in use, container runtime not installed properly, etc' - as described here and here.
据我所知,没有网络 CNI-compatible 解决方案这一事实不应影响 /var/lib/kubelet/config.yaml
:
的创建
A) 我们可以在 kubeadm preflight checks 下面看到什么问题会导致加入阶段失败。
B ) 我还通过删除我使用的当前解决方案 (Calico) 和 运行 kubeadm reset
和 kubeadm join
再次测试了这个问题并且 [=22= 中没有出现错误] 日志(我有上面提到的成功执行日志)并且 /var/lib/kubelet/config.yaml
已正确创建。
(*) 当然,集群无法在这种状态下运行 - 我只是想强调,我认为问题出在 A 中提到的选项之一。
这可以通过创建一个新令牌来解决
使用此命令:
kubeadm token create --print-join-command
并使用生成的令牌将其他节点加入集群
我已经设置了我的主节点,我正在尝试加入一个工作节点,如下所示:
kubeadm join 192.168.30.1:6443 --token 3czfua.os565d6l3ggpagw7 --discovery-token-ca-cert-hash sha256:3a94ce61080c71d319dbfe3ce69b555027bfe20f4dbe21a9779fd902421b1a63
但是命令在以下状态下永远挂起:
[preflight] Running pre-flight checks
[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
既然这只是一个警告,为什么它实际上失败了?
编辑:我在 /var/log/syslog
Mar 29 15:03:15 ubuntu-xenial kubelet[9626]: F0329 15:03:15.353432 9626 server.go:193] failed to load Kubelet config file /var/lib/kubelet/config.yaml, error failed to read kubelet config file "/var/lib/kubelet/config.yaml", error: open /var/lib/kubelet/config.yaml: no such file or directory
Mar 29 15:03:15 ubuntu-xenial systemd[1]: kubelet.service: Main process exited, code=exited, status=255/n/a
Mar 29 15:03:15 ubuntu-xenial systemd[1]: kubelet.service: Unit entered failed state.
我在 CentOS 7 上确实遇到了同样的错误,但在我的情况下,加入命令没有问题,所以它确实只是一个警告。
> [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker
> cgroup driver. The recommended driver is "systemd". Please follow the
> guide at https://kubernetes.io/docs/setup/cri/ [preflight] Reading
> configuration from the cluster... [preflight] FYI: You can look at
> this config file with 'kubectl -n kube-system get cm kubeadm-config
> -oyaml' [kubelet-start] Downloading configuration for the kubelet from the "kubelet-config-1.14" ConfigMap in the kube-system namespace
如官方文档所述,有两个常见问题导致 init 挂起(我想它也适用于 join 命令):
the default cgroup driver configuration for the kubelet differs from that used by Docker. Check the system log file (e.g. /var/log/message) or examine the output from journalctl -u kubelet. If you see something like the following:
首先尝试 official documentation 中的步骤,如果不起作用,请提供更多信息,以便我们在需要时进一步排除故障。
这个问题与 kubeadm
没有安装开箱即用的网络 CNI 兼容解决方案有关;
因此,如果没有这一步,kubernetes
nodes/master 将无法建立任何形式的通信;
以下任务解决了该问题:
- name: kubernetes.yml --> Install Flannel
shell: kubectl -n kube-system apply -f https://raw.githubusercontent.com/coreos/flannel/bc79dd1505b0c8681ece4de4c0d86c5cd2643275/Documentation/kube-flannel.yml
become: yes
environment:
KUBECONFIG: "/etc/kubernetes/admin.conf"
when: inventory_hostname in (groups['masters'] | last)
我有一堆 k8s 部署脚本最近因同样的错误消息而崩溃...看起来 docker 更改了它的安装。试试这个——
之前的安装: apt-get isntall docker-ce
更新安装: apt-get install docker-ce docker-ce-cli containerd.io
首先,如果您想在工作人员加入主服务器时查看更多详细信息,请使用:
kubeadm join 192.168.1.100:6443 --token m3jfbb.wq5m3pt0qo5g3bt9 --discovery-token-ca-cert-hash sha256:d075e5cc111ffd1b97510df9c517c122f1c7edf86b62909446042cc348ef1e0b --v=2
使用上面的命令我可以看到我的工人无法与主人建立连接,所以我只是停止了防火墙:
systemctl stop firewalld
如何创建/var/lib/kubelet/config.yaml?
关于 /var/lib/kubelet/config.yaml: no such file or directory
错误。
为了创建上述文件,工作节点上应执行以下步骤。
1 ) 创建 /var/lib/kubelet/
文件夹。
如前所述安装kubelet服务时创建here:
sudo apt-get update && sudo apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
2 ) 创建config.yaml
。
kubeadm 加入流程应该发生,所以当你 运行 kubeadm join
时,kubeadm 使用 Bootstrap 令牌凭证来执行 TLS bootstrap,它获取凭证需要下载 kubelet-config-1.X
ConfigMap 并将其写入 /var/lib/kubelet/config.yaml
.
成功执行后,您应该会看到以下日志:
.
.
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
.
.
因此,完成这 2 个步骤后,您应该 /var/lib/kubelet/config.yaml
到位了。
kubeadm 加入流程失败
在你的情况下,似乎 kubeadm join flow failed which might happen due to multiple reasons like bad configuration of iptables, ports that are already in use, container runtime not installed properly, etc' - as described here and here.
据我所知,没有网络 CNI-compatible 解决方案这一事实不应影响 /var/lib/kubelet/config.yaml
:
A) 我们可以在 kubeadm preflight checks 下面看到什么问题会导致加入阶段失败。
B ) 我还通过删除我使用的当前解决方案 (Calico) 和 运行 kubeadm reset
和 kubeadm join
再次测试了这个问题并且 [=22= 中没有出现错误] 日志(我有上面提到的成功执行日志)并且 /var/lib/kubelet/config.yaml
已正确创建。
(*) 当然,集群无法在这种状态下运行 - 我只是想强调,我认为问题出在 A 中提到的选项之一。
这可以通过创建一个新令牌来解决 使用此命令:
kubeadm token create --print-join-command
并使用生成的令牌将其他节点加入集群