Configure uma malha híbrida ou multicloud
Esta página explica como configurar uma malha híbrida ou de várias nuvens para as seguintes plataformas:
- Híbrido: GKE no Google Cloud e Google Distributed Cloud (pré-visualização)
- Híbrido: GKE no Google Cloud e Google Distributed Cloud (pré-visualização)
- Multinuvem: GKE no Google Cloud e Amazon EKS (pré-visualização)
Seguindo estas instruções, configura dois clusters, mas pode expandir este processo para incorporar qualquer número de clusters na sua malha.
Pré-requisitos
- Todos os clusters têm de estar registados no mesmo projeto anfitrião da frota.
- Todos os clusters do GKE têm de estar numa configuração de VPC partilhada na mesma rede.
- O endereço do painel de controlo do Kubernetes do cluster e o endereço do gateway têm de estar acessíveis a partir de todos os clusters na malha. O Google Cloud projeto no qual os clusters do GKE estão localizados deve ter autorização para criar tipos de balanceamento de carga externos. Recomendamos que use redes autorizadas e regras da firewall da VPC para restringir o acesso.
- Os clusters privados, incluindo os clusters privados do GKE, não são suportados. Se usar clusters no local, incluindo o Google Distributed Cloud e o Google Distributed Cloud, o endereço do plano de controlo do Kubernetes e o endereço do gateway têm de estar acessíveis a partir de pods em clusters do GKE. Recomendamos que use o CloudVPN para associar a sub-rede do cluster do GKE à rede do cluster no local.
- Se usar a AC do Istio, use o mesmo certificado de raiz personalizado para todos os clusters.
Antes de começar
Este guia pressupõe que instalou o Cloud Service Mesh através da ferramenta asmcli
. Precisa do ficheiro asmcli
e do pacote de configuração que asmcli
transfere para o diretório que especificou em --output_dir quando executou asmcli install
. Para mais
informações, consulte o artigo
Instale ferramentas dependentes e valide o cluster
para:
- Instale as ferramentas necessárias
- Transfira o asmcli
- Conceda autorizações de administrador do cluster
- Valide o seu projeto e cluster
Tem de ter acesso aos ficheiros kubeconfig de todos os clusters que está a configurar na malha. Para o cluster do GKE, para criar um novo ficheiro kubeconfig para o cluster, pode exportar KUBECONFIG
env com o caminho completo do ficheiro como valor no terminal e gerar a entrada kubeconfig.
Configure variáveis de ambiente e marcadores de posição
Precisa das seguintes variáveis de ambiente quando instala o gateway leste-oeste.
Crie variáveis de ambiente para os nomes das redes:
Os clusters do GKE usam o nome da rede do cluster por predefinição:
export NETWORK_1="PROJECT_ID-CLUSTER_NETWORK" ``````
Outros clusters usam
default
:export NETWORK_2="default" ``````
Se instalou o Cloud Service Mesh noutros clusters com valores diferentes para --network_id
, deve transmitir os mesmos valores para NETWORK_2
.
Instale o gateway de este a oeste
Instale um gateway no CLUSTER_1 (o seu cluster do GKE) dedicado ao tráfego leste-oeste para o CLUSTER_2 (o seu cluster multinuvem ou no local):
asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --network ${NETWORK_1} \ --revision asm-11910-9 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 install -y -f -
Tenha em atenção que este gateway é público na Internet por predefinição. Os sistemas de produção podem exigir restrições de acesso adicionais, por exemplo, regras de firewall, para evitar ataques externos.
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} \ --network ${NETWORK_2} \ --revision asm-11910-9 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 install -y -f -
Exponha serviços
Uma vez que os clusters estão em redes separadas, tem de expor todos os serviços (\*.local
) no gateway leste-oeste em ambos os clusters. Embora este gateway seja público na Internet, só é possível aceder aos serviços que estão por detrás através de serviços com um certificado mTLS fidedigno e um ID da carga de trabalho, tal como se estivessem na mesma rede.
Exponha serviços através do gateway leste-oeste para cada cluster
kubectl --kubeconfig=PATH_TO_KUBECONFIG_1 apply -n istio-system -f \
asm/istio/expansion/expose-services.yaml
kubectl --kubeconfig=PATH_TO_KUBECONFIG_2 apply -n istio-system -f \
asm/istio/expansion/expose-services.yaml
Ative a deteção de pontos finais
Execute o comando asmcli create-mesh
para ativar a descoberta de pontos finais. Este exemplo mostra apenas dois clusters, mas pode executar o comando para ativar a deteção de pontos finais em clusters adicionais, sujeito ao limite do serviço GKE Hub.
./asmcli create-mesh \
FLEET_PROJECT_ID \
PATH_TO_KUBECONFIG_1 \
PATH_TO_KUBECONFIG_2
Valide a conetividade multicluster
Esta secção explica como implementar os serviços de exemplo HelloWorld
e Sleep
no seu ambiente de vários clusters para verificar se o equilíbrio de carga entre clusters funciona.
Ative a injeção de sidecar
Localize o valor da etiqueta de revisão, que usa em passos posteriores.
Use o comando seguinte para localizar a etiqueta de revisão, que vai usar nos passos posteriores.
kubectl -n istio-system get pods -l app=istiod --show-labels
O resultado tem um aspeto semelhante ao seguinte:
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
, repare no valor da etiqueta de revisão istiod
, que segue o prefixo istio.io/rev=
. Neste exemplo,
o valor é asm-173-3
. Use o valor da revisão nos passos da secção seguinte.
Instale o serviço HelloWorld
Crie o namespace de exemplo e a definição de serviço em cada cluster. No comando seguinte, substitua REVISION pela
istiod
etiqueta de revisão que anotou no passo 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 é a etiqueta de revisão
istiod
que anotou anteriormente.O resultado é:
label "istio-injection" not found. namespace/sample labeled
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
Implemente o HelloWorld v1 e v2 em cada cluster
Implemente
HelloWorld v1
emCLUSTER_1
ev2
emCLUSTER_2
, o que ajuda mais tarde a validar 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 se o
HelloWorld v1
e ov2
estão a ser executados através dos seguintes comandos. Verifique se o resultado é semelhante ao apresentado: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
Implemente o serviço de sono
Implemente 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 que o serviço
Sleep
seja iniciado em cada cluster. Verifique se o resultado é semelhante ao apresentado: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
Valide o balanceamento de carga entre clusters
Chame o serviço HelloWorld
várias vezes e verifique o resultado para validar
respostas alternadas da 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'
O resultado é semelhante ao apresentado:
Hello version: v2, instance: helloworld-v2-758dd55874-6x4t8 Hello version: v1, instance: helloworld-v1-86f77cd7bd-cpxhv ...
Ligue novamente para o serviço
HelloWorld
: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'
O resultado é semelhante ao apresentado:
Hello version: v2, instance: helloworld-v2-758dd55874-6x4t8 Hello version: v1, instance: helloworld-v1-86f77cd7bd-cpxhv ...
Parabéns, validou a sua malha de serviços na nuvem com vários clusters e equilíbrio de carga!
Limpar
Quando terminar a validação do equilíbrio 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}