Como configurar um Ingress de vários clusters

Visão geral

Se você tiver um aplicativo em execução em vários clusters do Google Kubernetes Engine localizados em regiões diferentes, poderá encaminhar o tráfego para um cluster na região mais próxima do usuário.

Esta página usa a ferramenta de linha de comando kubemci para configurar um Balanceador de carga HTTP do Cloud usando uma Entrada do Kubernetes para rotear o tráfego em vários clusters em diferentes regiões.

Antes de começar

Execute as etapas a seguir para se preparar para a tarefa:

  • Verifique se o SDK do Cloud está instalado.
  • Inicialize gcloud com o seguinte comando:

    gcloud init
    • Escolha a conta que você pretende usar ou faça login com uma nova conta.
    • Insira o código do projeto ou crie um projeto novo.
    • Configure uma região e uma zona de computação padrão.
  • Autentique-se e permita que o SDK do Google Cloud visualize e gerencie seus dados dos serviços do Google Cloud Platform:

    gcloud auth login
  • Autentique-se e permita que a biblioteca de autenticação do Google visualize e gerencie seus dados nos serviços do Google Cloud Platform:

    gcloud auth application-default login
  • Instale a ferramenta de linha de comando kubectl:

    gcloud components install kubectl
  • Certifique-se de ter dois ou mais clusters do GKE em execução no mesmo projeto e rede do GCP.

Faça o download da ferramenta de linha de comando kubemci

kubemci é a principal ferramenta de linha de comando usada para criar e configurar uma entrada de vários clusters.

Faça o download de um dos binários e coloque-o em um caminho executável:

Assegure-se de que o binário seja executável. Isso pode ser feito no diretório do binário com o seguinte comando:

chmod +x ./kubemci

Como criar uma Entrada de vários clusters

Prepare seus clusters

Para cada serviço que você pretende usar na Entrada de vários clusters, ele precisa ser configurado da mesma forma em todos os clusters. Especificamente, esse serviço precisa:

  • ter o mesmo nome em todos os clusters;
  • estar no mesmo namespace em todos os clusters;
  • seja do tipo NodePort.
  • usar o mesmo número de porta para todos os clusters.

    Por exemplo, se sua Entrada exigir dois serviços, service-foo e service-bar, então:

    • service-foo é um nodePort na porta 30016 em todos os clusters.
    • service-bar é um nodePort na porta 30017 em todos os clusters.

Consulte a seção Implantar um serviço nodePort em cada cluster para instruções mais detalhadas.

Criar um arquivo kubeconfig

A ferramenta de linha de comando kubemci requer um arquivo kubeconfig que contenha as informações de conexão dos clusters do GKE que receberão tráfego.

Execute o seguinte comando para cada cluster para criar um arquivo kubeconfig contendo credenciais para todos os clusters:

KUBECONFIG=[PATH/TO/MCI_KUBECONFIG_FILE]
gcloud container clusters get-credentials \
    --zone=[ZONE_NAME] [CLUSTER_NAME]

Exemplo:

KUBECONFIG=~/mcikubeconfig gcloud container clusters get-credentials --zone=us-east4-a  cluster-us-east
KUBECONFIG=~/mcikubeconfig gcloud container clusters get-credentials --zone=europe-west1-c  cluster-eu-west
KUBECONFIG=~/mcikubeconfig gcloud container clusters get-credentials --zone=asia-east1-b  cluster-apac-east

Implantar um serviço NodePort para cada cluster

Coloque o serviço e os arquivos de manifesto de implantação do aplicativo no mesmo diretório para facilitar a implantação. Por exemplo, os dois arquivos a seguir podem ser colocados no diretório app/:

Exemplo de arquivo de manifesto de implantação

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  selector:
    matchLabels:
      app: my-app
  replicas: 2
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: hello-app
        image: gcr.io/google-samples/hello-app:1.0

Exemplo de arquivo de manifesto de serviço

apiVersion: v1
kind: Service
metadata:
  labels:
    app: my-app
  name: service-foo
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
    name: http
    nodePort: 30061
  selector:
    app: my-app
  type: NodePort

Você pode fazer a iteração em todos os clusters e receber os contextos para implantar o aplicativo, junto com o respectivo serviço nodePort, executando a seguinte repetição:

KUBECONFIG=[PATH/TO/MCI_KUBECONFIG_FILE]
for ctx in $(kubectl config get-contexts -o name); do
  kubectl --context="${ctx}" create -f [PATH/TO/APP/FILES]
done

Reservar um IP estático

Solicite um IP estático para a Entrada de vários clusters no Google Cloud Platform executando o seguinte comando:

gcloud compute addresses create --global [IP_RESOURCE_NAME]

Por exemplo, se você nomear o recurso de IP my-mci-ip, ele será:

gcloud compute addresses create --global my-mci-ip

Preparar o recurso Entrada

Em cada cluster, a especificação do recurso de Entrada precisa ter o campo de metadados annotations e o campo backend configurados com valores para a Entrada de vários clusters.

Veja a seguir um exemplo de arquivo de recurso de Entrada, mcingress.yaml:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-foo
  annotations:
    kubernetes.io/ingress.global-static-ip-name: my-mci-ip
    kubernetes.io/ingress.class: gce-multi-cluster
