Fazer backup e restaurar um cluster de administrador

Este documento mostra como fazer backup e restauração do armazenamento etcd para um cluster de administrador. Este documento também fornece um script que pode ser usado para fazer backup automático do armazenamento etcd de um cluster.

É possível criar um arquivo de backup para recuperação de potenciais desastres que possam danificar os dados do etcd do cluster. Armazene o arquivo de backup em um local fora do cluster que não dependa da operação dele.

Limitações

  • Este procedimento não faz backup de dados específicos do aplicativo.

  • Este procedimento não faz backup dos PersistentVolumes.

  • As cargas de trabalho programadas após a criação de um backup não são restauradas com esse backup.

  • Não é possível restaurar um cluster após uma falha no upgrade.

  • Esse procedimento não tem a finalidade de restaurar um cluster excluído.

Como fazer backup de um cluster de administrador

Um backup de cluster de administrador contém os seguintes elementos:

  • Um snapshot do etcd do cluster de administrador.
  • Os Secrets do plano de controle do administrador, necessários para a autenticação nos clusters de administrador e de usuário.

Conclua as etapas a seguir antes de criar um backup do cluster de administrador:

  1. Encontre o endereço IP externo do cluster de administrador, que é usado para fazer o SSH no plano de controle do cluster de administrador:

    kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] get nodes -n kube-system -o wide | grep master

    em que [ADMIN_CLUSTER_KUBECONFIG] é o arquivo kubeconfig do cluster de administrador.

  2. Crie uma chave SSH chamada vsphere_tmp a partir da chave privada do cluster de administrador.

    É possível encontrar a chave privada nos Secrets dos clusters de administrador:

    kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] get secrets sshkeys -n kube-system -o yaml

    Na resposta ao comando, encontre a chave privada no campo vsphere_tmp.

    Copie a chave privada para vsphere_tmp:

    echo "[PRIVATE_KEY]" | base64 -d > vsphere_tmp; chmod 600 vsphere_tmp
  3. Verifique se é possível entrar no plano de controle do administrador usando esta chave privada:

    ssh -i vsphere_tmp ubuntu@[EXTERNAL_IP]
    
  4. Saia do contêiner:

    exit

Como fazer backup do armazenamento etcd de um cluster de administrador

Para fazer backup do armazenamento etcd do cluster de administrador:

  1. Consiga o nome do pod do etcd:

    kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] get pods \
        -n kube-system -l component=etcd,tier=control-plane -ojsonpath='{$.items[*].metadata.name}{"\n"}'
  2. Coloque um shell no contêiner kube-etcd do pod:

    kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG]  exec -it \
        -n kube-system [ADMIN_ETCD_POD] -- bin/sh

    em que [ADMIN_ETCD_POD] é o nome do pod etcd.

  3. No shell, use etcdctl para criar um backup chamado snapshot.db no diretório local:

    ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt \
        --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt \
        --key=/etc/kubernetes/pki/etcd/healthcheck-client.key snapshot save /tmp/snapshot.db
    
  4. Saia do contêiner:

    exit
  5. Copie o backup do contêiner kube-etcd usando kubectl cp:

    kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] cp \
    kube-system/[ADMIN_ETCD_POD]:tmp/snapshot.db [RELATIVE_DIRECTORY]
    

    em que [RELATIVE_DIRECTORY] é um caminho em que você quer armazenar o backup.

Como fazer backup de Secrets de um cluster de administrador

