Atualizações de configuração para modernização
Este documento descreve as atualizações de configuração que pode ter de fazer à sua malha de serviços na nuvem gerida antes de modernizar a malha para o plano de controlo TRAFFIC_DIRECTOR
a partir do plano de controlo ISTIOD
.
Segue-se uma lista de possíveis atualizações de configuração necessárias para preparar o cluster para a modernização. Consulte cada secção para ver as instruções de atualização:
- Vários clusters
- Ative a Workload Identity Federation para o GKE
- Ative a CNI gerida
- Utilização binária não padrão no Sidecar
- Migre para o Istio Ingress Gateway
Para mais informações sobre o fluxo de trabalho de modernização, consulte a página Modernização do plano de controlo gerido.
Migre de segredos do Istio para multicluster_mode
Os segredos de vários clusters não são suportados quando um cluster está a usar o plano de controlo TRAFFIC_DIRECTOR
. Este documento descreve como pode modernizar a utilização de segredos de vários clusters do Istio para a utilização de multicluster_mode
.
Vista geral da API declarativa versus segredos do Istio
A descoberta de pontos finais multi-cluster istio de código aberto funciona através da utilização de istioctl
ou outras ferramentas para criar um segredo do Kubernetes num cluster. Este segredo permite que um cluster equilibre a carga do tráfego para outro cluster na malha. Em seguida, o plano de controlo ISTIOD
lê este segredo e começa a encaminhar o tráfego para esse outro cluster.
O Cloud Service Mesh tem uma API declarativa para controlar o tráfego de vários clusters em vez de criar diretamente segredos do Istio. Esta API trata os segredos do Istio como um detalhe de implementação e é mais fiável do que criar segredos do Istio manualmente. As funcionalidades futuras da Cloud Service Mesh vão depender da API declarativa, e não vai poder usar essas novas funcionalidades diretamente com os segredos do Istio. A API declarativa é o único caminho suportado.
Se estiver a usar segredos do Istio, migre para a API declarativa assim que possível. Tenha em atenção que a definição multicluster_mode
direciona cada cluster para direcionar o tráfego para todos os outros clusters na malha. A utilização de segredos permite uma configuração mais flexível, o que lhe permite configurar para cada cluster para que outro cluster deve direcionar o tráfego na malha.
Para ver uma lista completa das diferenças entre as funcionalidades suportadas da API declarativa e os segredos do Istio, consulte o artigo Funcionalidades suportadas através das APIs Istio.
Migre de segredos do Istio para a API declarativa
Se aprovisionou a malha de serviços na nuvem através da gestão automática com a
API de funcionalidades da frota, não
tem de seguir estas instruções.
Estes passos só se aplicam se tiver feito a integração através do asmcli --managed
.
Tenha em atenção que este processo altera os segredos que apontam para um cluster. Durante este processo, os pontos finais são removidos e, em seguida, adicionados novamente. Entre os pontos finais removidos e adicionados, o tráfego reverte brevemente para o encaminhamento local em vez do equilíbrio de carga para outros clusters. Para mais informações, consulte o problema do GitHub.
Para mudar da utilização de segredos do Istio para a API declarativa, siga estes passos. Execute estes passos ao mesmo tempo ou em sucessão rápida:
Ative a API declarativa para cada cluster na frota onde quer ativar a deteção de pontos finais de vários clusters definindo
multicluster_mode=connected
. Tenha em atenção que tem de definir explicitamentemulticluster_mode=disconnected
se não quiser que o cluster seja detetável.Use o seguinte comando para ativar um cluster para a deteção de pontos finais de vários clusters:
kubectl patch configmap/asm-options -n istio-system --type merge -p '{"data":{"multicluster_mode":"connected"}}'
Use o seguinte comando para desativar a deteção de pontos finais num cluster:
kubectl patch configmap/asm-options -n istio-system --type merge -p '{"data":{"multicluster_mode":"disconnected"}}'
Elimine segredos antigos.
Depois de definir
multicluster_mode=connected
nos seus clusters, cada cluster tem um novo segredo gerado para todos os outros clusters que também têmmulticluster_mode=connected
definido. O segredo é colocado no espaço de nomes istio-system e tem o seguinte formato:istio-remote-secret-projects-PROJECT_NAME-locations-LOCATION-memberships-MEMBERSHIPS
Cada segredo também tem a etiqueta
istio.io/owned-by: mesh.googleapis.com
aplicada.Depois de criar os novos segredos, pode eliminar manualmente os segredos criados com
istioctl create-remote-secret
:kubectl delete secret SECRET_NAME -n istio-system
Após a migração, verifique as métricas de pedidos para se certificar de que são encaminhadas conforme esperado.
Ative a federação de identidades da carga de trabalho para o GKE
A federação de identidade da carga de trabalho é o método seguro recomendado para cargas de trabalho do Google Kubernetes Engine. Isto permite o acesso a Google Cloud serviços como o Compute Engine, o BigQuery e as APIs de aprendizagem automática. A federação de identidades da carga de trabalho não requer configuração manual nem métodos menos seguros, como ficheiros de chaves de contas de serviço, porque usa políticas do IAM. Para mais detalhes sobre a federação de identidades da carga de trabalho, consulte o artigo Como funciona a federação de identidades da carga de trabalho para o GKE.
A secção seguinte descreve como ativar a Workload Identity Federation.
Ative a federação de identidades de cargas de trabalho em clusters
Verifique se a federação de identidade da força de trabalho está ativada para o seu cluster. Para tal, certifique-se de que o cluster do GKE tem um conjunto da federação de identidade da força de trabalho configurado, o que é essencial para a validação de credenciais do IAM.
Use o seguinte comando para verificar o Workload Identity Pool definido para um cluster:
gcloud container clusters describe CLUSTER_NAME \ --format="value(workloadIdentityConfig.workloadPool)"
Substitua
CLUSTER_NAME
pelo nome do seu cluster do GKE. Se ainda não especificou uma zona ou uma região predefinida para o gcloud, também pode ter de especificar uma flag--region
ou--zone
quando executar este comando.Se o resultado estiver vazio, siga as instruções em Atualize um cluster existente para ativar o Workload Identity em clusters do GKE existentes.
Ative a federação de identidades de cargas de trabalho em node pools
Depois de a Workload Identity Federation ser ativada num cluster, os grupos de nós têm de ser configurados para usar o servidor de metadados do GKE.
Listar todos os conjuntos de nós de um cluster Standard. Execute o comando gcloud container node-pools list:
gcloud container node-pools list --cluster CLUSTER_NAME
Substitua
CLUSTER_NAME
pelo nome do seu cluster do GKE. Se ainda não especificou uma zona ou uma região predefinida para o gcloud, também pode ter de especificar uma flag--region
ou--zone
quando executar este comando.Verifique se cada pool de nós está a usar o servidor de metadados do GKE:
gcloud container node-pools describe NODEPOOL_NAME \ --cluster=CLUSTER_NAME \ --format="value(config.workloadMetadataConfig.mode)"
Substitua o seguinte:
NODEPOOL_NAME
com o nome do seu nodepool.CLUSTER_NAME
com o nome do seu cluster do GKE.
Se o resultado não contiver
GKE_METADATA
, atualize o node pool através do guia Atualize um node pool existente.
Ative a interface de rede do contentor (CNI) gerida
Esta secção explica como ativar a CNI gerida para a Cloud Service Mesh no Google Kubernetes Engine.
Vista geral da CNI gerida
A interface de rede de contentores (CNI) gerida é uma implementação gerida pela Google da CNI do Istio. O plug-in CNI simplifica a rede de pods configurando regras de iptables. Isto permite o redirecionamento de tráfego entre aplicações e proxies do Envoy, eliminando a necessidade de autorizações privilegiadas para o init-container necessário para gerir o iptables
.
O plug-in CNI do Istio
substitui o contentor istio-init
. Anteriormente, o contentor istio-init
era responsável por configurar o ambiente de rede do pod para permitir a interceção de tráfego para o sidecar do Istio. O plug-in CNI executa a mesma função de redirecionamento de rede, mas com a vantagem adicional de reduzir a necessidade de privilégios elevados, melhorando assim a segurança.
Por conseguinte, para uma maior segurança e fiabilidade, e para simplificar a gestão e a resolução de problemas, a CNI gerida é necessária em todas as implementações do Managed Cloud Service Mesh.
Impacto nos contentores de inicialização
Os contentores init são contentores especializados que são executados antes dos contentores de aplicações para tarefas de configuração. As tarefas de configuração podem incluir tarefas como transferir ficheiros de configuração, comunicar com serviços externos ou realizar a inicialização pré-aplicação. Os contentores de inicialização que dependem do acesso à rede podem ter problemas quando o CNI gerido está ativado no cluster.
O processo de configuração do pod com a CNI gerida é o seguinte:
- O plugin CNI configura interfaces de rede de pods, atribui IPs de pods e redireciona o tráfego para o proxy sidecar do Istio, que ainda não foi iniciado.
- Todos os contentores init são executados e concluídos.
- O proxy sidecar do Istio é iniciado juntamente com os contentores da aplicação.
Por conseguinte, se um contentor init tentar estabelecer ligações de rede de saída ou ligar-se a serviços na malha, os pedidos de rede dos contentores init podem ser ignorados ou encaminhados incorretamente. Isto deve-se ao facto de o proxy sidecar do Istio, que gere o tráfego de rede para o pod, não estar em execução quando os pedidos são feitos. Para mais detalhes, consulte a documentação do Istio CNI.
Ative a CNI gerida para o seu cluster
Siga os passos nesta secção para ativar a CNI gerida no seu cluster.
Remova as dependências de rede do seu contentor de inicialização. Considere as seguintes alternativas:
- Modifique a lógica ou os contentores da aplicação: pode modificar os seus serviços para remover a dependência de contentores init que requerem pedidos de rede ou realizar operações de rede nos contentores da aplicação, depois de o proxy sidecar ter sido iniciado.
- Use ConfigMaps ou secrets do Kubernetes: armazene os dados de configuração obtidos pelo pedido de rede em ConfigMaps ou secrets do Kubernetes e monte-os nos contentores da sua aplicação. Para soluções alternativas, consulte a documentação do Istio.
Ative a CNI gerida no cluster:
Faça as seguintes alterações de configuração:
Execute o seguinte comando para localizar o
controlPlaneRevision
.kubectl get controlplanerevision -n istio-system
No recurso personalizado (CR)
ControlPlaneRevision
(CPR), defina a etiquetamesh.cloud.google.com/managed-cni-enabled
comotrue
.kubectl label controlplanerevision CPR_NAME \ -n istio-system mesh.cloud.google.com/managed-cni-enabled=true \ --overwrite
Substitua
CPR_NAME
pelo valor na coluna NAME do resultado do passo anterior.No ConfigMap asm-options, defina o valor
ASM_OPTS
comoCNI=on
.kubectl patch configmap asm-options -n istio-system \ -p '{"data":{"ASM_OPTS":"CNI=on"}}'
No recurso personalizado (CR)
ControlPlaneRevision
(CPR), defina a etiquetamesh.cloud.google.com/force-reprovision
comotrue
. Esta ação aciona o reinício do plano de controlo.kubectl label controlplanerevision CPR_NAME \ -n istio-system mesh.cloud.google.com/force-reprovision=true \ --overwrite
Verifique o estado da funcionalidade. Recupere o estado da funcionalidade através do seguinte comando:
gcloud container fleet mesh describe --project FLEET_PROJECT_ID
Substitua
FLEET_PROJECT_ID
pelo ID do seu projeto de anfitrião do Fleet. Geralmente, oFLEET_PROJECT_ID
tem o mesmo nome que o projeto.- Verifique se a condição
MANAGED_CNI_NOT_ENABLED
foi removida deservicemesh.conditions
. - Tenha em atenção que o estado pode demorar até 15 a 20 minutos a ser atualizado. Experimente aguardar alguns minutos e executar novamente o comando.
- Verifique se a condição
Quando o
controlPlaneManagement.state
estiverActive
no estado da funcionalidade do cluster, reinicie os pods.
Afastar-se da utilização binária não padrão no Sidecar
Esta secção sugere formas de tornar as suas implementações compatíveis com a imagem do proxy do Envoy sem distribuição.
Imagens complementares do proxy do Envoy sem distribuição
O Cloud Service Mesh usa dois tipos de imagens secundárias do proxy Envoy com base na configuração do plano de controlo, numa imagem baseada no Ubuntu que contém vários ficheiros binários e numa imagem sem distribuição. As imagens de base sem distribuição são imagens de contentores mínimas que dão prioridade à segurança e à otimização de recursos, incluindo apenas os componentes essenciais. A superfície de ataque é reduzida para ajudar a evitar vulnerabilidades. Para mais informações, consulte a documentação sobre a imagem de proxy Distroless.
Compatibilidade binária
Como prática recomendada, deve restringir o conteúdo de um tempo de execução do contentor apenas aos pacotes necessários. Esta abordagem melhora a segurança e a relação sinal/ruído dos scanners de vulnerabilidades e exposições comuns (CVE).
A imagem do sidecar sem distribuição tem um conjunto mínimo de dependências, sem todos os executáveis, bibliotecas e ferramentas de depuração não essenciais. Por conseguinte, não é possível executar um comando de shell nem usar curl, ping ou outras utilidades de depuração, como kubectl exec
, no contentor.
Torne os clusters compatíveis com imagens sem distribuição
- Remova referências a quaisquer ficheiros binários não suportados (como bash ou curl) da sua configuração. Particularmente nas sondas de Readiness, Startup e Liveness, e nos hooks Lifecycle PostStart e PreStop nos contentores istio-proxy, istio-init ou istio-validation.
- Considere alternativas como holdApplicationUntilProxyStarts para determinados exemplos de utilização.
- Para a depuração, pode usar contentores efémeros para anexar a um pod de carga de trabalho em execução. Em seguida, pode inspecioná-lo e executar comandos personalizados. Para ver um exemplo, consulte o artigo Recolher registos da malha de serviços na nuvem.
Se não conseguir encontrar uma solução para o seu exemplo de utilização específico, contacte o Google Cloud apoio técnico em Receber apoio técnico.
Migre para o Istio Ingress Gateway
Esta secção mostra como migrar para o Istio Ingress Gateway. Existem dois métodos para migrar para o Istio Ingress Gateway:
Migração faseada com divisão de tráfego
Este método dá prioridade à minimização da interrupção, em que envia incrementalmente tráfego para o novo gateway do Istio, o que lhe permite monitorizar o respetivo desempenho numa pequena percentagem de pedidos e reverter rapidamente, se necessário. Tenha em atenção que a configuração da divisão de tráfego da camada 7 pode ser desafiante para algumas aplicações, pelo que tem de gerir os dois sistemas de gateway em simultâneo durante a transição. Consulte o artigo Migração faseada com divisão de tráfego para ver os passos.
Migração direta
Este método envolve o reencaminhamento simultâneo de todo o tráfego para o novo gateway do Istio assim que tiver realizado testes exaustivos. A vantagem desta abordagem é a separação completa da infraestrutura da gateway antiga, o que permite uma configuração adaptável da nova gateway sem as restrições da configuração existente. No entanto, existe um risco acrescido de tempo de inatividade caso surjam problemas inesperados com o novo gateway durante a transição. Consulte o artigo Migração direta para ver os passos.
Os exemplos de migração seguintes pressupõem que tem um serviço HTTP (httpbin) a ser executado no espaço de nomes da aplicação (predefinição) e exposto externamente através da API Kubernetes Gateway. As configurações relevantes são:
- Gateway:
k8-api-gateway
(no espaço de nomesistio-ingress
) – configurado para ouvir o tráfego HTTP na porta 80 para qualquer nome de anfitrião que termine com.example.com
. - HTTPRoute:
httpbin-route
(no espaço de nomesdefault
) – direciona qualquer pedido HTTP com o nome do anfitriãohttpbin.example.com
e um caminho que comece por/get
para o serviçohttpbin
no espaço de nomesdefault
. - A aplicação httpbin está acessível através do IP externo 34.57.246.68.
Migração faseada com divisão de tráfego
Aprovisione um novo Istio Ingress Gateway
Implemente um novo gateway de entrada seguindo os passos na secção Implementar gateway de exemplo e personalize as configurações de exemplo de acordo com os seus requisitos. Os exemplos no repositório anthos-service-mesh destinam-se à implementação de um serviço
istio-ingressgateway
loadBalancer e dos podsingress-gateway
correspondentes.Exemplo de recurso de gateway (istio-ingressgateway.yaml)
apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: istio-api-gateway namespace: GATEWAY_NAMESPACE spec: selector: istio: ingressgateway # The selector should match the ingress-gateway pod labels. servers: - port: number: 80 name: http protocol: HTTP hosts: # or specific hostnames if needed - "httpbin.example.com"
Aplique a configuração de Gateway para gerir o tráfego:
kubectl apply -f istio-ingressgateway.yaml -n GATEWAY_NAMESPACE
Certifique-se de que o "spec.selector" no recurso Gateway corresponde às etiquetas dos seus pods
ingress-gateway
. Por exemplo, se os contentoresingress-gateway
tiverem a etiquetaistio=ingressgateway
, a configuração do gateway também tem de selecionar esta etiquetaistio=ingressgateway
.
Configure o encaminhamento inicial para o novo gateway
Defina as regras de encaminhamento iniciais para a sua aplicação através de um VirtualService do Istio.
Exemplo de VirtualService (my-app-vs-new.yaml):
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: httpbin-vs namespace: APPLICATION_NAMESPACE spec: gateways: - istio-ingress/istio-api-gateway # Replace with <gateway-namespace/gateway-name> hosts: - httpbin.example.com http: - match: - uri: prefix: /get route: - destination: host: httpbin port: number: 8000
Aplique o VirtualService:
kubectl apply -f my-app-vs-new.yaml -n MY_APP_NAMESPACE
Aceder ao serviço de back-end (httpbin) através do gateway de entrada do Istio recentemente implementado
Defina a variável de ambiente Ingress Host para o endereço IP externo associado ao balanceador de carga
istio-ingressgateway
implementado recentemente:export INGRESS_HOST=$(kubectl -n GATEWAY_NAMESPACE get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
Valide se a aplicação (httpbin) está acessível através do novo gateway:
curl -s -I -HHost:httpbin.example.com "http://$INGRESS_HOST/get"
O resultado é semelhante ao seguinte:
HTTP/1.1 200 OK
Modifique o Ingress existente para a divisão do tráfego
Depois de confirmar a configuração bem-sucedida do novo gateway (por exemplo, istio-api-gateway), pode começar a encaminhar uma parte do seu tráfego através dele. Para o fazer, atualize o seu HTTPRoute atual para direcionar uma pequena percentagem do tráfego para o novo gateway, enquanto a maior parte continua a usar o gateway existente (k8-api-gateway).
Abra a httproute para edição:
kubectl edit httproute httpbin-route -n MY_APP_NAMESPACE
Adicione uma nova referência de back-end que aponte para o serviço de balanceamento de carga do gateway de entrada com um peso inicial de 10% e atualize o peso do back-end do gateway antigo.
apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: httpbin-route namespace: MY_APP_NAMESPACE # your application's namespace spec: parentRefs: - name: k8-api-gateway namespace: istio-ingress hostnames: ["httpbin.example.com"] rules: - matches: - path: type: PathPrefix value: /get backendRefs: - name: httpbin port: 8000 weight: 90 - name: istio-ingressgateway # Newly deployed load balancer service namespace: GATEWAY_NAMESPACE port: 80 weight: 10
Conceda autorização para referências entre espaços de nomes com a concessão de referências.
Para permitir que o seu
HTTPRoute
no espaço de nomes da aplicação (predefinição) aceda ao serviçoloadbalancer
no espaço de nomes do gateway (istio-ingress), pode ter de criar uma concessão de referência. Este recurso serve como um controlo de segurança, definindo explicitamente as referências entre espaços de nomes permitidas.O exemplo de
istio-ingress-grant.yaml
seguinte descreve uma concessão de referência:apiVersion: gateway.networking.k8s.io/v1beta1 kind: ReferenceGrant metadata: name: istio-ingressgateway-grant namespace: istio-ingress # Namespace of the referenced resource spec: from: - group: gateway.networking.k8s.io kind: HTTPRoute namespace: MY_APP_NAMESPACE # Namespace of the referencing resource to: - group: "" # Core Kubernetes API group for Services kind: Service name: istio-ingressgateway # Loadbalancer Service of the new ingress gateway
Aplique a subvenção de referência:
kubectl apply -f istio-ingress-grant.yaml -n GATEWAY_NAMESPACE
Valide pedidos para o endereço IP externo existente (por exemplo, 34.57.246.68) não estão a falhar. O exemplo seguinte
check-traffic-flow.sh
descreve um script para verificar falhas de pedidos:# Update the following values based on your application setup external_ip="34.57.246.68" # Replace with existing external IP url="http://$external_ip/get" host_name="httpbin.example.com" # Counter for successful requests success_count=0 # Loop 50 times for i in {1..50}; do # Perform the curl request and capture the status code status_code=$(curl -s -HHost:"$host_name" -o /dev/null -w "%{http_code}" "$url") # Check if the request was successful (status code 200) if [ "$status_code" -eq 200 ]; then ((success_count++)) # Increment the success counter else echo "Request $i: Failed with status code $status_code" fi done # After the loop, check if all requests were successful if [ "$success_count" -eq 50 ]; then echo "All 50 requests were successful!" else echo "Some requests failed. Successful requests: $success_count" fi
Execute o script para confirmar que nenhum pedido falha, independentemente da rota de tráfego:
chmod +x check-traffic-flow.sh ./check-traffic-flow.sh
Aumente lentamente a percentagem de tráfego
Se não forem detetadas falhas de pedidos para o endereço IP externo existente (por exemplo, 34.57.246.68
), transfira gradualmente mais tráfego para o novo Istio Ingress Gateway ajustando os pesos do back-end no seu HTTPRoute
. Aumente o peso do istio-ingressgateway
e diminua o peso da entrada antiga em pequenos incrementos, como 10%, 20% e assim sucessivamente.
Use o seguinte comando para atualizar o seu HTTPRoute
existente:
kubectl edit httproute httpbin-route -n MY_APP_NAMESPACE
Migração total do tráfego e remoção do gateway antigo
Quando o novo Istio Ingress Gateway demonstrar um desempenho estável e um processamento de pedidos bem-sucedido, transfira todo o tráfego para o mesmo. Atualize o
HTTPRoute
para definir o peso do back-end do gateway antigo para0
e o do novo gateway para100
.Assim que o tráfego for totalmente encaminhado para o novo gateway, atualize os registos DNS externos do nome do anfitrião da sua aplicação (por exemplo,
httpbin.example.com
) para apontar para o endereço IP externo do serviço de balanceamento de carga criado em Aprovisione um novo Istio Ingress Gateway.Por fim, elimine o gateway antigo e os respetivos recursos associados:
kubectl delete gateway OLD_GATEWAY -n GATEWAY_NAMESPACE kubectl delete service OLD_GATEWAY_SERVICE -n GATEWAY_NAMESPACE
Migração direta
Aprovisione um novo Istio Ingress Gateway
Implemente um novo gateway de entrada seguindo os passos na secção Implementar gateway de exemplo e personalize as configurações de exemplo de acordo com os seus requisitos. Os exemplos no repositório anthos-service-mesh destinam-se à implementação de um serviço
istio-ingressgateway
loadBalancer e dos podsingress-gateway
correspondentes.Exemplo de recurso de gateway (istio-ingressgateway.yaml)
apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: istio-api-gateway namespace: GATEWAY_NAMESPACE spec: selector: istio: ingressgateway # The selector should match the ingress-gateway pod labels. servers: - port: number: 80 name: http protocol: HTTP hosts: # or specific hostnames if needed - "httpbin.example.com"
Aplique a configuração de Gateway para gerir o tráfego:
kubectl apply -f istio-ingressgateway.yaml -n GATEWAY_NAMESPACE
Certifique-se de que o "spec.selector" no recurso Gateway corresponde às etiquetas dos seus pods
ingress-gateway
. Por exemplo, se os contentoresingress-gateway
tiverem a etiquetaistio=ingressgateway
, a configuração do gateway também tem de selecionar esta etiquetaistio=ingressgateway
.
Configure o encaminhamento inicial para o novo gateway
Defina as regras de encaminhamento iniciais para a sua aplicação através de um VirtualService do Istio.
Exemplo de VirtualService (my-app-vs-new.yaml):
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: httpbin-vs namespace: APPLICATION_NAMESPACE spec: gateways: - istio-ingress/istio-api-gateway # Replace with <gateway-namespace/gateway-name> hosts: - httpbin.example.com http: - match: - uri: prefix: /get route: - destination: host: httpbin port: number: 8000
Aplique o VirtualService:
kubectl apply -f my-app-vs-new.yaml -n MY_APP_NAMESPACE
Aceder ao serviço de back-end (httpbin) através do gateway de entrada do Istio recentemente implementado
Defina a variável de ambiente Ingress Host para o endereço IP externo associado ao balanceador de carga
istio-ingressgateway
implementado recentemente:export INGRESS_HOST=$(kubectl -n GATEWAY_NAMESPACE get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
Valide se a aplicação (httpbin) está acessível através do novo gateway:
curl -s -I -HHost:httpbin.example.com "http://$INGRESS_HOST/get"
O resultado é semelhante ao seguinte:
HTTP/1.1 200 OK
Teste e monitorize o novo gateway
Teste todas as regras de encaminhamento, valide a configuração do TLS, as políticas de segurança e outras funcionalidades. Faça testes de carga para verificar se o novo gateway consegue processar o tráfego esperado.
Assim que o novo gateway for totalmente testado, atualize os registos DNS externos para o nome do anfitrião da sua aplicação (por exemplo,
httpbin.example.com
) de modo a apontar para o endereço IP externo do serviço de balanceamento de carga criado em Aprovisione um novo gateway de entrada do Istio.Monitorize as principais métricas, como a taxa de sucesso de pedidos, a latência, as taxas de erro e a utilização de recursos dos pods da sua aplicação para validar a estabilidade com o novo Istio Ingress Gateway. Quando estiver estável, pode eliminar o gateway antigo e os respetivos recursos associados
kubectl delete gateway OLD_GATEWAY -n GATEWAY_NAMESPACE kubectl delete service OLD_GATEWAY_SERVICE -n GATEWAY_NAMESPACE
Considerações importantes: certifique-se de que os certificados e as configurações TLS estão corretamente configurados no novo Istio Ingress Gateway se a sua aplicação exigir HTTPS. Consulte o artigo Configure a terminação TLS no gateway de entrada para ver mais detalhes.
Corrija vários planos de controlo
Anteriormente, o Cloud Service Mesh suportava a
incorporação através do asmcli
(descontinuado)
que não bloqueava o aprovisionamento de vários planos de controlo. A Cloud Service Mesh
aplica agora a prática recomendada de implementar apenas um canal por cluster que
corresponde ao canal do cluster e não suporta a utilização de vários canais
implementados no mesmo cluster.
Se quiser implementações canary em novas versões da malha rapidamente antes de ficarem disponíveis na versão estável ou normal, tem de usar dois clusters diferentes, cada um com um canal separado. Tenha em atenção que os canais são controlados pelo canal do cluster do GKE e que o Mesh não tem um canal separado associado.
Pode verificar se tem vários canais procurando a
UNSUPPORTED_MULTIPLE_CONTROL_PLANES
condição de estado na sua subscrição. Se este aviso não for apresentado, não é afetado e pode ignorar a leitura desta secção.
Execute o seguinte comando para verificar se o cluster tem vários canais do plano de controlo:
gcloud container fleet mesh describe
O resultado é semelhante ao seguinte:
... projects/.../locations/global/memberships/my-membership: servicemesh: conditions: - code: UNSUPPORTED_MULTIPLE_CONTROL_PLANES details: 'Using multiple control planes is not supported. Please remove a control plane from your cluster.' documentationLink: https://cloud.google.com/service-mesh/docs/migrate/modernization-configuration-updates#multiple_control_planes severity: WARNING controlPlaneManagement: details: - code: REVISION_READY details: 'Ready: asm-managed-stable' implementation: ISTIOD state: ACTIVE ...
Se a condição
UNSUPPORTED_MULTIPLE_CONTROL_PLANES
aparecer, determine que canais existem para o seu cluster:kubectl get controlplanerevisions -n istio-system
O resultado é semelhante ao seguinte:
NAME RECONCILED STALLED AGE asm-managed-stable True False 97d asm-managed True False 97d asm-managed-rapid True False 97d
Neste exemplo, os três canais foram aprovisionados:
- asm-managed-stable -> STABLE
- asm-managed -> REGULAR
- asm-managed-rapid -> RAPID
Se aparecer apenas 1 resultado, significa que apenas um canal está aprovisionado no seu cluster e pode ignorar os restantes passos.
Se aparecerem 2 ou mais resultados, siga os restantes passos para remover os canais em excesso.
Consolide as cargas de trabalho num único canal
Antes de poder remover canais adicionais, tem de garantir que as suas cargas de trabalho estão a usar apenas um canal.
Encontre todas as etiquetas que está a usar no seu cluster:
kubectl get namespaces -l istio.io/rev=RELEASE_CHANNEL
Consoante o resultado do comando anterior, substitua RELEASE_CHANNEL por
asm-managed-stable
,asm-managed
ouasm-managed-rapid
. Repita este passo para cada canal aprovisionado.O resultado é semelhante ao seguinte:
NAME STATUS AGE default Active 110d
Tenha em atenção que, neste exemplo, o espaço de nomes predefinido está a ser injetado com o canal normal.
Se todas as suas cargas de trabalho já estiverem a usar o mesmo canal, pode ignorar para o passo Remova os canais adicionais. Caso contrário, continue nesta secção.
Altere as etiquetas para que apenas seja usado um canal:
- Em alguns casos, os pods também podem ser injetados diretamente com a etiqueta
sidecar.istio.io/inject
. Certifique-se de que também as verifica para essa utilização. - Pode ignorar as etiquetas
istio-injection=enabled
para este passo. Os espaços de nomes com essa etiqueta mudam automaticamente para corresponder ao canal que restar no cluster. - Quando selecionar um canal para manter, experimente selecionar o canal que é igual ao canal do cluster do GKE. Se este canal não existir, selecione um dos canais ativos.
- O canal que selecionar não é importante. O canal do cluster do GKE determina a versão da malha que recebe, e não o canal da malha.
- Verifique a configuração do meshconfig entre os canais ativos que estão a ser usados para se certificar de que não existem diferenças entre eles. Cada canal usa um configmap separado para a configuração, pelo que a consolidação de dois canais num só deve garantir um comportamento consistente entre os dois canais.
kubectl get configmap istio-asm-managed{-rapid | -stable} -n istio-system -o yaml
kubectl label namespace NAMESPACE istio.io/rev- istio-injection=enabled --overwrite
Substitua NAMESPACE pelo nome do seu espaço de nomes.
A prática recomendada é usar
istio-injection=enabled
. No entanto, se não quiser usar essa etiqueta, também pode usaristio.io/rev=RELEASE_CHANNEL
.Depois de alterar a etiqueta de um espaço de nomes / pod, tem de reiniciar todas as cargas de trabalho para que sejam injetadas pelo plano de controlo correto.
- Em alguns casos, os pods também podem ser injetados diretamente com a etiqueta
Remova os canais adicionais
Depois de verificar que todas as cargas de trabalho estão a ser executadas num único canal, pode remover os canais adicionais não usados. Se os três canais de lançamento foram aprovisionados, lembre-se de executar os seguintes comandos para cada canal.
Elimine o recurso
ControlPlaneRevision
adicional:kubectl delete controlplanerevision RELEASE_CHANNEL -n istio-system
Substituir RELEASE_CHANNEL por
asm-managed-stable
,asm-managed
ouasm-managed-rapid
.Elimine o
MutatingWebhookConfiguration
:kubectl delete mutatingwebhookconfiguration istiod-RELEASE_CHANNEL
Elimine o configmap
meshconfig
:kubectl delete configmap istio-RELEASE_CHANNEL
Ative a gestão automática
Execute o seguinte comando para ativar a gestão automática:
gcloud container fleet mesh update \ --management automatic \ --memberships MEMBERSHIP_NAME \ --project PROJECT_ID \ --location MEMBERSHIP_LOCATION
Substitua o seguinte:
- MEMBERSHIP_NAME é o nome da associação apresentado quando validou que o seu cluster estava registado na frota.
- PROJECT_ID é o ID do projeto.
- MEMBERSHIP_LOCATION é a localização da sua subscrição (uma região ou
global
). Pode verificar a localização da sua subscrição comgcloud container fleet memberships list --project PROJECT_ID
.
Verifique se a gestão automática está ativada:
gcloud container fleet mesh describe
O resultado é semelhante ao seguinte:
... membershipSpecs: projects/.../locations/us-central1/memberships/my-member: mesh: management: MANAGEMENT_AUTOMATIC membershipStates: projects/.../locations/us-central1/memberships/my-member: servicemesh: conditions: - code: VPCSC_GA_SUPPORTED details: This control plane supports VPC-SC GA. documentationLink: http://cloud.google.com/service-mesh/docs/managed/vpc-sc severity: INFO controlPlaneManagement: details: - code: REVISION_READY details: 'Ready: asm-managed' implementation: TRAFFIC_DIRECTOR state: ACTIVE dataPlaneManagement: details: - code: OK details: Service is running. state: ACTIVE state: code: OK description: |- Revision ready for use: asm-managed. All Canonical Services have been reconciled successfully. ...