spec:
  backend:
    serviceName: service-foo
    servicePort: 80

Adicione ou modifique o annotations:

  • Defina o valor de kubernetes.io/ingress.global-static-ip-name para seu [IP_RESOURCE_NAME].
  • Defina o valor de kubernetes.io/ingress.class como gce-multi-cluster.

Defina um serviço backend:

  • Defina o valor de serviceName como o nome do serviço padrão.
  • Defina o valor de servicePort como a porta do serviço padrão.

Implantar a Entrada de vários clusters

Use kubemci para criar a Entrada de vários clusters com o seguinte comando:

kubemci create [INGRESS_NAME] \
    --ingress=[PATH/TO/INGRESS_FILE] \
    --gcp-project=[optional PROJECT_ID] \
    --kubeconfig=[PATH/TO/MCI_KUBECONFIG_FILE]
Exemplo:
kubemci create my-mci \
    --ingress=mcingress.yaml \
    --gcp-project=my-gcp-project \
    --kubeconfig=~/mcikubeconfig

A resposta é uma série de mensagens para confirmar o processo de criação, por exemplo:

Ensuring health checks
...
Health check mci1-hc-30061--my-mci created successfully
...
Backend service mci1-be-30061--my-mci created successfully
...
URL Map mci1-um--my-mci created successfully
...
Target http proxy mci1-tp--my-mci created successfully
...
Forwarding rule mci1-fw--my-mci created successfully
...
Firewall rule mci1-fr--my-mci created successfully

Success.

Como conseguir o status de uma Entrada de vários clusters

Para listar todas as entradas de vários clusters existentes que foram criadas usando a kubemci, execute o seguinte comando:

kubemci list --gcp-project=[PROJECT_ID]

A resposta é uma lista de entradas de vários clusters semelhante a esta:

NAME           IP              CLUSTERS
my-mci   1.2.3.4   gke_my-gcp-project_asia-east1-b_cluster-asia-east, gke_my-gcp-project_europe-west1-c_cluster-eu-west, gke_my-gcp-project_us-east4-a_cluster-us-east

Você pode então conseguir o status de uma Entrada de vários clusters específica com o seguinte comando:

kubemci get-status [INGRESS_NAME] --gcp-project=[PROJECT_ID]

A resposta é uma mensagem de status semelhante a esta:

Load balancer my-mci has IPAddress 1.2.3.4 and is spread across 3 clusters
(gke_project-name_asia-east1-b_cluster-asia-east, gke_project-name_europe-west1-c_cluster-eu-west,
gke_project-name_us-east4-a_cluster-us-east)

Como atualizar uma Entrada de vários clusters existente

usando a sinalização --force

Para atualizar uma Entrada existente de vários clusters, execute o comando kubemci create com a sinalização --force:

kubemci create [INGRESS_NAME] \
    --ingress=[PATH/TO/INGRESS_FILE] \
    --gcp-project=[PROJECT_ID] \
    --kubeconfig=[PATH/TO/MCI_KUBECONFIG_FILE] \
    --force

delete, recreate

Como alternativa, para atualizar uma Entrada de vários clusters, você pode excluí-la e criá-la novamente:

kubemci delete [INGRESS_NAME] \
    --ingress=[PATH/TO/INGRESS_FILE] \
    --gcp-project=[PROJECT_ID] \
    --kubeconfig=[PATH/TO/MCI_KUBECONFIG_FILE]
kubemci create [INGRESS_NAME] \
    --ingress=[PATH/TO/INGRESS_FILE] \
    --gcp-project=[PROJECT_ID] \
    --kubeconfig=[PATH/TO/MCI_KUBECONFIG_FILE]

Como remover clusters de uma Entrada de vários clusters existente

Para remover clusters de uma Entrada de vários clusters existente, primeiro crie um kubeconfig que contenha uma lista de clusters que devem ser removidos do cluster e, em seguida, execute o comando kubemci remove-clusters:

kubemci remove-clusters [INGRESS_NAME] \
    --ingress=[PATH/TO/INGRESS_FILE] \
    --gcp-project=[PROJECT_ID] \
    --kubeconfig=[PATH/TO/REMOVAL_KUBECONFIG_FILE]

Como excluir uma Entrada de vários clusters

Para excluir uma Entrada de vários clusters, use o comando kubemci delete:

kubemci delete [INGRESS_NAME] \
    --ingress=[PATH/TO/INGRESS_FILE] \
    --gcp-project=[PROJECT_ID] \
    --kubeconfig=[PATH/TO/MCI_KUBECONFIG_FILE]

Ele envia uma série de mensagens para confirmar o processo de exclusão, por exemplo:

Deleting Ingress from cluster: gke_project-name_asia-east1-b_cluster-asia-east...
...
firewall rule mci1-fr--my-mci deleted successfully
...
http forwarding rule mci1-fw--my-mci deleted successfully
...
target HTTPS proxy mci1-tps--my-mci deleted successfully
...
ssl cert mci1-ssl--my-mci deleted successfully
...
url map mci1-um--my-mci deleted successfully
...
Successfully deleted all backend services
...
Successfully deleted all health checks

A seguir