Configura Ingress para 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 a fin de 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 haber instalado el SDK de Cloud.
  • Inicializa gcloud con el siguiente comando:

    gcloud init
    • Elige la cuenta que te gustaría usar o accede con una cuenta 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.

Descarga la herramienta de línea de comandos de kubemci

kubemci es la principal herramienta de línea de comandos que se usa con el fin de crear y configurar una entrada de tráfico para 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 binario con el siguiente comando:

chmod +x ./kubemci

Crea una entrada de tráfico para varios clústeres

Prepara tus clústeres

La configuración del servicio que pienses usar en entrada de tráfico de varios clústeres debe ser la misma en todos los clústeres. En particular, el servicio debe cumplir con lo siguiente:

  • Tener el mismo nombre en todos los clústeres.
  • Estar en el mismo espacio de nombres en todos los clústeres.
  • 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 Implementa 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

Implementa 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 la implementación

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

Ejemplo de archivo de manifiesto del 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 a fin de 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

Reserva una dirección IP estática

Ejecuta el siguiente comando a fin de solicitar una dirección IP estática para Ingress destinada a varios clústeres en Google Cloud Platform:

gcloud compute addresses create --global [IP_RESOURCE_NAME]

Por ejemplo, si le asignas el nombre my-mci-ip al recurso de la IP, debe ser lo siguiente:

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

Prepara el recurso Ingress

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

El siguiente es un ejemplo de 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 el annotations:

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

Configura un servicio backend:

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

Implementa Ingress para varios clústeres

Usa kubemci a fin de crear Ingress para 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.

Obtén el estado de Ingress para varios clústeres

A fin de enumerar los Ingresses para 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 que aparece a continuación:

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)

Actualiza un Ingress para varios clústeres existente

con la marca --force

A fin de actualizar un Ingress para varios clústeres existentes, 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, a fin de actualizar Ingress para 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]

Quita clústeres de un Ingress para varios clústeres existente

A fin de quitar clústeres de un Ingress para 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]

Borra un Ingress para varios clústeres

Si deseas borrar un Ingress para 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...

Documentación de Kubernetes Engine