Backup/Restore e Update do cluster K8S

Fri, Jan 22, 2021 4-minute read

Backup e Restore do Etcd:

O kubernetes armazena o status de todos os objetos do cluster em um banco de dados etcd, ou seja, se perdermos o etcd basicamente perdemos nosso cluster k8s, para não correr esse risco temos técnicas de alta disponibilidade e a possibilidade de ter um cluster etcd. É altamente recomendado ser capaz de realizar o backup e restore do etcd, o assunto está relacionado com o tópico CLuster Maintenance ( Manutenção do Cluster ) e possue uma boa relevância para a CKA.

BACKUP

O procedimento de backup consiste em alguns passos, sendo eles:

  1. Identificar o pod responsavel pelo etcd;
  kubectl get po -A | grep etcd
  1. Saber localizar e apontar os arquivos de CA, CERTIFICADO e KEY no pod:
  kubectl -n kube-system exec -it etcd-master01.capivara.k8s -- sh
  kube
  cd /etc/kubernetes/pki/etcd/
  echo *
  ca.crt ca.key healthcheck-client.crt healthcheck-client.key peer.crt peer.key server.crt server.key 
  ca.crt (CA) - server.crt (CERTIFICADO) - server.key (KEY)
  1. E por fim realizar o backup via o comando etcdctl snapshot save em um lugar especifico do pod:
  kubectl -n kube-system exec -it etcd-master01.capivara.k8s -- sh -C 'ETCDCTL_API=3 etcdctl --cacert="/etc/kubernetes/pki/etcd/ca.crt" --cert="/etc/kubernetes/pki/etcd/server.crt" --key="/etc/kubernetes/pki/etcd/server.key"  --endpoints 127.0.0.1:2679 snapshot save /tmp/snapshotdb '

Entendendo o comando de backup do etcd:

ETCDCTL_API=3 => Variavel de ambiente informando que vamos usar a vers~ao 3 do etcd

etcdctl => O binario do etcd parar gerenciar o servico

–cacert="/etc/kubernetes/pki/etcd/ca.crt" –cert="/etc/kubernetes/pki/etcd/server.crt" –key="/etc/kubernetes/pki/etcd/server.key" => CA, Certificado e key nesse ordem

–endpoints 127.0.0.1:2679 => Aqui apontamos como vamos nos comunicar com etcd

snapshot save => O parametro para salvar o snapshot do estado atual do etcd

/tmp/snapshotdb => Onde vamos salvar o snapshot e o nome do arquivo.


RESTORE

Para realizar o restore devemos identificar o pod do etcd e os certificados usados para interagir com o serviço ( passos 1 e 2 do backup), em seguidas mais os dois procedimentos a seguir:

  1. Validar o seu snapshop:
  kubectl -n kube-system exec -it etcd-master01.capivara.k8s -- sh -C 'ETCDCTL_API=3 etcdctl --cacert="/etc/kubernetes/pki/etcd/ca.crt" --cert="/etc/kubernetes/pki/etcd/server.crt" --key="/etc/kubernetes/pki/etcd/server.key"  --endpoints 127.0.0.1:2679 snapshot status /tmp/snapshotdb '
  1. Realizar o restore do snapshot criado:
  kubectl -n kube-system exec -it etcd-master01.capivara.k8s -- sh -C 'ETCDCTL_API=3 etcdctl --cacert="/etc/kubernetes/pki/etcd/ca.crt" --cert="/etc/kubernetes/pki/etcd/server.crt" --key="/etc/kubernetes/pki/etcd/server.key"  --endpoints 127.0.0.1:2679 snapshot restore /tmp/snapshotdb '

Upgrading kubeadm clusters

Para realizar o update do seu cluster k8s você precisa seguir os seguintes passos:

  1. Upgrade o control plane primário
  2. Upgrade o control plane secundário
  3. Upgrade os demais nodes

Antes de começar é sempre importe ler a release notes para não ter nenhuma surpresa e realizar o backup do etcd.

obs: todos os containers vão ser reiniciados durante o upgrade.

No meu lab estou usando CentOS mas o processo para as demais distribuições segue a mesma idéia.

Upgrade o control plane primário

Update Kubeadm
  1. Verifique a versão atual do kubeadm:
sudo kubeadm version
  1. Em seguida podemos atualizar o pacote, excluindo o exclude do repositório do kubernetes
yum update -y kubeadm --disableexcludes=kubernetes
  1. Verifique se o pacote está disponível conforme previsto:
sudo kubeadm version
  1. Execute o plano de atualização do kubeadm, esse comando é bem útil porque ele vai informar qual é o comando exato para realizar o update.
sudo kubeadm upgrade plain
  1. Em seguida podemos aplicar o upgrade:
sudo kubeadm upgrade apply v1.20.x
Update Kubelet e kubectl

Nosso kubeadm foi atualizado com o sucesso, agora vamos passar para o update do kunelet e kubectl

  1. Antes de atualizar nos vamos deixar o nosso node em manutenção:
kubectl drain <nome-do-node> --ignore-daemonsets
  1. Uma vez com o cluster em manutenção podemos executar os updates dos pacotes:
yum install -y kubelet-1.20.x-0 kubectl-1.20.x-0 --disableexcludes=kubernetes
  1. Faça o restart do serviço via systemd:
sudo systemctl daemon-reload
sudo systemctl restart kubelet
  1. E retire o node de manutenção:
kubectl uncordon <node-to-drain>

Fazendo o update nos workers nodes:

Update Kubeadm
  1. Update do pacote kubeadm:
yum install -y kubeadm-1.20.x-0 --disableexcludes=kubernetes
  1. Aplicar o upgrade:
sudo kubeadm upgrade node
Update Kubelet e Kubectl
  1. Node em modo de manutenção:
kubectl drain node-name --ignore-daemonsets
  1. Update dos pacotes kubelet e kubectl:
yum install -y kubelet-1.20.x-0 kubectl-1.20.x-0 --disableexcludes=kubernetes
  1. Restart do servico kubelet:
sudo systemctl daemon-reload
sudo systemctl restart kubelet
  1. Por fim retiramos o node de manutenção.
kubectl uncordon node-name 
  1. Verifique se os updates ocorreram conforme o esperado:
kubectl get node

Observações finais:

  • Se acontecer alguma coisa de errado com o upgrade podemos executar o kubeadm upgrade apply –force, dessa forma podemos realizar o downgrade para a ultima versãso estáveis instalada.
  • Durante o processo de upgrade, o kubeadm gera um backup no /etc/kubernetes/tmp

Em breve como adicionar nodes adcionais***

Links úteis:

https://github.com/badtuxx/DescomplicandoKubernetes/blob/master/day-6/DescomplicandoKubernetes-Day6.md