我正在尝试部署一个家庭 k8s 节点来学习和部署一些我依赖的实际服务。我已采取以下步骤:
- 安装 Fedora Server 39
- 按照 的说明
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"
我尝试了以下方法:
- 重新禁用firewalld
- 使用以下方法重新禁用交换
swapoff --all
- 将 SELinux 策略从 更改
ENFORCE
为PERMISSIVE
- 删除所有
localdomain
引用/etc/kubernetes/kubelet.conf
- 使用以下方法更改主机名
hostnamectl hostname localhost.localdomain
- 重启服务器
问题仍然存在。我在网上找到的所有解决方案似乎都归结为上述选项 (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
解释命令:
sed
是“流编辑器”,它包含在许多 Linux 发行版的 GNU 工具中--in-place=".old"
在修改指定的文件之前,将现有配置文件复制到以“.old”结尾的同名文件中"s/localhost.localdomain/$(hostname)/"
将字符串“localhost.localdomain”的任何实例替换为运行返回的值hostname
。./kubelet.conf
要修改的配置文件。
希望这对其他人有帮助!现在开始其他战斗!