Replique aplicações usando o NetApp SnapMirror e o Trident Protect
Com o Trident Protect, você pode usar os recursos de replicação assíncrona da tecnologia NetApp SnapMirror para replicar alterações de dados e aplicações de um back-end de storage para outro, no mesmo cluster ou entre clusters diferentes.
Anotações e rótulos de namespace durante operações de restauração e failover
Durante as operações de restauração e failover, rótulos e anotações no namespace de destino são feitos para corresponder aos rótulos e anotações no namespace de origem. Rótulos ou anotações do namespace de origem que não existem no namespace de destino são adicionados, e quaisquer rótulos ou anotações que já existem são sobrescritos para corresponder ao valor do namespace de origem. Rótulos ou anotações que existem apenas no namespace de destino permanecem inalterados.
Se você usar o RedHat OpenShift, é importante observar o papel crítico das anotações de namespace em ambientes OpenShift. As anotações de namespace garantem que os pods restaurados aderem às permissões apropriadas e às configurações de segurança definidas pelas restrições de contexto de segurança OpenShift (SCCs) e possam acessar volumes sem problemas de permissão. Para obter mais informações, consulte o "Documentação de restrições de contexto de segurança OpenShift". |
Você pode impedir que anotações específicas no namespace de destino sejam sobrescritas definindo a variável de ambiente do Kubernetes RESTORE_SKIP_NAMESPACE_ANNOTATIONS
antes de executar a operação de restauração ou failover. Por exemplo:
kubectl set env -n trident-protect deploy/trident-protect-controller-manager RESTORE_SKIP_NAMESPACE_ANNOTATIONS=<annotation_key_to_skip_1>,<annotation_key_to_skip_2>
Se instalou a aplicação de origem utilizando Helm com o --create-namespace
sinalizador, é dado um tratamento especial à name
tecla de identificação. Durante o processo de restauração ou failover, o Trident Protect copia esse rótulo para o namespace de destino, mas atualiza o valor para o valor do namespace de destino se o valor da origem corresponder ao namespace de origem. Se esse valor não corresponder ao namespace de origem, ele será copiado para o namespace de destino sem alterações.
Exemplo
O exemplo a seguir apresenta um namespace de origem e destino, cada um com anotações e rótulos diferentes. Você pode ver o estado do namespace de destino antes e depois da operação e como as anotações e rótulos são combinados ou substituídos no namespace de destino.
Antes da operação de restauração ou failover
A tabela a seguir ilustra o estado dos namespaces de origem e destino de exemplo antes da operação de restauração ou failover:
Namespace | Anotações | Etiquetas |
---|---|---|
Namespace ns-1 (fonte) |
|
|
Namespace ns-2 (destino) |
|
|
Após a operação de restauração
A tabela a seguir ilustra o estado do namespace de destino de exemplo após a operação de restauração ou failover. Algumas chaves foram adicionadas, algumas foram sobrescritas e o name
rótulo foi atualizado para corresponder ao namespace de destino:
Namespace | Anotações | Etiquetas |
---|---|---|
Namespace ns-2 (destino) |
|
|
Você pode configurar o Trident Protect para congelar e descongelar sistemas de arquivos durante operações de proteção de dados. "Saiba mais sobre como configurar o congelamento do sistema de arquivos com o Trident Protect". |
Configure uma relação de replicação
A configuração de uma relação de replicação envolve o seguinte:
-
Escolhendo com que frequência você deseja que o Trident Protect tire um snapshot do aplicativo (que inclui os recursos do Kubernetes do aplicativo, bem como os snapshots de volume de cada um dos volumes do aplicativo)
-
Escolha do cronograma de replicação (inclui recursos do Kubernetes e dados de volume persistente)
-
Definir o tempo para a captura instantânea
-
Crie um AppVault para o aplicativo de origem no cluster de origem. Dependendo do seu fornecedor de storage, modifique um exemplo no "Recursos personalizados do AppVault" para se adequar ao seu ambiente:
Crie um AppVault usando um CR-
Crie o arquivo de recurso personalizado (CR) e nomeie-o (por exemplo,
trident-protect-appvault-primary-source.yaml
). -
Configure os seguintes atributos:
-
metadata.name: (required) o nome do recurso personalizado do AppVault. Anote o nome que você escolher, porque outros arquivos CR necessários para uma relação de replicação referem-se a esse valor.
-
spec.providerConfig: (required) armazena a configuração necessária para acessar o AppVault usando o provedor especificado. Escolha um bucketName e quaisquer outros detalhes necessários para o seu provedor. Anote os valores que você escolher, porque outros arquivos CR necessários para uma relação de replicação se referem a esses valores. "Recursos personalizados do AppVault"Consulte para obter exemplos de AppVault CRS com outros provedores.
-
spec.providerCredentials: (required) armazena referências a qualquer credencial necessária para acessar o AppVault usando o provedor especificado.
-
spec.providerCredentials.valueFromSecret: (required) indica que o valor da credencial deve vir de um segredo.
-
Key: (required) a chave válida do segredo para selecionar.
-
Name: (required) Nome do segredo que contém o valor deste campo. Deve estar no mesmo namespace.
-
-
spec.providerCredentials.secretAccessKey: (required) a chave de acesso usada para acessar o provedor. O nome deve corresponder a spec.providerCredentials.valueFromSecret.name.
-
-
spec.providerType: (required) determina o que fornece o backup; por exemplo, NetApp ONTAP S3, S3 genérico, Google Cloud ou Microsoft Azure. Valores possíveis:
-
aws
-
azure
-
gcp
-
generic-s3
-
ONTAP-s3
-
StorageGRID-s3
-
-
-
Depois de preencher o
trident-protect-appvault-primary-source.yaml
ficheiro com os valores corretos, aplique o CR:kubectl apply -f trident-protect-appvault-primary-source.yaml -n trident-protect
Crie um AppVault usando a CLI-
Crie o AppVault, substituindo valores entre parênteses por informações do seu ambiente:
tridentctl protect create vault Azure <vault-name> --account <account-name> --bucket <bucket-name> --secret <secret-name>
-
-
Criar a aplicação de origem CR:
Crie o aplicativo de origem usando um CR-
Crie o arquivo de recurso personalizado (CR) e nomeie-o (por exemplo,
trident-protect-app-source.yaml
). -
Configure os seguintes atributos:
-
metadata.name: (required) o nome do recurso personalizado do aplicativo. Anote o nome que você escolher, porque outros arquivos CR necessários para uma relação de replicação referem-se a esse valor.
-
spec.includedNamespaces: (required) um array de namespaces e rótulos associados. Use nomes de namespace e, opcionalmente, restrinja o escopo dos namespaces com rótulos para especificar recursos que existem nos namespaces listados aqui. O namespace da aplicação deve fazer parte desse array.
Exemplo YAML:
apiVersion: protect.trident.netapp.io/v1 kind: Application metadata: name: maria namespace: my-app-namespace spec: includedNamespaces: - namespace: maria labelSelector: {}
-
-
Depois de preencher o
trident-protect-app-source.yaml
ficheiro com os valores corretos, aplique o CR:kubectl apply -f trident-protect-app-source.yaml -n my-app-namespace
Crie o aplicativo de origem usando a CLI-
Crie o aplicativo de origem. Por exemplo:
tridentctl protect create app maria --namespaces maria -n my-app-namespace
-
-
Opcionalmente, tire um snapshot do aplicativo de origem. Este instantâneo é utilizado como base para a aplicação no cluster de destino. Se você pular esta etapa, precisará esperar que o próximo snapshot agendado seja executado para que você tenha um snapshot recente.
Tire um instantâneo usando um CR-
Crie um agendamento de replicação para o aplicativo de origem:
-
Crie o arquivo de recurso personalizado (CR) e nomeie-o (por exemplo,
trident-protect-schedule.yaml
). -
Configure os seguintes atributos:
-
metadata.name: (required) o nome do recurso personalizado de agendamento.
-
Spec.AppVaultRef: (required) este valor deve corresponder ao campo metadata.name do AppVault para o aplicativo de origem.
-
Spec.ApplicationRef: (required) este valor deve corresponder ao campo metadata.name da aplicação de origem CR.
-
Spec.backupRetention: (required) este campo é obrigatório e o valor deve ser definido como 0.
-
Spec.enabled: Deve ser definido como true.
-
spec.granularity: tem de estar definido para
Custom
. -
Spec.recurrenceRule: Defina uma data de início no horário UTC e um intervalo de recorrência.
-
Spec.snapshotRetention: Deve ser definido como 2.
Exemplo YAML:
-
apiVersion: protect.trident.netapp.io/v1 kind: Schedule metadata: name: appmirror-schedule-0e1f88ab-f013-4bce-8ae9-6afed9df59a1 namespace: my-app-namespace spec: appVaultRef: generic-s3-trident-protect-src-bucket-04b6b4ec-46a3-420a-b351-45795e1b5e34 applicationRef: maria backupRetention: "0" enabled: true granularity: custom recurrenceRule: |- DTSTART:20220101T000200Z RRULE:FREQ=MINUTELY;INTERVAL=5 snapshotRetention: "2"
-
Depois de preencher o
trident-protect-schedule.yaml
ficheiro com os valores corretos, aplique o CR:kubectl apply -f trident-protect-schedule.yaml -n my-app-namespace
-
Tire um instantâneo usando a CLI-
Crie o snapshot, substituindo valores entre parênteses por informações do seu ambiente. Por exemplo:
tridentctl protect create snapshot <my_snapshot_name> --appvault <my_appvault_name> --app <name_of_app_to_snapshot>
-
-
Crie um aplicativo de origem AppVault CR no cluster de destino idêntico ao AppVault CR aplicado no cluster de origem e nomeie-o (por exemplo,
trident-protect-appvault-primary-destination.yaml
). -
Aplicar o CR:
kubectl apply -f trident-protect-appvault-primary-destination.yaml -n my-app-namespace
-
Crie um AppVault para o aplicativo de destino no cluster de destino. Dependendo do seu fornecedor de storage, modifique um exemplo no "Recursos personalizados do AppVault" para se adequar ao seu ambiente:
-
Crie o arquivo de recurso personalizado (CR) e nomeie-o (por exemplo,
trident-protect-appvault-secondary-destination.yaml
). -
Configure os seguintes atributos:
-
metadata.name: (required) o nome do recurso personalizado do AppVault. Anote o nome que você escolher, porque outros arquivos CR necessários para uma relação de replicação referem-se a esse valor.
-
spec.providerConfig: (required) armazena a configuração necessária para acessar o AppVault usando o provedor especificado. Escolha um
bucketName
e quaisquer outros detalhes necessários para o seu provedor. Anote os valores que você escolher, porque outros arquivos CR necessários para uma relação de replicação se referem a esses valores. "Recursos personalizados do AppVault"Consulte para obter exemplos de AppVault CRS com outros provedores. -
spec.providerCredentials: (required) armazena referências a qualquer credencial necessária para acessar o AppVault usando o provedor especificado.
-
spec.providerCredentials.valueFromSecret: (required) indica que o valor da credencial deve vir de um segredo.
-
Key: (required) a chave válida do segredo para selecionar.
-
Name: (required) Nome do segredo que contém o valor deste campo. Deve estar no mesmo namespace.
-
-
spec.providerCredentials.secretAccessKey: (required) a chave de acesso usada para acessar o provedor. O nome deve corresponder a spec.providerCredentials.valueFromSecret.name.
-
-
spec.providerType: (required) determina o que fornece o backup; por exemplo, NetApp ONTAP S3, S3 genérico, Google Cloud ou Microsoft Azure. Valores possíveis:
-
aws
-
azure
-
gcp
-
generic-s3
-
ONTAP-s3
-
StorageGRID-s3
-
-
-
Depois de preencher o
trident-protect-appvault-secondary-destination.yaml
ficheiro com os valores corretos, aplique o CR:kubectl apply -f trident-protect-appvault-secondary-destination.yaml -n my-app-namespace
-
-
Crie um arquivo CR AppMirrorRelationship:
Crie um AppMirrorRelationship usando um CR-
Crie o arquivo de recurso personalizado (CR) e nomeie-o (por exemplo,
trident-protect-relationship.yaml
). -
Configure os seguintes atributos:
-
metadata.name: (obrigatório) o nome do recurso personalizado AppMirrorRelationship.
-
spec.destinationAppVaultRef: (required) esse valor deve corresponder ao nome do AppVault para o aplicativo de destino no cluster de destino.
-
spec.namespaceMapping: (required) os namespaces de destino e origem devem corresponder ao namespace de aplicativo definido no respetivo CR de aplicação.
-
Spec.sourceAppVaultRef: (required) este valor deve corresponder ao nome do AppVault para o aplicativo de origem.
-
Spec.sourceApplicationName: (required) esse valor deve corresponder ao nome do aplicativo de origem definido no CR do aplicativo de origem.
-
Spec.storageClassName: (required) escolha o nome de uma classe de armazenamento válida no cluster. A classe de armazenamento deve ser colocada em Contato com a classe de armazenamento que está em uso no cluster de origem onde o aplicativo de origem é implantado.
-
Spec.recurrenceRule: Defina uma data de início no horário UTC e um intervalo de recorrência.
Exemplo YAML:
apiVersion: protect.trident.netapp.io/v1 kind: AppMirrorRelationship metadata: name: amr-16061e80-1b05-4e80-9d26-d326dc1953d8 namespace: my-app-namespace spec: desiredState: Established destinationAppVaultRef: generic-s3-trident-protect-dst-bucket-8fe0b902-f369-4317-93d1-ad7f2edc02b5 namespaceMapping: - destination: my-app-namespace source: my-app-namespace recurrenceRule: |- DTSTART:20220101T000200Z RRULE:FREQ=MINUTELY;INTERVAL=5 sourceAppVaultRef: generic-s3-trident-protect-src-bucket-b643cc50-0429-4ad5-971f-ac4a83621922 sourceApplicationName: maria sourceApplicationUID: 7498d32c-328e-4ddd-9029-122540866aeb storageClassName: sc-vsim-2
-
-
Depois de preencher o
trident-protect-relationship.yaml
ficheiro com os valores corretos, aplique o CR:kubectl apply -f trident-protect-relationship.yaml -n my-app-namespace
Crie um AppMirrorRelationship usando a CLI-
Crie e aplique o objeto AppMirrorRelationship, substituindo valores entre parênteses por informações do seu ambiente. Por exemplo:
tridentctl protect create appmirrorrelationship <name_of_appmirorrelationship> --destination-app-vault <my_vault_name> --recurrence-rule <rule> --source-app <my_source_app> --source-app-vault <my_source_app_vault>
-
-
(Optional) Verifique o estado e o estado da relação de replicação:
kubectl get amr -n my-app-namespace <relationship name> -o=jsonpath='{.status}' | jq
Failover para o cluster de destino
Com o Trident Protect, você pode fazer failover de aplicações replicadas para um cluster de destino. Este procedimento interrompe a relação de replicação e coloca a aplicação online no cluster de destino. O Trident Protect não interrompe o aplicativo no cluster de origem se ele estiver operacional.
-
Abra o arquivo CR do AppMirrorRelationship (por exemplo,
trident-protect-relationship.yaml
) e altere o valor de spec.desiredState paraPromoted
. -
Salve o arquivo CR.
-
Aplicar o CR:
kubectl apply -f trident-protect-relationship.yaml -n my-app-namespace
-
(Optional) Crie todos os programas de proteção que você precisa no aplicativo com falha.
-
(Optional) Verifique o estado e o estado da relação de replicação:
kubectl get amr -n my-app-namespace <relationship name> -o=jsonpath='{.status}' | jq
Ressincronizar uma relação de replicação com falha
A operação ressincronizada restabelece a relação de replicação. Depois de executar uma operação ressincronizada, o aplicativo de origem original se torna o aplicativo em execução e quaisquer alterações feitas no aplicativo em execução no cluster de destino serão descartadas.
O processo pára o aplicativo no cluster de destino antes de restabelecer a replicação.
Todos os dados gravados na aplicação de destino durante o failover serão perdidos. |
-
Crie um instantâneo do aplicativo de origem.
-
Abra o arquivo CR do AppMirrorRelationship (por exemplo,
trident-protect-relationship.yaml
) e altere o valor de spec.desiredState paraEstablished
. -
Salve o arquivo CR.
-
Aplicar o CR:
kubectl apply -f trident-protect-relationship.yaml -n my-app-namespace
-
Se você criou quaisquer programações de proteção no cluster de destino para proteger o aplicativo com falha, remova-os. Quaisquer programações restantes causam falhas de snapshot de volume.
Ressincronização reversa de uma relação de replicação com falha
Quando você faz a ressincronização reversa de uma relação de replicação com falha, o aplicativo de destino se torna o aplicativo de origem e a origem se torna o destino. As alterações feitas na aplicação de destino durante o failover são mantidas.
-
Exclua o AppMirrorRelationship CR no cluster de destino original. Isso faz com que o destino se torne a fonte. Se houver planos de proteção restantes no novo cluster de destino, remova-os.
-
Configure uma relação de replicação aplicando os arquivos CR usados originalmente para configurar a relação com os clusters opostos.
-
Certifique-se de que o AppVault CRS esteja pronto em cada cluster.
-
Configure uma relação de replicação no cluster oposto, configurando valores para a direção inversa.
Sentido de replicação da aplicação inversa
Quando você inverte a direção da replicação, o Trident Protect move o aplicativo para o back-end de storage de destino e continua replicando de volta para o back-end de storage de origem original. O Trident Protect interrompe a aplicação de origem e replica os dados para o destino antes de fazer o failover para a aplicação de destino.
Nesta situação, você está trocando a origem e o destino.
-
Criar um instantâneo de encerramento:
Crie um instantâneo de encerramento utilizando um CR-
Desative as programações de políticas de proteção para o aplicativo de origem.
-
Criar um ficheiro ShutdownSnapshot CR:
-
Crie o arquivo de recurso personalizado (CR) e nomeie-o (por exemplo,
trident-protect-shutdownsnapshot.yaml
). -
Configure os seguintes atributos:
-
metadata.name: (required) o nome do recurso personalizado.
-
Spec.AppVaultRef: (required) este valor deve corresponder ao campo metadata.name do AppVault para o aplicativo de origem.
-
Spec.ApplicationRef: (required) este valor deve corresponder ao campo metadata.name do arquivo CR da aplicação de origem.
Exemplo YAML:
-
apiVersion: protect.trident.netapp.io/v1 kind: ShutdownSnapshot metadata: name: replication-shutdown-snapshot-afc4c564-e700-4b72-86c3-c08a5dbe844e namespace: my-app-namespace spec: appVaultRef: generic-s3-trident-protect-src-bucket-04b6b4ec-46a3-420a-b351-45795e1b5e34 applicationRef: maria
-
-
Depois de preencher o
trident-protect-shutdownsnapshot.yaml
ficheiro com os valores corretos, aplique o CR:kubectl apply -f trident-protect-shutdownsnapshot.yaml -n my-app-namespace
Crie um instantâneo de encerramento usando a CLI-
Crie o instantâneo de encerramento, substituindo valores entre parênteses por informações do seu ambiente. Por exemplo:
tridentctl protect create shutdownsnapshot <my_shutdown_snapshot> --appvault <my_vault> --app <app_to_snapshot>
-
-
Após a conclusão do snapshot, obtenha o status do snapshot:
kubectl get shutdownsnapshot -n my-app-namespace <shutdown_snapshot_name> -o yaml
-
Encontre o valor de shutdownsnapshot.status.appArchivePath usando o seguinte comando, e Registre a última parte do caminho do arquivo (também chamado de basename; isso será tudo após a última barra):
k get shutdownsnapshot -n my-app-namespace <shutdown_snapshot_name> -o jsonpath='{.status.appArchivePath}'
-
Execute um failover do cluster de destino para o cluster de origem, com a seguinte alteração:
Na etapa 2 do procedimento de failover, inclua o spec.promotedSnapshot
campo no arquivo AppMirrorRelationship CR e defina seu valor para o nome de base registrado na etapa 3 acima. -
Execute as etapas de ressincronização reversa no Ressincronização reversa de uma relação de replicação com falha.
-
Ative programações de proteção no novo cluster de origem.
Resultado
As seguintes ações ocorrem devido à replicação reversa:
-
Um snapshot é obtido dos recursos do Kubernetes do aplicativo de origem original.
-
Os pods do aplicativo de origem original são interrompidos graciosamente ao excluir os recursos do Kubernetes do aplicativo (deixando PVCs e PVS no lugar).
-
Depois que os pods são desativados, snapshots dos volumes do aplicativo são feitos e replicados.
-
As relações do SnapMirror são quebradas, tornando os volumes de destino prontos para leitura/gravação.
-
Os recursos do Kubernetes do aplicativo são restaurados a partir do snapshot de pré-encerramento, usando os dados de volume replicados após o desligamento do aplicativo de origem original.
-
A replicação é restabelecida na direção inversa.
Falha de aplicativos para o cluster de origem original
Usando o Trident Protect, você pode obter "failback" após uma operação de failover usando a seguinte sequência de operações. Nesse fluxo de trabalho para restaurar a direção de replicação original, o Trident Protect replica (ressincrones) qualquer aplicativo é alterado de volta para o aplicativo de origem original antes de reverter a direção de replicação.
Esse processo começa a partir de um relacionamento que concluiu um failover para um destino e envolve as seguintes etapas:
-
Comece com um estado com falha em excesso.
-
Reverta a ressincronização da relação de replicação.
Não execute uma operação de ressincronização normal, pois isso descartará os dados gravados no cluster de destino durante o procedimento de failover. -
Inverta a direção da replicação.
-
Execute os Ressincronização reversa de uma relação de replicação com falha passos.
-
Execute os Sentido de replicação da aplicação inversa passos.
Excluir uma relação de replicação
Você pode excluir um relacionamento de replicação a qualquer momento. Quando você exclui a relação de replicação do aplicativo, isso resulta em dois aplicativos separados sem relação entre eles.
-
Excluir o AppMirrorRelationship CR:
kubectl delete -f trident-protect-relationship.yaml -n my-app-namespace