СООБЩЕНИЕ ОБ ОШИБКЕ
версия kubeadm (используйте kubeadm version
): 1.9.0
Окружающая среда :
kubectl version
): 1.9.0uname -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, а может я что-то неправильно настраиваю ...
Если вы установите флаг kubelet, вы можете безопасно сделать это kubeadm init --ignore-preflight-errors Swap
, но я бы порекомендовал вам просто отключить своп вместо этого, так как вы здесь попадаете на неподдерживаемую территорию.
нет необходимости повторно открывать это, но я все еще чувствую, что это немного противоречит интуиции. Если вы установите флаг kubelet, я ожидаю, что мне не нужно игнорировать ошибки предполетной проверки. Если --ignore-preflight-errors
не передается, сообщение об ошибке остается неизменным независимо от того, включен флаг kubelet или нет, и это вводит в заблуждение.
Какая команда отключает своп?
swapoff -a
Это правда, что в большинстве случаев swapoff -a
- серебряная пуля, однако для некоторых настроек k8s действительно может потребоваться замена. Например, у меня есть очень маленькая и дешевая виртуальная машина всего с 1 ГБ ОЗУ, которую я использую для личного GitLab Runner, который редко обрабатывает короткие задачи CI / CD. Если я увеличу размер машины, я буду платить больше за ресурс, который простаивает на 99%. Если я отключу своп, npm install
и другие скрипты внутри сборных модулей могут зависнуть, потому что они требуют довольно много памяти, хотя и на короткие периоды времени. Таким образом, одноузловой кластер kubeadm
с диаграммой бегуна gitlab и
Вот как я могу запустить и запустить свой мини-кластер:
UPD: обходной путь ниже применяется только для k8s 1.10 - для 1.11+ см. Https://kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file/ (TL; DR: вы можете указать kubeletConfiguration:\n failSwapOn: false
в config.yaml
вашего kubeadm, а затем 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/^/...
вместо echo 'Environment="..."' >> ...
как упоминалось @cjdcordeiro, заключается в том, что в последнем случае строки в 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 "флага" для включения свопа, который добавляет его в выпадающий файл kubeadm в kubelet.service.d и отключает эту предполетную проверку. Определенно крайний случай, согласен, но было бы неплохо, если бы было проще.
(Однако поиск в Google и возможность быстро найти эту проблему очень помогает.)
Я отключил своп, но все еще получаю эту ошибку.
Просто для записи, по крайней мере, в системе на основе ubuntu, я полагаю, что место для добавления флага _-- fail-swap-on = false_ находится в файле _ / etc / default / kubelet_; не в самом файле _systemd_ conf.
Просто для записи, по крайней мере, в системе на основе ubuntu, я полагаю, что место для добавления флага --fail-swap-on = false находится в файле / etc / default / kubelet; не в самом файле systemd conf.
для 1.11+ это правда.
Чтобы отключить его навсегда, просто вставьте <strong i="5">@reboot</strong> /sbin/swapoff -a
с разрывом строки в конце в sudo crontab -e
.
Проверено на Ubuntu 16.04 и 18.04.
Самый полезный комментарий
swapoff -a