Configurar nombres de dominio con direcciones IP estáticas


En este tutorial se muestra cómo usar Google Kubernetes Engine (GKE) para exponer tu aplicación web en Internet con una dirección IP externa estática y cómo configurar un nombre de dominio para que dirija a tu aplicación.

En este tutorial se da por hecho que tienes un nombre de dominio registrado, como example.com.

Objetivos

Este tutorial muestra los siguientes pasos:

  • Reserva una dirección IP externa estática para tu aplicación.
  • Configura los recursos Service o Ingress para que usen la dirección IP estática.
  • Actualiza los registros DNS de tu nombre de dominio para apuntar a tu aplicación.

Costes

En este documento, se utilizan los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costes basada en el uso previsto, utiliza la calculadora de precios.

Los usuarios nuevos Google Cloud pueden disfrutar de una prueba gratuita.

Cuando termines las tareas que se describen en este documento, puedes evitar que se te siga facturando eliminando los recursos que has creado. Para obtener más información, consulta la sección Limpiar.

Antes de empezar

Sigue estos pasos para habilitar la API de Kubernetes Engine:
  1. Ve a la página de Kubernetes Engine en la Google Cloud consola.
  2. Crea o selecciona un proyecto.
  3. Espera a que la API y los servicios relacionados se habiliten. Este proceso puede tardar varios minutos.
  4. Verify that billing is enabled for your Google Cloud project.

Instala las siguientes herramientas de línea de comandos utilizadas en este tutorial:

  • gcloud se usa para crear y eliminar clústeres de Kubernetes Engine. gcloud se incluye en la CLI de gcloud.
  • kubectl se usa para gestionar Kubernetes, el sistema de orquestación de clústeres que utiliza Kubernetes Engine. Puedes instalar kubectl con gcloud:
    gcloud components install kubectl

Clona el código de ejemplo de GitHub:

git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
cd kubernetes-engine-samples/quickstarts/hello-app/manifests

Configurar los valores predeterminados de la herramienta de línea de comandos gcloud

Para ahorrar tiempo al escribir el ID de proyecto y las opciones de zona de Compute Engine en la herramienta de línea de comandos gcloud, puedes definir los valores predeterminados:
gcloud config set project project-id
gcloud config set compute/zone compute-zone

Crear un clúster

Para crear un clúster, sigue estos pasos:

gcloud container clusters create-auto domain-test

Desplegar una aplicación web

El siguiente manifiesto describe un Deployment que ejecuta una imagen de contenedor de una aplicación web de ejemplo:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: helloweb
  labels:
    app: hello
spec:
  selector:
    matchLabels:
      app: hello
      tier: web
  template:
    metadata:
      labels:
        app: hello
        tier: web
    spec:
      containers:
      - name: hello-app
        image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
        ports:
        - containerPort: 8080
        resources:
          requests:
            cpu: 200m

Crea el despliegue:

kubectl apply -f helloweb-deployment.yaml

Exponer tu aplicación

Puedes exponer tu aplicación en GKE con cualquiera de los siguientes métodos:

Para obtener más información sobre las ventajas y desventajas de cada método, consulta el artículo Configurar un Application Load Balancer externo con Ingress.

Usar un servicio

Para asegurarte de que tu aplicación tenga una dirección IP externa estática, debes reservar una dirección IP estática.

Si decides exponer tu aplicación mediante un servicio, debes crear una dirección IP regional. Las direcciones IP globales solo funcionan con el tipo de recurso Ingress, tal como se explica en la siguiente sección.

Para usar un servicio, crea una dirección IP estática llamada helloweb-ip en la región us-central1:

gcloud

gcloud compute addresses create helloweb-ip --region us-central1

Busca la dirección IP estática que has creado:

gcloud compute addresses describe helloweb-ip --region us-central1

El resultado debería ser similar al siguiente:

...
address: 203.0.113.32
...

Config Connector

Nota: Para este paso se necesita Config Connector. Sigue las instrucciones de instalación para instalar Config Connector en tu clúster.

apiVersion: compute.cnrm.cloud.google.com/v1beta1
kind: ComputeAddress
metadata:
  name: helloweb-ip
spec:
  location: us-central1

Guarda el archivo de manifiesto como compute-address-regional.yaml.

Aplica el manifiesto a tu clúster:

  kubectl apply -f compute-address-regional.yaml

Busca la dirección IP estática que has creado:

  kubectl get computeaddress helloweb-ip -o jsonpath='{.spec.address}'

El siguiente manifiesto describe un Service de tipo LoadBalancer, que crea un balanceador de carga de red de paso a través externo para exponer pods con una dirección IP externa.

Sustituye YOUR.IP.ADDRESS.HERE por la dirección IP estática:

apiVersion: v1
kind: Service
metadata:
  name: helloweb
  labels:
    app: hello
spec:
  selector:
    app: hello
    tier: web
  ports:
  - port: 80
    targetPort: 8080
  type: LoadBalancer
  loadBalancerIP: "YOUR.IP.ADDRESS.HERE"

Crea el servicio:

kubectl apply -f helloweb-service-static-ip.yaml

Consulta la dirección IP reservada asociada al balanceador de carga:

kubectl get service

El resultado debería ser similar al siguiente:

NAME               CLUSTER-IP      EXTERNAL-IP      PORT(S)          AGE
helloweb           10.31.254.176   203.0.113.32     80:30690/TCP     54s

