Service Mesh (ASM) oferece suporte à migração direta de clusters que usam o Istio Community Edition para o ASM. Este tópico descreve como migrar um cluster que usa o Istio Community Edition para o ASM.
Processo de migração
Para migrar um cluster que usa o Istio para o ASM, você deve concluir as operações nas quatro fases a seguir.
Durante a fase Migrating, o comportamento de injeção no cluster ainda segue as regras de injeção configuradas para o Istio, e os sidecars do Istio são injetados por padrão. Em um namespace com injeção de sidecar ativada, modifique o rótulo do pod para especificar explicitamente que o proxy de malha do ASM será injetado na carga de trabalho.
Pré-requisitos
-
O cluster Kubernetes que você deseja migrar deve atender às seguintes condições:
O cluster executa o Kubernetes 1.21 ou posterior. Se o cluster executar uma versão anterior e for um cluster do Alibaba Cloud Container Service for Kubernetes (ACK), consulte Atualizar um cluster manualmente.
O Istio 1.10 ou posterior está instalado no cluster.
Crie uma instância do ASM da versão 1.24 ou posterior para a migração. Para obter instruções, consulte Criar uma instância do ASM.
Procedimento
Etapa 1: Adicionar o cluster a ser migrado ao ASM
Adicione um cluster do Alibaba Cloud Container Service for Kubernetes (ACK) com o Istio instalado, ou um cluster autogerenciado registrado no ACK, ao ASM. Para obter instruções, consulte Adicionar um cluster a uma instância do ASM. Ao adicionar o cluster, selecione a opção "Ignore istio-system Namespace Check". Se o cluster a ser migrado não estiver registrado no ACK, use o recurso de cluster registrado do ACK One para registrá-lo no ACK e, em seguida, adicione o cluster ao ASM no console do ASM.
Depois que o cluster a ser migrado for adicionado ao ASM, um recurso ASMMigrateFromIstio será criado automaticamente na instância do ASM. Esse recurso controla todo o processo de migração. Execute o comando a seguir para visualizar o conteúdo desse recurso.
kubectl --kubeconfig=${ASM_KUBECONFIG} get asmmigratefromistio
Saída esperada:
apiVersion: istio.alibabacloud.com/v1beta1
kind: ASMMigrateFromIstio
metadata:
name: default
spec:
desiredState: Init
retryCounter: 0
advancedOptions:
stopIstioSystemInjectionDisabling: false
status:
message: ""
retryCounter: 0
state: Init
A tabela a seguir descreve alguns itens de configuração desse recurso.
Campo | Tipo | Descrição | Valores válidos |
spec.desiredState | string | O estado de migração de destino. Modifique esse valor para entrar em um estado de migração especificado. Importante Esse valor só pode ser alterado na seguinte ordem fixa: Init -> SetupIstioForMigrate -> Migrating -> Finished. |
|
spec.retryCounter | int32 | Durante uma troca de estado, o plano de controle do ASM realiza as verificações necessárias para confirmar que os critérios para sair do estado atual e entrar no novo estado foram atendidos. Essa verificação é executada automaticamente após a modificação do desiredState. Se a verificação falhar, ajuste o estado com base na mensagem retornada e, em seguida, modifique esse valor para acionar uma nova verificação. | 0 a 2147483647 |
spec.advancedOptions | object | As opções avançadas. | |
spec.advancedOptions.stopIstioSystemInjectionDisabling | bool | Especifica se deve desativar a sincronização de rótulos do namespace istio-system pelo ASM. Se existir um gateway leste-oeste no cluster de destino, defina esse valor como |
|
status.retryCounter | int32 | Indica se o retryCounter foi reconciliado corretamente. Se a última modificação foi reconciliada, esse valor é igual a spec.retryCounter. | Somente leitura |
status.state | string | O estado atual real. Após uma troca de estado, se o estado for alterado para o estado especificado por spec.desiredState, o valor de status.state será igual ao valor de spec.desiredState. | Somente leitura |
status.message | string | Se a troca de estado falhar, esse campo indicará o motivo da falha. Se esse campo não estiver vazio, resolva o problema com base na mensagem fornecida e, em seguida, modifique spec.retryCounter para acionar uma nova tentativa após a resolução do problema. | Somente leitura |
Troca de estado do ASMMigrateFromIstio
Quando os preparativos de migração estiverem prontos para a próxima fase, alterne manualmente o estado do recurso ASMMigrateFromIstio. Por exemplo, se a fase atual for Init, alternar o estado para SetupIstioForMigrate indica que a migração entrou na próxima fase.
A seguir estão os comandos de exemplo para alternar para cada fase.
-
SetupIstioForMigratekubectl --kubeconfig=${ASM_KUBECONFIG} patch asmmigratefromistio default --type='merge' -p '{"spec":{"desiredState":"SetupIstioForMigrate"}}' -
Migratingkubectl --kubeconfig=${ASM_KUBECONFIG} patch asmmigratefromistio default --type='merge' -p '{"spec":{"desiredState":"Migrating"}}' -
Finishedkubectl --kubeconfig=${ASM_KUBECONFIG} patch asmmigratefromistio default --type='merge' -p '{"spec":{"desiredState":"Finished"}}'
Para verificar se o estado foi alternado para SetupIstioForMigrate, execute o comando a seguir.
kubectl get asmigratefromistio default -o yaml
Saída esperada:
apiVersion: istio.alibabacloud.com/v1beta1
kind: ASMMigrateFromIstio
metadata:
name: default
spec:
desiredState: SetupIstioForMigrate
retryCounter: 0
status:
message: ""
retryCounter: 0
state: SetupIstioForMigrate
status.state é SetupIstioForMigrate, o que indica que o estado foi alternado.
Se o valor de status.state não for alternado conforme esperado, resolva o problema com base na mensagem em status.message e, em seguida, incremente o valor de spec.retryCounter em 1 para tentar novamente após a resolução do problema.
Configurações adicionais para clusters com gateways leste-oeste do Istio ativados
Por padrão, o ASM desativa a injeção automática para o namespace istio-system. No entanto, após a criação de um pod de gateway leste-oeste do Istio, sua imagem precisa ser substituída manualmente pelo MutatingWebhook. Esse recurso exige que a injeção não seja desativada explicitamente para o namespace istio-system. Portanto, se os gateways leste-oeste estiverem ativados no cluster, execute o comando a seguir para que o plano de controle do ASM não desative forçadamente a injeção no namespace istio-system.
kubectl --kubeconfig=${ASM_KUBECONFIG} patch asmmigratefromistio default --type='merge' -p '{"spec":{"advancedOptions":{"disableIstioSystemLabelReconciliation": true}}}'
Em seguida, remova manualmente os rótulos que o ASM já sincronizou com o istio-system:
-
Edite a configuração do namespace istio-system.
kubectl --kubeconfig=${ACK_cluster_kubeconfig_file_path} edit ns istio-system Remova manualmente o rótulo
istio-injection: disablee, em seguida, salve e saia.
Etapa 2: Configurar o Istio para a migração
-
Alterne o estado para SetupIstioForMigrate.
ImportanteApós executar esse comando, o ASM aplica as configurações necessárias ao Istiod, fazendo com que o Istiod realize uma reinicialização contínua para atender aos requisitos de migração.
-
Para garantir que os sidecars do Istio realizem corretamente a comunicação mTLS com os sidecars do ASM durante a migração, o ASM adiciona as seguintes configurações ao Istio após a entrada nessa fase:
defaultConfig: proxyMetadata: PROXY_CONFIG_XDS_AGENT: "true"Reinicie também manualmente todas as cargas de trabalho nas quais os sidecars do Istio foram injetados, para que essa configuração tenha efeito em todas elas. Execute o comando a seguir para verificar se um pod específico atende à condição:
kubectl get pod ${POD_name} -o yaml|grep PROXY_CONFIG_XDS_AGENTSe a saída não estiver vazia, a carga de trabalho atende à condição. Depois que todas as cargas de trabalho com sidecars do Istio injetados no cluster atenderem a essa condição, entre no estado Migrating.
Etapa 3: Iniciar a migração
Nesta etapa, você entra na fase Migrating. Durante essa fase, escolha injetar um sidecar do Istio ou o proxy de malha do ASM em uma carga de trabalho, até que todos os sidecars do Istio sejam substituídos pelo proxy de malha do ASM.
Alterne o estado para Migrating. Após entrar no estado Migrating, aplique primeiro todas as APIs do Istio ao ASM. Em seguida, siga estas etapas para migrar os sidecars do Istio, os gateways de entrada, os gateways de saída e os gateways leste-oeste para os componentes correspondentes do ASM.
-
(Opcional) Implante o gateway entre clusters do ASM.
No ASM, as cargas de trabalho nas quais o proxy de malha foi injetado usam automaticamente o gateway entre clusters do ASM para comunicação entre clusters, que corresponde ao gateway leste-oeste do Istio. Portanto, se os gateways leste-oeste estiverem ativados, implante o gateway entre clusters do ASM antes de injetar o proxy de malha do ASM em qualquer carga de trabalho. Implantar o gateway primeiro garante que a comunicação entre clusters funcione corretamente após a substituição dos sidecars do Istio pelo proxy de malha do ASM.
No console do ASM, configure o nome de rede correspondente para cada cluster com base na configuração de rede atual do cluster Istio. Para clusters nos quais os gateways leste-oeste do Istio estão implantados, selecione a opção para ativar o gateway entre clusters. Para obter instruções, consulte Especificar uma configuração de rede para um cluster e ativar o proxy de malha entre clusters.
Após a ativação do proxy de malha entre clusters, o sistema cria automaticamente um Service do tipo LoadBalancer, o que gera custos de instância do Classic Load Balancer (CLB). Após concluir a configuração, clique em OK.
NotaA configuração deve corresponder à configuração do Istio. Por exemplo, se o Istio configurar network-1 para o cluster a e network-2 para o cluster b, o ASM deve usar a mesma configuração.
-
Migre os sidecars do Istio para o proxy de malha do ASM.
$ kubectl --kubeconfig=${K8s_cluster_kubeconfig_file_path} -n ${namespace} patch ${deployment_name} --type='merge' -p '{"spec":{"template":{"metadata":{"labels":{"sidecar.asm.aliyun.com/inject":"true"}}}}}'ImportanteComo esse comando modifica o rótulo da carga de trabalho, a carga de trabalho realiza uma reinicialização contínua. A perda de tráfego durante esse processo depende de três fatores: se o protocolo da aplicação suporta desligamento graceful (HTTP/HTTP2/GRPC), se o desligamento graceful está configurado corretamente para o sidecar do Istio e se a aplicação retorna todas as requisições dentro do período de espera do desligamento graceful. Sempre que possível, realize essa operação em horários de menor movimento.
-
Migre o gateway de entrada do Istio para o gateway de entrada do ASM.
Migre o gateway de entrada do Istio para o gateway de entrada do ASM de forma suave. Para obter instruções, consulte Migrar tráfego de um gateway de entrada do Istio autogerenciado para um gateway de entrada do ASM.
-
Migre o gateway de saída do Istio para o gateway de saída do ASM. Se os gateways de saída já estiverem ativados no cluster a ser migrado, execute as operações a seguir para migrá-los.
Crie um gateway de saída no ASM. Para obter instruções, consulte Criar um gateway de saída. Crie outros recursos conforme necessário (por exemplo, um ServiceEntry para registrar um serviço externo, uma regra de gateway para ativar uma porta de encaminhamento para o gateway de saída e um serviço virtual para direcionar o tráfego para o gateway de saída. Para obter instruções, consulte Gerenciar tráfego de saída para serviços externos).
-
Modifique os serviços virtuais dos serviços externos a serem migrados para que apontem para o gateway de saída do ASM e defina os pesos desejados.
O exemplo a seguir mostra a configuração desse serviço virtual. Para o exemplo completo, consulte Egress gateway for HTTP traffic.
apiVersion: networking.istio.io/v1 kind: VirtualService metadata: name: direct-cnn-through-egress-gateway spec: hosts: - edition.cnn.com gateways: - istio-egressgateway - mesh http: - match: - gateways: - mesh port: 80 route: - destination: host: istio-egressgateway.istio-system.svc.cluster.local port: number: 80 weight: 99 - destination: # Add a destination that points to the egress gateway, and adjust its weight as needed host: asm-egressgateway.istio-system.svc.cluster.local # Assume that your ASM egress gateway is named asm-egressgateway port: number: 80 weight: 1Neste YAML, o tráfego destinado a edition.cnn.com é roteado para o gateway de entrada do Istio e o gateway de saída do ASM na proporção de 99:1. Ajuste gradualmente essa proporção conforme necessário, até que todo o tráfego seja migrado para o gateway de saída do ASM. Verifique os logs de acesso do gateway de saída do Istio para determinar se o tráfego ainda passa pelo gateway de saída do Istio.
Etapa 4: Concluir a migração
Certifique-se de que todas as tarefas a seguir foram concluídas antes de prosseguir para a próxima fase da migração.
Todos os sidecars do Istio foram removidos.
Nenhum tráfego passa por nenhum gateway leste-oeste, gateway de entrada ou gateway de saída do Istio.
Todas as configurações de API do Istio foram importadas para o ASM.
As cargas de trabalho nas quais o proxy de malha do ASM foi injetado se comportam conforme o esperado.
Após confirmar que tudo está correto, execute o comando istioctl da versão correspondente para desinstalar o Istio do cluster:
O istioctl varia entre versões. Use a ferramenta istioctl correspondente à versão instalada para desinstalar o Istio, de modo que nenhum recurso seja deixado para trás ou excluído por engano.
$ istioctl --kubeconfig=${K8s_cluster_kubeconfig_file_path} uninstall --purge
Após a conclusão da desinstalação, alterne o estado para Finished. Se a alternância falhar, limpe os recursos residuais do Istio com base na mensagem em status.message e, em seguida, incremente o valor de spec.retryCounter em 1 para tentar novamente até que status.state exiba Finished. A migração está concluída.