Esta página mostra como ativar e usar serviços de vários clusters (MCS, na sigla em inglês). Para saber mais sobre como o MCS funciona e os benefícios dele, consulte Serviços de vários clusters.
O recurso de MCS do Google Kubernetes Engine (GKE) estende o alcance do Serviço do Kubernetes além do limite do cluster e permite descobrir e invocar Serviços em vários clusters do GKE. É possível exportar um subconjunto de serviços existentes ou novos.
Quando você exporta um serviço com MCS, esse serviço é disponibilizado em todos os clusters da frota.
Recursos do Google Cloud gerenciados pela MCS
O MCS gerencia os seguintes componentes do Google Cloud:
Cloud DNS: o MCS configura zonas e registros do Cloud DNS para cada serviço exportado nas frotas do environ. Isso permite que você se conecte a serviços em execução em outros clusters. Essas zonas e registros são criados, lidos, atualizados e excluídos com base nos serviços escolhidos para exportação entre clusters.
Regras de firewall: o MCS configura regras de firewall que permitem que os pods se comuniquem uns com os outros entre clusters na frota. As regras de firewall são criadas, lidas, atualizadas e excluídas com base nos clusters adicionados à frota. Essas regras são semelhantes às regras que o GKE cria para permitir a comunicação entre pods em um cluster do GKE.
Traffic Director: o MCS usa o Traffic Director como plano de controle para acompanhar os endpoints e a integridade deles nos clusters.
Requisitos
O MCS tem os seguintes requisitos:
O MCS só é compatível com a exportação de serviços de clusters nativos do GKE no Google Cloud. Para mais informações, consulte Como criar um cluster nativo de VPC. Não é possível usar clusters padrão do GKE que não sejam nativos de VPC.
A conectividade entre clusters depende dos clusters em execução na mesma rede VPC, nas redes VPC com peering ou compartilhadas. Caso contrário, as chamadas para serviços externos não poderão ultrapassar o limite da rede.
Uma frota pode abranger vários projetos do Google Cloud e redes VPC. No entanto, um único serviço de vários clusters precisa ser exportado de um único projeto e uma única rede VPC.
O MCS não oferece suporte às políticas de rede.
Os clusters precisam ter o complemento
HttpLoadBalancing
ativado. Verifique se o complementoHttpLoadBalancing
está ativado. O complementoHttpLoadBalancing
é ativado por padrão e não pode ser desativado.
Preços
Os serviços de vários clusters estão incluídos como parte da taxa de gerenciamento de cluster do GKE e não têm custo extra para uso. Você precisa ativar a API Traffic Director, mas o MCS não gera cobranças de endpoint do Traffic Director. O licenciamento do GKE Enterprise não é necessário para usar o MCS.
Antes de começar
Antes de começar, veja se você realizou as seguintes tarefas:
Instale o SDK do Google Cloud.
Ative a API Google Kubernetes Engine:
Ative o MCS, a frota (hub), o Resource Manager, Traffic Director e as APIs do Cloud DNS:
gcloud services enable \ multiclusterservicediscovery.googleapis.com \ gkehub.googleapis.com \ cloudresourcemanager.googleapis.com \ trafficdirector.googleapis.com \ dns.googleapis.com \ --project=PROJECT_ID
Substitua
PROJECT_ID
pelo ID do projeto em que você pretende registrar os clusters em uma frota.
Como ativar o MCS no projeto
O MCS exige que os clusters do GKE participantes sejam registrados na mesma frota. Depois que o recurso MCS for ativado para uma frota, qualquer cluster poderá exportar serviços entre os clusters na frota.
Embora o MCS exija registro em uma frota, ele não exige a ativação da plataforma do GKE Enterprise.
GKE Enterprise
Se a API GKE Enterprise estiver ativada no projeto host da frota como um pré-requisito para usar outros componentes do GKE Enterprise, todos os clusters registrados na frota do projeto serão cobrados de acordo com os preços do GKE Enterprise. Com esse modelo de preços, você usa todos os recursos do GKE Enterprise em clusters registrados com uma cobrança única por vCPU. Confirme se a API GKE Enterprise está ativada usando o seguinte comando:
gcloud services list --project=PROJECT_ID | grep anthos.googleapis.com
Se a saída for semelhante a esta, a plataforma completa do GKE Enterprise estará ativada e todos os clusters registrados na frota incorrerão em cobranças do GKE Enterprise:
anthos.googleapis.com Anthos API
Se isso não for esperado, entre em contato com o administrador do projeto.
Uma saída vazia indica que o GKE Enterprise não está ativado.
Como ativar o MCS no cluster do GKE
Ative o recurso MCS para a frota do seu projeto:
gcloud container fleet multi-cluster-services enable \ --project PROJECT_ID
Substitua
PROJECT_ID
pelo ID do projeto em que você pretende registrar os clusters em uma frota. Este é seu projeto host de frota.Registre os clusters do GKE em uma frota. É altamente recomendável registrar o cluster com a federação de identidade da carga de trabalho para o GKE ativada. Se você não ativar a federação de identidade da carga de trabalho, precisará registrar o cluster com uma conta de serviço do Google Cloud para autenticação e concluir as outras etapas em Como autenticar contas de serviço.
Para registrar o cluster com a federação de identidade da carga de trabalho do GKE, execute o seguinte comando:
gcloud container fleet memberships register MEMBERSHIP_NAME \ --gke-cluster CLUSTER_LOCATION/CLUSTER_NAME \ --enable-workload-identity \ --project PROJECT_ID
Substitua:
MEMBERSHIP_NAME
: o nome da assinatura que você escolhe para representar o cluster de maneira exclusiva na frota. Normalmente, o nome da assinatura da frota do cluster é o nome do cluster, mas talvez seja necessário especificar um novo nome se outro cluster com o nome original já existir na frota.CLUSTER_LOCATION
: a zona ou região em que o cluster está localizado.CLUSTER_NAME
: o nome do cluster.
Conceda as permissões do Identity and Access Management (IAM) necessárias para o importador do MCS:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:PROJECT_ID.svc.id.goog[gke-mcs/gke-mcs-importer]" \ --role "roles/compute.networkViewer"
Substitua
PROJECT_ID
pelo ID do projeto host da frota.Certifique-se de que cada cluster na frota tenha um namespace em que compartilhar serviços. Se necessário, crie um namespace usando o seguinte comando:
kubectl create ns NAMESPACE
Substitua
NAMESPACE
por um namespace.Para verificar se o MCS está ativado, execute o seguinte comando:
gcloud container fleet multi-cluster-services describe \ --project PROJECT_ID
A saída será assim:
createTime: '2021-08-10T13:05:23.512044937Z' membershipStates: projects/PROJECT_ID/locations/global/memberships/MCS_NAME: state: code: OK description: Firewall successfully updated updateTime: '2021-08-10T13:14:45.173444870Z' name: projects/PROJECT_NAME/locations/global/features/multiclusterservicediscovery resourceState: state: ACTIVE spec: {}
Se o valor de
state
não forACTIVE
, consulte a seção Solução de problemas.
Como autenticar contas de serviço
Se você registrou os clusters do GKE em uma frota usando uma conta de
serviço, será necessário seguir etapas adicionais para autenticar a conta de serviço.
O MCS implanta um componente chamado gke-mcs-importer
. Esse componente recebe
atualizações de endpoint do Traffic Director. Por isso, como parte da ativação do MCS, é necessário conceder
permissão à conta de serviço para ler informações
do Traffic Director.
Ao usar uma conta de serviço, utilize a conta de serviço padrão do Compute Engine ou sua própria conta de serviço de nó:
Se você estiver usando uma conta de serviço padrão do Compute Engine, ative os seguintes escopos:
https://www.googleapis.com/auth/compute.readonly
https://www.googleapis.com/auth/cloud-platform
Para saber mais sobre como ativar escopos, consulte Como alterar a conta de serviço e os escopos de acesso de uma instância.
Se você estiver usando sua própria conta de serviço de nó, atribua o papel
roles/compute.networkViewer
à conta de serviço.
Como usar o MCS
As seções a seguir mostram como usar o MCS. O MCS usa a API de serviços de vários clusters do Kubernetes.
Como registrar um serviço para exportação
Para registrar um serviço para exportação em outros clusters na frota, conclua as etapas a seguir:
Crie um objeto
ServiceExport
chamadoexport.yaml
:# export.yaml kind: ServiceExport apiVersion: net.gke.io/v1 metadata: namespace: NAMESPACE name: SERVICE_EXPORT_NAME
Substitua:
NAMESPACE
: o namespace do objetoServiceExport
. Esse namespace precisa corresponder ao namespace do serviço que você está exportando.SERVICE_EXPORT_NAME
: o nome de um serviço no cluster que você quer exportar para outros clusters na frota.
Crie o recurso
ServiceExport
executando o seguinte comando:kubectl apply -f export.yaml
A exportação inicial do serviço leva aproximadamente cinco minutos para sincronizar com os clusters registrados na frota. Depois que um serviço é exportado, as sincronizações de endpoint subsequentes ocorrem imediatamente.
É possível exportar o mesmo serviço de vários clusters para criar um único endpoint de serviço de vários clusters
altamente disponível com distribuição de tráfego entre
clusters. Antes de exportar serviços com o mesmo nome e o mesmo namespace,
considere se realmente quer que eles estejam agrupados dessa maneira. Não recomendamos
a exportação de serviços nos namespaces default
e kube-system
devido à
alta probabilidade de conflitos de nomes não intencionais e ao agrupamento não intencional
resultante. Se você estiver exportando mais de cinco serviços com o mesmo nome e o
mesmo namespace, a distribuição de tráfego em serviços importados poderá ser limitada a cinco
serviços exportados.
Como consumir serviços entre clusters
O MCS é compatível apenas com ClusterSetIP e serviços headless. Somente os registros de DNS "A" estão disponíveis.
Depois de criar um objeto ServiceExport
, o nome de domínio a seguir será resolvido para
o serviço exportado de qualquer pod em qualquer cluster da frota:
SERVICE_EXPORT_NAME.NAMESPACE.svc.clusterset.local
A saída inclui os seguintes valores:
SERVICE_EXPORT_NAME
eNAMESPACE
: os valores definidos no objetoServiceExport
.
Para os serviços do ClusterSetIP, o domínio é resolvido para o ClusterSetIP
. Para
encontrar esse valor, localize o objeto ServiceImport
em um cluster no
namespace em que o objeto ServiceExport
foi criado. O objeto ServiceImport
é criado automaticamente.
Exemplo:
kind: ServiceImport
apiVersion: net.gke.io/v1
metadata:
namespace: EXPORTED-SERVICE-NAMESPACE
name: external-svc-SERVICE-EXPORT-TARGET
status:
ports:
- name: https
port: 443
protocol: TCP
targetPort: 443
ips: CLUSTER_SET_IP
O MCS cria um objeto Endpoints
como parte da importação de um Service
para um
cluster. Ao investigar esse objeto, é possível monitorar o progresso de uma importação
de serviço. Para encontrar o nome do objeto Endpoints
, procure o valor da
anotação net.gke.io/derived-service
em um objeto ServiceImport
correspondente ao serviço importado. Exemplo:
kind: ServiceImport
apiVersion: net.gke.io/v1
annotations: net.gke.io/derived-service: DERIVED_SERVICE_NAME
metadata:
namespace: EXPORTED-SERVICE-NAMESPACE
name: external-svc-SERVICE-EXPORT-TARGET
Em seguida, procure o objeto Endpoints
para verificar se o MCS já propagou os
endpoints para o cluster de importação. O objeto Endpoints
é criado no
mesmo namespace que o objeto ServiceImport
, com o nome armazenado na
anotação net.gke.io/derived-service
. Exemplo:
kubectl get endpoints DERIVED_SERVICE_NAME -n NAMESPACE
Substitua:
DERIVED_SERVICE_NAME
: o valor da anotaçãonet.gke.io/derived-service
no objetoServiceImport
.NAMESPACE
: o namespace do objetoServiceExport
.
Saiba mais sobre o status de integridade dos endpoints usando o painel do Traffic Director no console do Google Cloud.
Para os serviços sem comando, o domínio resolve para a lista de endereços IP dos endpoints nos clusters de exportação. Cada pod de back-end com um nome do host também pode ser endereçado de forma independente com um nome de domínio da seguinte forma:
HOSTNAME.MEMBERSHIP_NAME.LOCATION.SERVICE_EXPORT_NAME.NAMESPACE.svc.clusterset.local
A saída inclui os seguintes valores:
SERVICE_EXPORT_NAME
eNAMESPACE
: os valores definidos no objetoServiceExport
.MEMBERSHIP_NAME
: o identificador exclusivo na frota do cluster em que o pod está.LOCATION
: o local da assinatura. As assinaturas sãoglobal
, ou o local delas é uma das regiões ou zonas em que o pod está, comous-central1
.HOSTNAME
: o nome do host do pod.
Também é possível endereçar um pod de back-end com um nome do host exportado de um cluster, registrado com uma assinatura global, usando um nome de domínio do seguinte formato:
HOSTNAME.MEMBERSHIP_NAME.SERVICE_EXPORT_NAME.NAMESPACE.svc.clusterset.local
Como desativar o MCS
Para desativar o MCS, siga estas etapas:
Para cada cluster na frota, exclua cada objeto ServiceExport que você criou:
kubectl delete serviceexport SERVICE_EXPORT_NAME \ -n NAMESPACE
Substitua:
SERVICE_EXPORT_NAME
: nome do objeto ServiceExport.NAMESPACE
: o namespace do objetoServiceExport
.
Verifique se o
ServiceExport
desaparece da lista em 30 minutos.Cancele o registro dos clusters da frota se eles não precisarem ser registrados para outra finalidade.
Desative o recurso
multiclusterservicediscovery
:gcloud container fleet multi-cluster-services disable \ --project PROJECT_ID
Substitua
PROJECT_ID
pelo ID do projeto em que você registrou os clusters.Desative a API do MCS:
gcloud services disable multiclusterservicediscovery.googleapis.com \ --project PROJECT_ID
Substitua
PROJECT_ID
pelo ID do projeto em que você registrou os clusters.
Limitações
Os limites a seguir não são aplicados e, em alguns casos, é possível exceder esses limites dependendo da carga nos clusters ou no projeto e na taxa de desligamento de endpoints. No entanto, podem ocorrer problemas de desempenho quando essas limitações forem excedidas.
Exportação de clusters: um único serviço, identificado por um nome de namespace, pode ser exportado com segurança de até cinco clusters simultaneamente. Além desse limite, é possível que apenas um subconjunto de endpoints possa ser importado para clusters de consumo. É possível exportar serviços diferentes de subconjuntos variados de clusters.
O número de pods por trás de um único serviço: é seguro quando você continuar com menos de 250 pods em um único serviço. Essa é a mesma limitação de serviços de cluster único. Com cargas de trabalho relativamente estáticas e um pequeno número de serviços com vários clusters, é possível exceder significativamente esse número em milhares de endpoints por serviço. Como acontece com os serviços de cluster único, todos os endpoints são monitorados por
kube-proxy
em cada nó. Ao ultrapassar esse limite, especialmente ao exportar de vários clusters simultaneamente, nós maiores podem ser necessários.O número de serviços de vários clusters exportados simultaneamente: recomendamos que você exporte simultaneamente não mais de 50 portas de serviço exclusivas, identificadas pelo nome com namespace de um serviço e portas declaradas. Por exemplo, exportar um serviço que expõe as portas 80 e 443 contaria de acordo com dois dos 50 limites de portas de serviço únicas. Serviços com o mesmo nome de namespace exportado de vários clusters contam como um único serviço exclusivo. O serviço de porta 2 mencionado anteriormente ainda só contaria duas portas se fosse exportado de cinco clusters simultaneamente. Cada serviço de vários clusters é contabilizado na cota dos serviços de back-end e cada cluster de exportação ou zona cria um grupo de endpoints da rede (NEG, na sigla em inglês):
Tipos de serviço: o MCS é compatível apenas com ClusterSetIP e serviços headless. Os serviços NodePort e LoadBalancer não são compatíveis e podem causar um comportamento inesperado.
Como usar o agente IPmasq com o MCS: o MCS opera conforme esperado quando você usa um intervalo de IP de pod padrão ou não mascarado.
Se você usar um intervalo de IP de pod personalizado ou um ConfigMap do agente IPmasq personalizado, será possível mascarar o tráfego do MCS. Isso impede que o MCS funcione porque as regras de firewall só permitem o tráfego de IPs de pod.
Para evitar esse problema, use o intervalo de IP de pod padrão ou especifique todos os intervalos de IP de pod no campo
nonMasqueradeCIDRs
do ConfigMap do agente IPmasq. Se você usar o Autopilot ou se precisar usar um intervalo de IP de pod não padrão e não puder especificar todos os intervalos de IP de pod no ConfigMap, use a política de NAT de saída para configurar o mascaramento de IP.
MCS com clusters em vários projetos
Não será possível exportar um serviço se ele já estiver sendo exportado por outros clusters em um projeto diferente na frota com o mesmo nome e namespace. É possível acessar o serviço em outros clusters da frota em outros projetos, mas esses clusters não podem exportar o mesmo serviço no mesmo namespace.
Solução de problemas
As seções a seguir fornecem dicas de solução de problemas para o MCS.
Como visualizar o featureState
A visualização do estado do recurso pode confirmar se o MCS foi configurado. Visualize o estado do recurso do MCS usando o seguinte comando:
gcloud container fleet multi-cluster-services describe
A saída será assim:
createTime: '2021-08-10T13:05:23.512044937Z'
membershipStates:
projects/PROJECT_ID/locations/global/memberships/MCS_NAME:
state:
code: OK
description: Firewall successfully updated
updateTime: '2021-08-10T13:14:45.173444870Z'
name: projects/PROJECT_NAME/locations/global/features/multiclusterservicediscovery
resourceState:
state: ACTIVE
spec: {}
Os campos mais úteis para resolver problemas são code
e description
.
Códigos no featureState
Um código indica o estado geral do membro em relação ao MCS. Esses campos podem
ser encontrados no campo state.code
. Há três códigos
possíveis:
OK
: a assinatura foi adicionada ao MCS e está pronta para uso.WARNING
: o MCS está em processo de reconciliação da configuração da assinatura. O campo de descrição pode fornecer mais informações sobre o que causou esse código.FAILED
: esta assinatura não foi adicionada ao MCS. Outras assinaturas na frota com um códigoOK
não são afetadas por esta assinatura deFAILED
. O campo de descrição pode fornecer mais informações sobre o que causou esse código.ERROR
: essa assinatura não tem recursos. Outras assinaturas na frota com um códigoOK
não são afetadas por esta assinatura deERROR
. O campo de descrição pode fornecer mais informações sobre o que causou esse código.
Descrições no featureState
Uma descrição fornece mais informações sobre o estado da assinatura no
MCS. Essas descrições estão disponíveis no campo state.description
,
e é possível que as seguintes sejam exibidas:
Firewall successfully created
: essa mensagem indica que a regra de firewall do membro foi criada e atualizada. O código da assinatura éOK
.Firewall creation pending
: essa mensagem indica que a regra de firewall do membro está com criação ou atualização pendente. O código da assinatura éWARNING
. Essa assinatura pode ter problemas para atualizar e se conectar a novos serviços de vários clusters e assinaturas adicionados enquanto a regra de firewall está pendente.GKE Cluster missing
: essa mensagem indica que o cluster registrado do GKE está indisponível e/ou excluído. O código da assinatura éERROR
. Essa assinatura precisa ser manualmente cancelada do registro da frota depois que um cluster do GKE for excluído.Project that member lives in is missing required permissions and/or has not enabled all required APIs - additional setup steps are required
: esta mensagem indica que há erros internos StatusForbidden (403) e o código da assinatura éFAILED
. Esse erro ocorre nos seguintes cenários:Você não ativou as APIs necessárias no projeto do membro.
Se o cluster do membro residir em um projeto separado da frota, consulte configuração entre projetos para garantir que você concluiu todas as etapas necessárias. Se você concluiu todas as etapas, verifique se as seguintes APIs estão ativadas no projeto de registro com os seguintes comandos:
gcloud services enable multiclusterservicediscovery.googleapis.com --project PROJECT_ID gcloud services enable dns.googleapis.com --project PROJECT_ID gcloud services enable trafficdirector.googleapis.com --project PROJECT_ID gcloud services enable cloudresourcemanager.googleapis.com --project PROJECT_ID
Substitua
PROJECT_ID
pelo ID do projeto em que você registrou os clusters.A conta de serviço
mcsd
ougkehub
requer mais permissões no projeto do membro.As contas de serviço
mcsd
egkehub
precisam ter sido criadas automaticamente no projeto host da frota com todas as permissões necessárias. Para verificar se as contas de serviço existem, execute os seguintes comandos:gcloud projects get-iam-policy PROJECT_ID | grep gcp-sa-mcsd gcloud projects get-iam-policy PROJECT_ID | grep gcp-sa-gkehub
Substitua
PROJECT_ID
pelo ID do projeto host da frota.
Esses comandos mostram o nome completo das contas de serviço
mcsd
egkehub
.Multiple VPCs detected in the hub - VPC must be peered with other VPCs for successful connectivity
: essa mensagem ocorre quando os clusters hospedados em VPCs diferentes são registrados na mesma frota. O status da assinatura éOK
. A rede VPC de um cluster é definida pela rede do NetworkConfig dele. Os serviços de vários clusters precisam de uma rede simples, e essas VPCs precisam estar ativamente em peering para que os serviços de vários clusters se conectem uns aos outros adequadamente. Para saber mais, consulte Exemplo de configuração de peering de rede VPC.Member does not exist in the same project as hub - additional setup steps are required, errors may occur if not completed.
: essa mensagem enfatiza que os clusters entre projetos exigem etapas de configuração adicionais. O status da assinatura éOK
. As associações entre projetos são definidas como um cluster de membro que não está no mesmo projeto que a frota. Para mais informações, consulte a configuração entre projetos.Non-GKE clusters are currently not supported
: esta mensagem enfatiza que o MCS é compatível apenas com clusters do GKE. Clusters que não são do GKE não podem ser adicionados ao MCS. O status da assinatura éFAILED
.
Problemas conhecidos
Serviços MCS com várias portas
Há um problema conhecido com serviços de vários clusters com várias portas (TCP/UDP) no GKE Dataplane V2, em que alguns endpoints não estão programados no plano de dados. Esse problema afeta as versões do GKE anteriores à 1.26.3-gke.400.
Como solução alternativa, ao usar o GKE Dataplane V2, use vários MCS com uma única porta em vez de um MCS com várias portas.
MCS com VPC compartilhada
Com a implementação atual do MCS, se você implantar mais de uma frota na mesma VPC compartilhada, os metadados serão compartilhados entre as frotas. Quando um serviço é criado em uma frota, os metadados dele são exportados ou importados em todas as outras frotas que fazem parte da mesma VPC compartilhada e visíveis ao usuário.
Esse comportamento será corrigido em uma versão futura do MCS.
A verificação de integridade usa a porta padrão em vez de containerPort
Quando você implanta um Serviço com um campo targetPort
que faz referência a uma porta nomeada em
uma implantação, o MCS configura a porta padrão para a verificação de integridade em vez do
containerPort
especificado.
Para evitar esse problema, use valores numéricos no campo de serviço
ports.targetPort
e no campo de implantação
readinessProbe.httpGet.port
em vez de valores nomeados.
Esse comportamento será corrigido em uma versão futura do MCS.
A seguir
- Saiba mais sobre os serviços
- Saiba como expor apps com serviços.
- Implemente um exemplo de serviços de vários clusters básico.