Configurar tráfico de entrada de varios clústeres

Descripción general

Si tienes una aplicación que se ejecute en varios clústeres de Google Kubernetes Engine ubicada en distintas regiones, puedes enrutar el tráfico a un clúster de la región más cercana al usuario.

En esta página se usa la herramienta de línea de comandos de kubemci para configurar un Balanceador de cargas de HTTP de Cloud mediante Ingress de Kubernetes para enrutar el tráfico entre varios clústeres en distintas regiones.

Antes de comenzar

Sigue estos pasos a fin de prepararte para esta tarea:

  • Asegúrate de que instalaste el SDK de Cloud.
  • Inicializa gcloud con el siguiente comando:

    gcloud init
    • Selecciona la cuenta que deseas usar o accede con una nueva.
    • Ingresa tu ID del proyecto o crea uno nuevo.
    • Configura la región y zona de procesamiento predeterminadas:
  • Autentica y autoriza al SDK de Google Cloud para ver y administrar tus datos entre los servicios de Google Cloud Platform:

    gcloud auth login
  • Autentica y autoriza a Google Auth Library para ver y administrar tus datos entre los servicios de Google Cloud Platform:

    gcloud auth application-default login
  • Instala la herramienta de línea de comandos de kubectl:

    gcloud components install kubectl
  • Asegúrate de tener dos o más clústeres de GKE en ejecución en la misma red y el mismo proyecto de GCP.

Descargar la herramienta de línea de comandos de kubemci

kubemci es la principal herramienta de línea de comandos que se usa para crear y configurar Ingress de varios clústeres.

Descarga uno de los objetos binarios y ponlo en una ruta ejecutable:

Asegúrate de que el objeto binario sea ejecutable. Esto se puede hacer en el directorio del objeto con el siguiente comando:

chmod +x ./kubemci

Crear Ingress de varios clústeres

Prepara tus clústeres

La configuración del servicio que pienses usar en Ingress de varios clústeres debe ser la misma en todos los clústeres. Específicamente, debe cumplir con lo siguiente:

  • Debe tener el mismo nombre en todos los clústeres.
  • Debe estar en el mismo espacio de nombres en todos los clústeres.
  • Debe ser del tipo NodePort.
  • Debe usar el mismo número de puerto en todos los clústeres.

    Por ejemplo, si Ingress requiere dos servicios, service-foo y service-bar, entonces:

    • service-foo es un nodePort en el puerto 30016 en todos los clústeres.
    • service-bar es un nodePort en el puerto 30017 en todos los clústeres.

Consulta la sección Implementar un servicio nodePort en cada clúster para obtener información más detallada.

Crea un archivo kubeconfig

La herramienta de línea de comandos de kubemci requiere un archivo kubeconfig que contenga la información de conexión de los clústeres de GKE que recibirán tráfico.

Ejecuta el siguiente comando en cada clúster para crear un archivo kubeconfig que contenga las credenciales de todos los clústeres:

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

Por ejemplo:

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

Implementar un servicio nodePort en cada clúster

A fin de facilitar la implementación, pon los archivos de manifiesto de la implementación de la aplicación y del servicio en el mismo directorio. Por ejemplo, los siguientes archivos se deberían poner en el directorio app/:

Ejemplo de archivo de manifiesto de implementación

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

Ejemplo de archivo de manifiesto de servicio

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

Para realizar la iteración en todos los clústeres y obtener los contextos para implementar la aplicación junto con el servicio nodePort, ejecuta el siguiente bucle:

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 una dirección IP estática

Para solicitar una dirección IP estática para Ingress de varios clústeres en Google Cloud Platform, ejecuta el siguiente comando:

gcloud compute addresses create --global [IP_RESOURCE_NAME]

Por ejemplo, si al recurso de IP le asignas el nombre my-mci-ip, el comando quedaría de esta forma:

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

Preparar el recurso Ingress

En cada clúster, el spec del recurso Ingress debe tener configurados el campo de metadatos annotations y el campo backend con los valores correspondientes al Ingress de varios clústeres.

A continuación, se muestra un ejemplo de un archivo de recursos de Ingress, 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

Agrega o modifica annotations:

  • Configura el valor de kubernetes.io/ingress.global-static-ip-name en tu [IP_RESOURCE_NAME].
  • Configura el valor de kubernetes.io/ingress.class en gce-multi-cluster.

Configura un servicio de backend:

  • Configura el valor de serviceName en el nombre del servicio predeterminado.
  • Configura el valor de servicePort en el puerto del servicio predeterminado.

Implementar Ingress de varios clústeres

Usa kubemci para crear Ingress de varios clústeres con el siguiente comando:

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

Aparecerán varios mensajes para confirmar el proceso de creación, por ejemplo:

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.

Obtener el estado de Ingress de varios clústeres

Para enumerar los Ingresses de varios clústeres existentes que se crearon con kubemci, ejecuta el siguiente comando:

kubemci list --gcp-project=[PROJECT_ID]

Aparecerá una lista similar a la siguiente:

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

Para obtener el estado de uno en específico, ejecuta el siguiente comando:

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

Aparecerá un mensaje de estado similar al siguiente:

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)

Actualizar un Ingress de varios clústeres existente

Con la marca --force

Para actualizar un Ingress de varios clústeres existente, ejecuta el comando kubemci create con la marca --force:

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

borrar, recrear

De manera alternativa, para actualizar Ingress de varios clústeres, puedes borrarlo y volver a crearlo:

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]

Quitar clústeres de un Ingress de varios clústeres existente

Para quitar clústeres de un Ingress de varios clústeres existente, primero, crea un archivo kubeconfig que contenga una lista de los clústeres que se quitarán y, luego, ejecuta el comando kubemci remove-clusters:

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

Borrar un Ingress de varios clústeres

Para borrar un Ingress de varios clústeres, usa el comando kubemci delete:

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

Aparecerán varios mensajes para confirmar el proceso de eliminación, por ejemplo:

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

Pasos siguientes

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...