Kubeadm: [ERROR Swap]:不支持在打开时运行。 请禁用交换

创建于 2017-12-21  ·  11评论  ·  资料来源: kubernetes/kubeadm

这是错误报告还是功能请求?

错误报告

版本

kubeadm 版本(使用kubeadm version ):1.9.0

环境:

  • Kubernetes 版本(使用kubectl version ):1.9.0
  • 云提供商或硬件配置:Raspberry Pi
  • 操作系统(例如来自 /etc/os-release):Raspbian GNU/Linux 8 (jessie)
  • 内核(例如uname -a ):Linux 4.9.35-v7+
  • 其他

发生了什么?

执行kubeadm init会弹出错误[ERROR Swap]: running with swap on is not supported. Please disable swap 。 建议的修复方法是使用 kubelet 的标志,所以基本上:

kubeadm reset 
echo 'Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"' >> /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

systemctl daemon-reload
systemctl restart kubelet

kubeadm init

但最后,错误仍然存​​在。 也许这是一个 Kubelet 问题,或者我可能配置错误......

最有用的评论

swapoff -a

所有11条评论

如果您确实设置了 kubelet 标志,那么您可以安全地执行kubeadm init --ignore-preflight-errors Swap ,但我建议您只关闭交换,因为您将进入不受支持的领域。

无需重新打开它,但我仍然觉得这有点违反直觉。 如果您设置了 kubelet 标志,那么我希望我不需要忽略预检错误。 如果没有传递--ignore-preflight-errors ,无论 kubelet 标志是否启用,错误消息都保持不变,这是一种误导。

关闭交换的命令是什么?

swapoff -a

在大多数情况下, swapoff -a确实是一个灵丹妙药,但是,某些 k8s 设置可能确实需要交换。 例如,我有一个非常小且便宜的 VM,只有 1GB 的 RAM,我将它用于个人 GitLab Runner,它很少处理短的 CI/CD 任务。 如果我增加机器的大小,我将为 99% 空闲的资源支付更多费用。 如果我禁用交换, npm install和 buid pod 内的其他脚本可能会挂起,因为它们需要大量内存,尽管时间很短。 因此,带有gitlab runner chart和 swap 的单节点kubeadm集群是最适合我的。

以下是我如何启动并运行我的迷你集群:

UPD:以下替代方法适用于K8S 1.10-唯一的-为1.11+看到https://kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file/ (TLDR:您可以指定kubeletConfiguration:\n failSwapOn: false在你的 kubeadm 的config.yaml然后是kubeadm init --config config.yaml --ignore-preflight-errors Swap )。

kubeadm reset 

## ↓ see explanation below
sed -i '9s/^/Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"\n/' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

systemctl daemon-reload
systemctl restart kubelet

echo "
kind: MasterConfiguration
apiVersion: kubeadm.k8s.io/v1alpha1
api:
  bindPort: ${K8S_API_PORT}
apiServerCertSANs: ${K8S_API_EXTRA_HOSTS}
" > /tmp/config.yaml

kubeadm init --config /tmp/config.yaml --ignore-preflight-errors Swap

## make possible to run workload on master
kubectl taint nodes --all node-role.kubernetes.io/master-

以下段落仅适用于 k8s 1.10-
我使用sed -i '9s/^/...而不是@cjdcordeiro提到的echo 'Environment="..."' >> ...原因是因为在后一种情况下, 10-kubeadm.conf中的行以错误的顺序堆叠:

...
Environment="KUBELET_CERTIFICATE_ARGS=--rotate-certificates=true --cert-dir=/var/lib/kubelet/pki"
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_SYSTEM_PODS_ARGS $KUBELET_NETWORK_ARGS $KUBELET_DNS_ARGS $KUBELET_AUTHZ$
Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"

因为KUBELET_EXTRA_ARGS出现在ExecStart ,所以看起来好像没有捡起来。 使用sed -i '9s/^/... ,文件/etc/systemd/system/kubelet.service.d/10-kubeadm.conf最终像这样并且工作:

...
Environment="KUBELET_CERTIFICATE_ARGS=--rotate-certificates=true --cert-dir=/var/lib/kubelet/pki"
Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_SYSTEM_PODS_ARGS $KUBELET_NETWORK_ARGS $KUBELET_DNS_ARGS $KUBELET_AUTHZ$

如果在 kubeadm 中启用交换比现在更容易,那就太好了——这将为世界各地的人们节省数小时的时间。 在升级到 1.8 后让我的迷你集群工作真的很痛苦,因为我在 Linux 管理方面非常缺乏经验,我认为如果其他人不必走同样的道路,那就太好了。 理想的解决方案看起来像这样 IMO:

echo "
kind: MasterConfiguration
apiVersion: kubeadm.k8s.io/v1alpha1
kubeletConfiguration:
  allowSwap: true
" > /tmp/config.yaml

kubeadm init --config /tmp/config.yaml

当然,启用交换应该仍然是一个边缘情况,因为它可能会在很多情况下咬人。 但是,如果 kubeadm 用户有选择,那就太好了。 在那之前,如果有一个关于启用交换的未决问题,那就太好了。

+1 用于选择实验/alpha/etc“功能”标志以启用交换,将其添加到 kubelet.service.d 中的 kubeadm 插件并禁用飞行前检查。 绝对是边缘情况,同意,但如果更容易一些就更好了。

(不过,谷歌搜索并能够快速找到这个问题有很大帮助。)

相关见: https :

我关闭了我的交换,但我仍然收到这个错误。

只是为了记录,至少在基于 ubuntu 的系统中,我猜添加 _--fail-swap-on=false_ 标志的位置在 _/etc/default/kubelet_ 文件中; 不在 _systemd_ conf 文件本身中。

只是为了记录,至少在基于 ubuntu 的系统中,我猜添加 --fail-swap-on=false 标志的位置在 /etc/default/kubelet 文件中; 不在 systemd conf 文件本身中。

对于 1.11+,这是真的。

要永久禁用它,只需在sudo crontab -e的末尾插入带有换行符的<strong i="5">@reboot</strong> /sbin/swapoff -a sudo crontab -e

在 Ubuntu 16.04 和 18.04 上测试。

此页面是否有帮助?
0 / 5 - 0 等级