Neste guia, explicamos como mesclar dois clusters em um único Anthos Service Mesh usando a Mesh CA ou o Citadel, além de ativar o balanceamento de carga entre clusters. É possível ampliar facilmente esse processo para incorporar qualquer quantidade de clusters na malha.
Uma configuração do Anthos Service Mesh de vários clusters pode resolver várias situações corporativas cruciais, como escala, local e isolamento. Para mais informações, consulte Casos de uso de vários clusters. Além disso, otimize seus aplicativos para aproveitar ao máximo uma malha de serviço. Para mais informações, consulte Como preparar um aplicativo para o Anthos Service Mesh.
Pré-requisitos
Para este guia, presumimos que você tenha dois ou mais clusters do Google Cloud GKE que atendam aos seguintes requisitos:
- Anthos Service Mesh versão 1.6.8 ou posterior instalado nos clusters.
- Se os clusters estiverem no mesmo projeto, consulte a Visão geral da instalação para instalar ou fazer upgrade dos clusters para a versão necessária.
- Se os clusters estiverem em projetos diferentes, consulte Instalação e migração de vários projetos para instalar ou fazer upgrade dos clusters para a versão necessária.
- Se você mesclar clusters que não estão no mesmo projeto, eles precisarão ser instalados
usando o perfil
asm-gcp-multiproject
e estar em uma configuração de VPC compartilhada, juntos na mesma rede. Além disso, recomendamos que você tenha um projeto para hospedar a VPC compartilhada e dois projetos de serviço para a criação de clusters. Para mais informações, consulte Como configurar clusters com a VPC compartilhada. - Se você usar a Citadel CA, aplique a mesma CA raiz personalizada para os dois clusters.
- Se o Anthos Service Mesh for construído em clusters particulares, recomendamos
criar uma única sub-rede
na mesma VPC. Caso contrário, você precisará garantir que:
- Os planos de controle podem ser acessados pelos planos de controle remotos do cluster por meio dos IPs particulares do cluster.
- É possível adicionar os intervalos de IP dos planos de controle de chamadas às redes autorizadas dos clusters particulares remotos. Para mais informações, consulte Configurar a descoberta de endpoints entre clusters particulares.
Como definir variáveis de projeto e de cluster
Para facilitar, defina uma pasta de trabalho. Ela deve ser aquela em que você fez o download e extraiu os arquivos do Anthos Service Mesh na etapa de pré-requisito Preparação para instalar o Anthos Service Mesh.
export PROJECT_DIR=YOUR_WORKING_FOLDER
Crie uma variável de contexto para cada cluster. O contexto é uma string criada a partir dos IDs de projeto, nomes e locais de clusters. Para os valores de local, use a localização do cluster, por exemplo,
us-west2-a
. Neste exemplo, uma malha já contém um cluster, e você está adicionando outro:export CTX_1=gke_CLUSTER_1_PROJECT_ID_CLUSTER_1_LOCATION_CLUSTER_1_NAME export CTX_2=gke_CLUSTER_2_PROJECT_ID_CLUSTER_2_LOCATION_CLUSTER_2_NAME
Configurar a descoberta de endpoints entre clusters
Configure a descoberta de endpoints para balanceamento de carga entre clusters usando os comandos a seguir. Essa etapa executa as seguintes tarefas:
- O comando
istioctl
cria um secret que concede acesso ao servidor da API Kube para um cluster. - O comando
kubectl
aplica o secret a outro cluster. Assim, o segundo pode ler os endpoints de serviço do primeiro.
istioctl x create-remote-secret --context=${CTX_1} --name=${CLUSTER_1_NAME} | \ kubectl apply -f - --context=${CTX_2}
istioctl x create-remote-secret --context=${CTX_2} --name=${CLUSTER_2_NAME} | \ kubectl apply -f - --context=${CTX_1}
Verificar sua implantação
Nesta seção, explicamos como implantar um serviço HelloWorld
de amostra no seu ambiente de
vários clusters para verificar se o balanceamento de carga entre eles funciona.
Ative a injeção de sidecar
Use o comando a seguir para localizar o valor do rótulo de revisão no serviço
istiod
, que será usado em etapas posteriores.kubectl -n istio-system get pods -l app=istiod --show-labels
A saída será assim:
NAME READY STATUS RESTARTS AGE LABELS istiod-asm-173-3-5788d57586-bljj4 1/1 Running 0 23h app=istiod,istio.io/rev=asm-173-3,istio=istiod,pod-template-hash=5788d57586 istiod-asm-173-3-5788d57586-vsklm 1/1 Running 1 23h app=istiod,istio.io/rev=asm-173-3,istio=istiod,pod-template-hash=5788d57586
Na saída, na coluna
LABELS
, observe o valor do rótulo de revisãoistiod
, que segue o prefixoistio.io/rev=
. Neste exemplo, o valor éasm-173-3
. Use o valor da revisão nas etapas da próxima seção.
Instalar o serviço HelloWorld
Crie o namespace de amostra e a definição de serviço em cada cluster.
Crie o namespace de amostra em cada cluster:
kubectl create --context=${CTX_1} namespace sample
kubectl create --context=${CTX_2} namespace sample
Substitua o rótulo de revisão:
kubectl label --context=${CTX_1} namespace sample \ istio-injection- istio.io/rev=REVISION --overwrite
kubectl label --context=${CTX_2} namespace sample \ istio-injection- istio.io/rev=REVISION --overwrite
em que REVISION é o rótulo de revisão
istiod
que você anotou anteriormente.A resposta é:
label "istio-injection" not found. namespace/sample labeled
Você pode ignorar
label "istio-injection" not found.
com segurançaCrie o serviço HelloWorld em ambos os clusters:
kubectl create --context=${CTX_1} \ -f ${PROJECT_DIR}/samples/helloworld/helloworld.yaml \ -l service=helloworld -n sample
kubectl create --context=${CTX_2} \ -f ${PROJECT_DIR}/samples/helloworld/helloworld.yaml \ -l service=helloworld -n sample
Implantar o HelloWorld v1 e v2 em cada cluster
Implante
HelloWorld v1
emCLUSTER_1
ev2
emCLUSTER_2
. Isso ajudará a verificar o balanceamento de carga entre clusters posteriormente:kubectl create --context=${CTX_1} \ -f ${PROJECT_DIR}/samples/helloworld/helloworld.yaml \ -l version=v1 -n sample
kubectl create --context=${CTX_2} \ -f ${PROJECT_DIR}/samples/helloworld/helloworld.yaml \ -l version=v2 -n sample
Confirme se
HelloWorld v1
ev2
estão em execução usando os seguintes comandos. Verifique se a saída é semelhante a esta:kubectl get pod --context=${CTX_1} -n sample
NAME READY STATUS RESTARTS AGE helloworld-v1-86f77cd7bd-cpxhv 2/2 Running 0 40s
kubectl get pod --context=${CTX_2} -n sample
NAME READY STATUS RESTARTS AGE helloworld-v2-758dd55874-6x4t8 2/2 Running 0 40s
Implantar o serviço Sleep
Implante o serviço
Sleep
nos dois clusters. Esse pod gera tráfego de rede artificial para fins de demonstração:for CTX in ${CTX_1} ${CTX_2} do kubectl apply --context=${CTX} \ -f ${PROJECT_DIR}/samples/sleep/sleep.yaml -n sample done
Aguarde a inicialização do serviço
Sleep
em cada cluster. Verifique se a saída é semelhante a esta:kubectl get pod --context=${CTX_1} -n sample -l app=sleep
NAME READY STATUS RESTARTS AGE sleep-754684654f-n6bzf 2/2 Running 0 5s
kubectl get pod --context=${CTX_2} -n sample -l app=sleep
NAME READY STATUS RESTARTS AGE sleep-754684654f-dzl9j 2/2 Running 0 5s
Verificar o balanceamento de carga entre clusters
Chame o serviço HelloWorld
várias vezes e confira o resultado para verificar
as respostas alternadas da v1 e da v2:
Chame o serviço
HelloWorld
:kubectl exec --context="${CTX_1}" -n sample -c sleep \ "$(kubectl get pod --context="${CTX_1}" -n sample -l \ app=sleep -o jsonpath='{.items[0].metadata.name}')" \ -- curl -sS helloworld.sample:5000/hello
A resposta será semelhante a esta:
Hello version: v2, instance: helloworld-v2-758dd55874-6x4t8 Hello version: v1, instance: helloworld-v1-86f77cd7bd-cpxhv ...
Chame o serviço
HelloWorld
novamente:kubectl exec --context="${CTX_2}" -n sample -c sleep \ "$(kubectl get pod --context="${CTX_2}" -n sample -l \ app=sleep -o jsonpath='{.items[0].metadata.name}')" \ -- curl -sS helloworld.sample:5000/hello
A resposta será semelhante a esta:
Hello version: v2, instance: helloworld-v2-758dd55874-6x4t8 Hello version: v1, instance: helloworld-v1-86f77cd7bd-cpxhv ...
Parabéns, você verificou seu balanceamento de carga com vários clusters do Anthos Service Mesh!
Limpar o serviço HelloWorld
Quando terminar de verificar o balanceamento de carga, remova os serviços HelloWorld
e Sleep
do seu cluster.
kubectl delete ns sample --context ${CTX_1} kubectl delete ns sample --context ${CTX_2}