RELATÓRIO DE ERRO
versão kubeadm (use kubeadm version
): 1.9.0
Meio Ambiente :
kubectl version
): 1.9.0uname -a
): Linux 4.9.35-v7 +Ao fazer kubeadm init
o erro aparece [ERROR Swap]: running with swap on is not supported. Please disable swap
. A correção sugerida é usar a sinalização de kubelet, basicamente:
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
Mas no final, o erro ainda está lá. Talvez seja um problema do Kubelet ou talvez eu esteja configurando algo incorretamente ...
Se você definir o sinalizador kubelet, poderá fazer isso kubeadm init --ignore-preflight-errors Swap
com segurança, mas recomendo que você apenas desative a troca, pois você está entrando em um território sem suporte aqui.
não há necessidade de reabri-lo, mas ainda acho que é um pouco contra-intuitivo. Se você definir o sinalizador kubelet, esperaria não precisar ignorar os erros de comprovação. Se --ignore-preflight-errors
não for passado, a mensagem de erro permanecerá a mesma, quer o sinalizador kubelet esteja ativado ou não, e isso é enganoso.
Qual é o comando para desligar a troca?
swapoff -a
É verdade que swapoff -a
é uma bala de prata na maioria dos casos, no entanto, certas configurações de k8s podem realmente exigir a troca. Por exemplo, eu tenho uma VM muito pequena e barata com apenas 1 GB de RAM, que uso para um GitLab Runner pessoal que raramente lida com tarefas curtas de CI / CD. Se eu aumentar o tamanho da máquina, estarei pagando mais por um recurso que está 99% ocioso. Se eu desabilitar a troca, npm install
e outros scripts dentro dos pods buid podem travar porque requerem muita memória, embora por curtos períodos de tempo. Assim, um cluster kubeadm
de nó único com gráfico de execução gitlab e troca é o que mais me convém.
Aqui está como eu poderia colocar meu mini-cluster em funcionamento:
UPD: a solução alternativa abaixo se aplica a k8s 1.10- apenas - para 1.11+, consulte https://kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file/ (TLDR: você pode especificar kubeletConfiguration:\n failSwapOn: false
em config.yaml
seu kubeadm e, em seguida, 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-
Os parágrafos abaixo aplicam-se apenas a k8s 1.10-
A razão pela qual usei sed -i '9s/^/...
vez de echo 'Environment="..."' >> ...
como mencionado por @cjdcordeiro é porque, no último caso, as linhas em 10-kubeadm.conf
empilhadas na ordem errada:
...
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"
Como KUBELET_EXTRA_ARGS
apareceu depois de ExecStart
, parecia que não estava captando. Com sed -i '9s/^/...
, o arquivo /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
termina assim e funciona:
...
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$
Seria ótimo se habilitar a troca no kubeadm fosse mais fácil do que agora - isso economizaria milhares de horas para as pessoas em todo o mundo. Fazer meu mini-cluster funcionar depois de atualizar para 1.8 foi uma verdadeira dor porque sou bastante inexperiente em administração Linux e acho que seria ótimo se outros não tivessem que seguir o mesmo caminho. A solução ideal seria semelhante a esta IMO:
echo "
kind: MasterConfiguration
apiVersion: kubeadm.k8s.io/v1alpha1
kubeletConfiguration:
allowSwap: true
" > /tmp/config.yaml
kubeadm init --config /tmp/config.yaml
Claro, habilitar a troca deve permanecer um caso extremo, porque pode prejudicar em muitas circunstâncias. No entanto, seria ótimo se os usuários do kubeadm tivessem escolha. Até então, seria ótimo se houvesse um problema aberto sobre como ativar a troca.
+1 por ter uma opção para um sinalizador de "recurso" experimental / alpha / etc para habilitar a troca que o adiciona ao drop-in kubeadm em kubelet.service.d e desabilita a verificação pré-voo. Definitivamente um caso extremo, concordamos, mas seria bom se fosse mais fácil.
(Pesquisar no Google e ser capaz de encontrar rapidamente esse problema ajuda muito, no entanto.)
Veja relacionados: https://github.com/kubernetes/kubernetes/issues/53533
Desativei minha troca, mas ainda estou recebendo este erro.
Apenas para registro, pelo menos em um sistema baseado no ubuntu, acho que o lugar para adicionar o sinalizador _-- fail-swap-on = false_ é no arquivo _ / etc / default / kubelet_; não no próprio arquivo _systemd_ conf.
Apenas para registro, pelo menos em um sistema baseado no ubuntu, acho que o lugar para adicionar a sinalização --fail-swap-on = false é no arquivo / etc / default / kubelet; não no próprio arquivo de configuração do systemd.
para 1.11+ isso é verdade.
Para desativá-lo permanentemente, basta inserir <strong i="5">@reboot</strong> /sbin/swapoff -a
com uma quebra de linha no final em sudo crontab -e
.
Testado no Ubuntu 16.04 e 18.04.
Comentários muito úteis
swapoff -a