Kubeadm: [ERROR Swap]: a execução com a troca ativada não é suportada. Desative a troca

Criado em 21 dez. 2017  ·  11Comentários  ·  Fonte: kubernetes/kubeadm

É um RELATÓRIO DE BUGS ou PEDIDO DE RECURSO?

RELATÓRIO DE ERRO

Versões

versão kubeadm (use kubeadm version ): 1.9.0

Meio Ambiente :

  • Versão do Kubernetes (use kubectl version ): 1.9.0
  • Provedor de nuvem ou configuração de hardware : Raspberry Pi
  • SO (por exemplo, de / etc / os-release): Raspbian GNU / Linux 8 (jessie)
  • Kernel (por exemplo, uname -a ): Linux 4.9.35-v7 +
  • Outros :

O que aconteceu?

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 ...

Comentários muito úteis

swapoff -a

Todos 11 comentários

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.)

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.

Esta página foi útil?
0 / 5 - 0 avaliações