Usar un Ingress

Si decides exponer tu aplicación mediante un Ingress, debes reservar una dirección IP estática global. Usa la anotación kubernetes.io/ingress.global-static-ip-name para especificar una dirección IP global.

Para exponer tu aplicación a clientes y servicios de una región, usa una dirección IP interna estática regional al desplegar un recurso de entrada interno para GKE junto con las anotaciones necesarias.

Para saber cómo usar Ingress para exponer tus aplicaciones a Internet, consulta el artículo Configurar un balanceador de carga de aplicación externo con Ingress.

Para crear una dirección IP estática global llamada helloweb-ip, sigue estos pasos:

gcloud

gcloud compute addresses create helloweb-ip --global

Busca la dirección IP estática que has creado:

gcloud compute addresses describe helloweb-ip --global

El resultado debería ser similar al siguiente:

...
address: 203.0.113.32
...

Config Connector

Nota: Para este paso se necesita Config Connector. Sigue las instrucciones de instalación para instalar Config Connector en tu clúster.

apiVersion: compute.cnrm.cloud.google.com/v1beta1
kind: ComputeAddress
metadata:
  name: helloweb-ip
spec:
  location: global

Guarda el archivo de manifiesto como compute-address-global.yaml.

Aplica el manifiesto a tu clúster:

  kubectl apply -f compute-address-global.yaml

El siguiente manifiesto describe un Ingress que expone una aplicación web en una IP estática con dos recursos:

  • Service con type:NodePort
  • Un Ingress configurado con el nombre del servicio y la anotación de IP estática
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: helloweb
  annotations:
    kubernetes.io/ingress.global-static-ip-name: helloweb-ip
  labels:
    app: hello
spec:
  defaultBackend:
    service:
      name: helloweb-backend
      port:
        number: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: helloweb-backend
  labels:
    app: hello
spec:
  type: NodePort
  selector:
    app: hello
    tier: web
  ports:
  - port: 8080
    targetPort: 8080

La anotación kubernetes.io/ingress.global-static-ip-name especifica el nombre del recurso de dirección IP global que se va a asociar al balanceador de carga.

Aplica el manifiesto a tu clúster:

kubectl apply -f helloweb-ingress-static-ip.yaml

Consulta la dirección IP asociada al balanceador de carga:

kubectl get ingress

La salida es similar a la siguiente:

NAME       HOSTS     ADDRESS          PORTS     AGE
helloweb   *         203.0.113.32     80        4m

Ver tu dirección IP estática reservada

Para verificar que el balanceador de carga está configurado correctamente, puedes usar un navegador web para visitar la dirección IP o usar curl:

curl http://203.0.113.32/

El resultado debería ser similar al siguiente:

Hello, world!
Hostname: helloweb-3766687455-8lvqv

Configurar los registros de nombre de dominio

Para que los navegadores que consulten tu nombre de dominio, como example.com, o tu nombre de subdominio, como blog.example.com, dirijan a la dirección IP estática que has reservado, debes actualizar los registros DNS (servidor de nombres de dominio) de tu nombre de dominio.

Debes crear un registro DNS de tipo A (dirección) para tu nombre de dominio o subdominio y configurar su valor con la dirección IP reservada.

Los registros DNS de tu dominio los gestiona tu servidor de nombres. Tu servidor de nombres puede ser el "registrador" en el que registraste tu dominio, un servicio de DNS como Cloud DNS u otro proveedor externo.

  • Si tu servidor de nombres es Cloud DNS: sigue la guía de inicio rápido de Cloud DNS para configurar el registro A de DNS de tu nombre de dominio con la dirección IP reservada de tu aplicación.

  • Si tu servidor de nombres es de otro proveedor: consulta la documentación de tu proveedor de DNS sobre cómo configurar registros A de DNS para configurar tu nombre de dominio. Si prefieres usar Cloud DNS, consulta el artículo Migrar a Cloud DNS.

Visita el nombre de tu dominio

Para verificar que los registros DNS A de tu nombre de dominio se resuelven en la dirección IP que has reservado, visita tu nombre de dominio.

Para hacer una consulta DNS del registro A de tu nombre de dominio, ejecuta el comando host:

host example.com

El resultado debería ser similar al siguiente:

example.com has address 203.0.113.32

Ahora puedes dirigir tu navegador web a tu nombre de dominio y visitar tu sitio web.

Limpieza

Para evitar que los recursos utilizados en este tutorial se cobren en tu cuenta de Google Cloud, elimina el proyecto que contiene los recursos o conserva el proyecto y elimina los recursos.

  1. Elimina el servicio y el objeto Ingress:

    kubectl delete ingress,service -l app=hello
    
  2. Libera la IP estática reservada. Una vez eliminado el balanceador de carga, se facturará la dirección IP no utilizada pero reservada según los precios por dirección IP no utilizada.

    • Si has usado un Servicio:

      gcloud compute addresses delete helloweb-ip --region us-central1
      
    • Si has usado un Ingress:

      gcloud compute addresses delete helloweb-ip --global
      
  3. Elimina la aplicación de muestra:

    kubectl delete -f helloweb-deployment.yaml
    
  4. Elimina el clúster:

    gcloud container clusters delete domain-test
    

Siguientes pasos