Configurar uma malha de vários clusters fora do Google Cloud
Este guia explica como configurar uma malha multicluster para as seguintes plataformas:
- Nuvem distribuída do Google
- Nuvem distribuída do Google
- GKE no Azure
- GKE na AWS
- Clusters anexados, incluindo clusters do Amazon EKS e clusters do Microsoft AKS
Este guia mostra como configurar dois clusters, mas você pode estender esse processo para incorporar qualquer número de clusters em sua malha.
Antes de começar
Este guia pressupõe que você instalou o Cloud Service Mesh usando asmcli install
. Você precisa asmcli
e do pacote de configuração que asmcli
baixa no diretório especificado em --output_dir
quando executou asmcli install
. Se for necessário configurar, siga as etapas em Instalar ferramentas dependentes e validar o cluster para:
- Instale as ferramentas necessárias
- Baixar
asmcli
- Conceder permissões de administrador de cluster
- Valide seu projeto e cluster
Você precisa de acesso aos arquivos kubeconfig para todos os clusters que está configurando na malha.
Configurar variáveis de ambiente e espaços reservados
Você precisa das variáveis de ambiente a seguir ao instalar o gateway leste-oeste.
Crie uma variável de ambiente para o número do projeto. No comando a seguir, substitua FLEET_PROJECT_ID pelo ID do projeto host da frota .
export PROJECT_NUMBER=$(gcloud projects describe FLEET_PROJECT_ID \ --format="value(projectNumber)")
Crie uma variável de ambiente para o identificador de malha.
export MESH_ID="proj-${PROJECT_NUMBER}"
Crie variáveis de ambiente para os nomes de cluster no formato exigido
asmcli
.export CLUSTER_1="cn-FLEET_PROJECT_ID-global-CLUSTER_NAME_1" export CLUSTER_2="cn-FLEET_PROJECT_ID-global-CLUSTER_NAME_2"
Obtenha o nome de contexto dos clusters usando os valores na coluna
NAME
na saída deste comando:kubectl config get-contexts
Defina as variáveis de ambiente para os nomes de contexto do cluster, que este guia usará em muitas etapas posteriormente:
export CTX_1=CLUSTER1_CONTEXT_NAME export CTX_2=CLUSTER2_CONTEXT_NAME
Instale o gateway leste-oeste
Nos seguintes comandos:
Substitua
CLUSTER_NAME_1
eCLUSTER_NAME_2
pelos nomes dos seus clusters.Substitua
PATH_TO_KUBECONFIG_1
ePATH_TO_KUBECONFIG_2
pelos arquivos kubeconfig para seus clusters.
Clusters do Anthos
Mesh CA ou serviço CA
Instale um gateway no cluster1 dedicado ao tráfego leste-oeste para
$CLUSTER_2
. Por padrão, esse gateway será público na Internet. Os sistemas de produção podem exigir restrições de acesso adicionais, por exemplo, regras de firewall, para evitar ataques externos.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=kubernetes -f -
Instale um gateway em
$CLUSTER_2
dedicado ao tráfego leste-oeste para$CLUSTER_1
.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=kubernetes -f -
Istio CA
Instale um gateway no cluster1 dedicado ao tráfego leste-oeste para
$CLUSTER_2
. Por padrão, esse gateway será público na Internet. Os sistemas de produção podem exigir restrições de acesso adicionais, por exemplo, regras de firewall, para evitar ataques externos.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Instale um gateway em
$CLUSTER_2
dedicado ao tráfego leste-oeste para$CLUSTER_1
.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Azure, AWS e anexado
CA de malha
Instale um gateway no cluster1 dedicado ao tráfego leste-oeste para
$CLUSTER_2
. Por padrão, esse gateway será público na Internet. Os sistemas de produção podem exigir restrições de acesso adicionais, por exemplo, regras de firewall, para evitar ataques externos.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Instale um gateway em
$CLUSTER_2
dedicado ao tráfego leste-oeste para$CLUSTER_1
.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Istio CA
Instale um gateway no cluster1 dedicado ao tráfego leste-oeste para
$CLUSTER_2
. Por padrão, esse gateway será público na Internet. Os sistemas de produção podem exigir restrições de acesso adicionais, por exemplo, regras de firewall, para evitar ataques externos.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Instale um gateway em
$CLUSTER_2
dedicado ao tráfego leste-oeste para$CLUSTER_1
.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Expondo serviços
Como os clusters estão em redes separadas, é necessário expor todos os serviços ( *.local
) no gateway leste-oeste em ambos os clusters. Embora esse gateway seja público na Internet, os serviços por trás dele só podem ser acessados por serviços com um certificado mTLS confiável e um ID de carga de trabalho, como se estivessem na mesma rede.
Exponha serviços por meio do gateway leste-oeste para
CLUSTER_NAME_1
.kubectl --kubeconfig=PATH_TO_KUBECONFIG_1 apply -n istio-system -f \ asm/istio/expansion/expose-services.yaml
Exponha serviços por meio do gateway leste-oeste para
CLUSTER_NAME_2
.kubectl --kubeconfig=PATH_TO_KUBECONFIG_2 apply -n istio-system -f \ asm/istio/expansion/expose-services.yaml
Habilitar descoberta de endpoint
Execute o comando asmcli create-mesh
para ativar a descoberta de endpoint. Este exemplo mostra apenas dois clusters, mas você pode executar o comando para ativar a descoberta de endpoints em clusters adicionais, sujeito ao limite de serviço do GKE Hub .
./asmcli create-mesh \
FLEET_PROJECT_ID \
PATH_TO_KUBECONFIG_1 \
PATH_TO_KUBECONFIG_2
Verifique a conectividade multicluster
Esta seção explica como implantar os serviços HelloWorld
e Sleep
de amostra em seu ambiente de vários clusters para verificar se o balanceamento de carga entre clusters funciona.
Habilitar injeção lateral
Localize o valor do rótulo de revisão, que você usará nas etapas posteriores.
Use o comando a seguir para localizar o rótulo de revisão, que você usará em etapas posteriores.
kubectl -n istio-system get pods -l app=istiod --show-labels
A saída é semelhante a esta:
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ão istiod
, que segue o prefixo istio.io/rev=
. Neste exemplo, o valor é asm-173-3
. Use o valor de revisão nas etapas da próxima seção.
Instale o serviço HelloWorld
Crie o namespace de amostra e a definição de serviço em cada cluster. No comando a seguir, substitua REVISION pelo rótulo de revisão
istiod
que você anotou na etapa anterior.for CTX in ${CTX_1} ${CTX_2} do kubectl create --context=${CTX} namespace sample kubectl label --context=${CTX} namespace sample \ istio-injection- istio.io/rev=REVISION --overwrite done
onde REVISION é o rótulo de revisão
istiod
que você anotou anteriormente.A saída é:
label "istio-injection" not found. namespace/sample labeled
Você pode ignorar com segurança
label "istio-injection" not found.
Crie o serviço HelloWorld em ambos os clusters:
kubectl create --context=${CTX_1} \ -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \ -l service=helloworld -n sample
kubectl create --context=${CTX_2} \ -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \ -l service=helloworld -n sample
Implante HelloWorld v1 e v2 em cada cluster
Implante
HelloWorld v1
emCLUSTER_1
ev2
emCLUSTER_2
, o que ajuda posteriormente a verificar o balanceamento de carga entre clusters:kubectl create --context=${CTX_1} \ -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \ -l version=v1 -n sample
kubectl create --context=${CTX_2} \ -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \ -l version=v2 -n sample
Confirme que
HelloWorld v1
ev2
estão em execução usando os comandos a seguir. Verifique se a saída é semelhante à mostrada.: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
em ambos os clusters. Este 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 ${SAMPLES_DIR}/samples/sleep/sleep.yaml -n sample done
Aguarde o início do serviço
Sleep
em cada cluster. Verifique se a saída é semelhante à mostrada: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
Verifique o balanceamento de carga entre clusters
Chame o serviço HelloWorld
várias vezes e verifique a saída para verificar respostas alternadas de v1 e v2:
Ligue para 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}')" \ -- /bin/sh -c 'for i in $(seq 1 20); do curl -sS helloworld.sample:5000/hello; done'
A saída é semelhante à mostrada:
Hello version: v2, instance: helloworld-v2-758dd55874-6x4t8 Hello version: v1, instance: helloworld-v1-86f77cd7bd-cpxhv ...
Ligue para 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}')" \ -- /bin/sh -c 'for i in $(seq 1 20); do curl -sS helloworld.sample:5000/hello; done'
A saída é semelhante à mostrada:
Hello version: v2, instance: helloworld-v2-758dd55874-6x4t8 Hello version: v1, instance: helloworld-v1-86f77cd7bd-cpxhv ...
Parabéns, você verificou seu Cloud Service Mesh com balanceamento de carga e vários clusters!
Limpar
Ao concluir a verificação do balanceamento de carga, remova o serviço HelloWorld
e Sleep
do cluster.
kubectl delete ns sample --context ${CTX_1} kubectl delete ns sample --context ${CTX_2}