kubectl 未能确保租约存在错误

kubectl 未能确保租约存在错误

我正在尝试部署一个家庭 k8s 节点来学习和部署一些我依赖的实际服务。我已采取以下步骤:

  1. 安装 Fedora Server 39
  2. 按照 的说明https://docs.fedoraproject.org/en-US/quick-docs/using-kubernetes/部署 k8s 集群,但需要使用containerd而不是CRI-O,并使用 Canal 而不是 Flannel ,部署 yaml 位于https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/canal.yaml

在 init 命令完成后,我还运行了 kubeadm 打印的所有命令来设置 kubectl 的配置文件。我立即开始遇到一个问题,有时kubectl命令会运行,有时我会收到错误Service Unreachable on 6443。一旦我开始挖掘,我在 kubelet 日志中发现以下错误:

I0129 10:39:19.409618    1170 kubelet_node_status.go:70] "Attempting to register node" node="localhost"
E0129 10:39:19.411296    1170 kubelet_node_status.go:92] "Unable to register node with API server" err="nodes \"localhost\" is forbidden: node \"localhost.localdomain\" is not allowed to modify node \"localhost\"" node="localhost"
E0129 10:39:21.998836    1170 eviction_manager.go:262] "Eviction manager: failed to get summary stats" err="failed to get node info: node \"localhost\" not found"
E0129 10:39:26.204801    1170 controller.go:146] "Failed to ensure lease exists, will retry" err="leases.coordination.k8s.io \"localhost\" is forbidden: User \"system:node:localhost.localdomain\" cannot get resource \"leases\" in API group \"coordination.k8s.io\" in the namespace \"kube-node-lease\": can only access node lease with the same name as the requesting node" interval="7s"

我尝试了以下方法:

  1. 重新禁用firewalld
  2. 使用以下方法重新禁用交换swapoff --all
  3. 将 SELinux 策略从 更改ENFORCEPERMISSIVE
  4. 删除所有localdomain引用/etc/kubernetes/kubelet.conf
  5. 使用以下方法更改主机名hostnamectl hostname localhost.localdomain
  6. 重启服务器

问题仍然存在。我在网上找到的所有解决方案似乎都归结为上述选项 (1) 或选项 (2),但都无济于事。有什么想法可以让我接下来尝试一下吗?

额外信息:

输出自kubectl get nodes

NAME                    STATUS     ROLES           AGE   VERSION
localhost.localdomain   NotReady   control-plane   12h   v1.27.10

输出自kubectl get pods --all-namespaces

NAMESPACE     NAME                                            READY   STATUS    RESTARTS      AGE
kube-system   calico-kube-controllers-867bf4f5b5-kz2r9        0/1     Pending   0             121m
kube-system   canal-pw6j2                                     0/2     Pending   0             121m
kube-system   coredns-5d78c9869d-rvmzw                        0/1     Pending   0             12h
kube-system   coredns-5d78c9869d-zn9lx                        0/1     Pending   0             12h
kube-system   etcd-localhost.localdomain                      1/1     Running   5 (12h ago)   12h
kube-system   kube-apiserver-localhost.localdomain            0/1     Running   8 (12h ago)   12h
kube-system   kube-controller-manager-localhost.localdomain   1/1     Running   7 (12h ago)   12h
kube-system   kube-proxy-mrsvp                                0/1     Unknown   6             12h
kube-system   kube-scheduler-localhost.localdomain            1/1     Running   6 (12h ago)   12h

答案1

好的,这似乎与 kubelet 和控制平面如何使用设备的主机名处理权限有关。dnf安装时kubernetes-kubeadm,kubelete 的默认配置文件指定 localhost.localdomain,无论服务器本身的域名实际上是什么。因此,在安装后kubernetes-kubeadm但在运行之前kubeadm init,您需要将配置文件对主机名的引用替换为服务器的实际主机名

sed --in-place=".old" "s/localhost.localdomain/$(hostname)/" /etc/kubernetes/kubelet.conf

解释命令:

  1. sed是“流编辑器”,它包含在许多 Linux 发行版的 GNU 工具中
  2. --in-place=".old"在修改指定的文件之前,将现有配置文件复制到以“.old”结尾的同名文件中
  3. "s/localhost.localdomain/$(hostname)/"将字符串“localhost.localdomain”的任何实例替换为运行返回的值hostname
  4. ./kubelet.conf要修改的配置文件。

希望这对其他人有帮助!现在开始其他战斗!

相关内容