Para fazer backup dos secrets do plano de controle do administrador:

  1. Use SSH para se conectar ao nó do plano de controle do administrador:

    ssh -i vsphere_tmp ubuntu@EXTERNAL_IP
    

    Substitua EXTERNAL_IP pelo endereço IP externo do plano de controle de administrador anotado anteriormente.

  2. Opcional, mas altamente recomendado: crie um diretório de backup local.

    É necessário alterar as permissões dos Secrets de backup para copiá-los do nó:

    mkdir backup
  3. Copie localmente os Secrets para o diretório de backup local:

    sudo cp -r /etc/kubernetes/pki/* backup/
  4. Altere as permissões dos secrets de backup:

    sudo chmod -R a+rX backup/
  5. Saia do nó do plano de controle do administrador:

    exit
  6. Execute scp para copiar a pasta de backup do nó do plano de controle do administrador:

    sudo scp -r -i vsphere_tmp  ubuntu@EXTERNAL_IP:backup/ RELATIVE_DIRECTORY
    

    Substitua RELATIVE_DIRECTORY por um caminho em que você quer armazenar o backup.

Como restaurar um cluster de administrador

O procedimento a seguir recria um cluster de administrador armazenado em backup e todos os planos de controle do usuário que ele gerenciou quando o snapshot do etcd foi criado.

  1. Execute scp para copiar snapshot.db para o plano de controle do administrador:

    sudo scp -i vsphere_tmp snapshot.db ubuntu@[EXTERNAL_IP]:

    em que [EXTERNAL_IP] é o endereço IP externo do plano de controle do administrador coletado anteriormente.

  2. Coloque um shell no plano de controle do administrador:

    sudo ssh -i vsphere_tmp ubuntu@[EXTERNAL_IP]
    
  3. Copie snapshot.db/ para /mnt:

    sudo cp snapshot.db /mnt/
  4. Crie um diretório temporário, como backup:

    mkdir backup
  5. Saia do plano de controle do administrador:

    exit
  6. Copie os certificados para backup/:

    sudo scp -r -i vsphere_tmp [BACKUP_CERT_FILE] ubuntu@[EXTERNAL_IP]:backup/
  7. Coloque um Shell no nó do plano de controle de administrador:

    ssh -i vsphere_tmp ubuntu@[EXTERNAL_IP]
    

    em que [EXTERNAL_IP] é o endereço IP externo do plano de controle do administrador coletado anteriormente.

  8. Parar kube-etcd e kube-apiserver.

    sudo mv /etc/kubernetes/manifests/etcd.yaml /tmp/etcd.yaml
    sudo mv /etc/kubernetes/manifests/kube-apiserver.yaml /tmp/kube-apiserver.yaml
  9. Copie os Secrets de backup para /etc/kubernetes/pki/:

    sudo cp -r backup/* /etc/kubernetes/pki/
  10. Execute etcdctl restore com o Docker:

    sudo docker run --rm \
    -v '/mnt:/backup' \
    -v '/var/lib/etcd:/var/lib/etcd' --env ETCDCTL_API=3 'gcr.io/gke-on-prem-release/etcd-util:GKE_ON_PREM_VERSION' /bin/sh -c "etcdctl snapshot restore '/backup/snapshot.db'; rm -r /var/lib/etcd/*; mv /default.etcd/member/ /var/lib/etcd/"
  11. Reinicie kube-etcd e kube-apiserver.

    sudo mv /tmp/etcd.yaml /etc/kubernetes/manifests/etcd.yaml
    sudo mv /tmp/kube-apiserver.yaml /etc/kubernetes/manifests/kube-apiserver.yaml
  12. Verifique se kube-etcd e kube-apiserver iniciaram.

    sudo crictl ps -a
  13. Copie /etc/kubernetes/admin.conf para uma pasta .kube para que ela possa ser acessada pela estação de trabalho do administrador:

    mkdir -p [HOME]/.kube
    sudo cp -i /etc/kubernetes/admin.conf [HOME]/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
  14. Saia do plano de controle do administrador:

    exit
  15. Copie o arquivo kubeconfig recém-gerado do nó de administrador:

    sudo scp -i vsphere_tmp ubuntu@[EXTERNAL_IP]:[HOME]/.kube/config kubeconfig
    sudo chown $(id -u):$(id -g) kubeconfig

    onde:

    • [EXTERNAL_IP] é o endereço IP externo do plano de controle de administrador.
    • [HOME] é o diretório inicial no nó de administrador.

    Agora é possível usar esse novo arquivo kubeconfig para acessar o cluster restaurado.

Solução de problemas de restauração de um cluster de administrador

Se você encontrar um problema ao restaurar o cluster de administrador, entre em contato com o Suporte do Google para resolvê-lo.

Enquanto isso, você pode verificar os seguintes itens para resolver o problema.

  1. Encontre o ID do contêiner do etcd

    sudo crictl ps -a | grep [ADMIN_ETCD_POD]

    em que [ADMIN_ETCD_POD] é o nome do pod etcd.

  2. Examine os registros do contêiner do etcd

    sudo crictl logs [ETCD_CONTAINER_ID]

    em que [ETCD_CONTAINER_ID] é o ID do contêiner do etcd.

  3. Procure as seguintes mensagens de registro de permissão negada, como:

    etcdserver: create snapshot directory error:mkdir /var/lib/etcd/member/snap: permission denied

  4. Se as mensagens de permissão negada forem encontradas, atualize a propriedade de /opt/data/var/lib/etcd/

    sudo chown -R 2001:2001 /opt/data/var/lib/etcd/

  5. Verifique se kube-etcd e kube-apiserver iniciaram.

    sudo crictl ps

Backup automático de cluster

É possível usar o script fornecido aqui como um exemplo de como fazer backup dos clusters automaticamente. O script a seguir não é compatível, e só deve ser usado como referência para escrever um script melhor, mais robusto e completo. Antes de executar o script, preencha os valores das cinco variáveis no início do script:

  • Defina BACKUP_DIR como o caminho em que você quer armazenar os backups de cluster de administrador e de usuário. Este caminho não pode existir.
  • Defina ADMIN_CLUSTER_KUBECONFIG como o caminho do arquivo kubeconfig do cluster de administrador.
  • Defina USER_CLUSTER_NAMESPACE como o nome do cluster de usuário. O nome do cluster de usuário é um namespace no cluster de administração.
  • Defina EXTERNAL_IP como o VIP que você reservou para o serviço de plano de controle do administrador.
  • Defina SSH_PRIVATE_KEY como o caminho da sua chave SSH.
  • Se você estiver usando uma rede privada, defina JUMP_IP como o endereço IP do servidor jump da sua rede.
#!/usr/bin/env bash

# Automates manual steps for taking backups of user and admin clusters.
# Fill in the variables below before running the script.

BACKUP_DIR=""                       # path to store user and admin cluster backups
ADMIN_CLUSTER_KUBECONFIG=""         # path to admin cluster kubeconfig
USER_CLUSTER_NAMESPACE=""           # user cluster namespace
EXTERNAL_IP=""                      # admin control plane node external ip - follow steps in documentation
SSH_PRIVATE_KEY=""                  # path to vsphere_tmp ssh private key - follow steps in documentation
JUMP_IP=""                          # network jump server IP - leave empty string if not using private network.

mkdir -p $BACKUP_DIR
mkdir $BACKUP_DIR/pki

# USER CLUSTER BACKUP

# Snapshot user cluster etcd
kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} exec -it -n ${USER_CLUSTER_NAMESPACE} kube-etcd-0 -c kube-etcd -- /bin/sh -ec "export ETCDCTL_API=3; etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etcd.local.config/certificates/etcdCA.crt --cert=/etcd.local.config/certificates/etcd.crt --key=/etcd.local.config/certificates/etcd.key snapshot save /tmp/${USER_CLUSTER_NAMESPACE}_snapshot.db"
kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} cp ${USER_CLUSTER_NAMESPACE}/kube-etcd-0:tmp/${USER_CLUSTER_NAMESPACE}_snapshot.db $BACKUP_DIR/user-cluster_${USER_CLUSTER_NAMESPACE}_snapshot.db

# ADMIN CLUSTER BACKUP

# Set up ssh options
SSH_OPTS=(-oStrictHostKeyChecking=no -i ${SSH_PRIVATE_KEY})
if [ "${JUMP_IP}" != "" ]; then
    SSH_OPTS+=(-oProxyCommand="ssh -oStrictHostKeyChecking=no -i ${SSH_PRIVATE_KEY} -W %h:%p ubuntu@${JUMP_IP}")
fi

# Copy admin certs
ssh "${SSH_OPTS[@]}" ubuntu@${EXTERNAL_IP} 'sudo chmod -R a+rX /etc/kubernetes/pki/*'
scp -r "${SSH_OPTS[@]}" ubuntu@${EXTERNAL_IP}:/etc/kubernetes/pki/* ${BACKUP_DIR}/pki/

# Snapshot admin cluster etcd
admin_etcd=$(kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} get pods -n kube-system -l component=etcd,tier=control-plane -ojsonpath='{$.items[*].metadata.name}{"\n"}')
kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} exec -it -n kube-system ${admin_etcd} -- /bin/sh -ec "export ETCDCTL_API=3; etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt --key=/etc/kubernetes/pki/etcd/healthcheck-client.key snapshot save /tmp/admin_snapshot.db"
kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} cp -n kube-system ${admin_etcd}:tmp/admin_snapshot.db $BACKUP_DIR/admin-cluster_snapshot.db

A seguir