Configura nombres de dominio con direcciones IP estáticas

En este instructivo, se demuestra cómo exponer tu aplicación web a la Internet en una dirección IP estática externa y configurar los registros DNS de tu nombre de dominio para que apunten a tu aplicación.

En este instructivo, se da por sentado que posees un nombre de dominio registrado (como example.com). Puedes registrar un nombre de dominio a través de Google Domains o algún otro registrador de dominios de tu elección si no tienes uno.

Objetivos

En este instructivo se ilustran los siguientes pasos:

  • Reservar una dirección IP externa estática para tu aplicación
  • Configurar los recursos de Servicio o Ingress para usar la IP estática
  • Actualizar los registros del DNS de tu nombre de dominio para que apunten a tu aplicación

Antes de comenzar

Sigue los pasos que se indican a continuación para habilitar la API de Kubernetes Engine:
  1. Consulta la página de Kubernetes Engine en Google Cloud Console.
  2. Crea o selecciona un proyecto.
  3. Espera a que la API y los servicios relacionados se habiliten. Esto puede tardar varios minutos.
  4. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud. Obtén información sobre cómo confirmar que tienes habilitada la facturación para tu proyecto.

Instala las siguientes herramientas de línea de comandos de este instructivo:

  • gcloud se usa para crear y borrar clústeres de Kubernetes Engine. gcloud se incluye en el SDK de Google Cloud.
  • kubectl se usa para administrar Kubernetes, el sistema de organización de clústeres que emplea Kubernetes Engine. Puedes instalar kubectl mediante gcloud:
    gcloud components install kubectl

Cómo establecer valores predeterminados para la herramienta de línea de comandos de gcloud

Para ahorrar tiempo cuando escribes las opciones del ID del proyecto y la zona de Compute Engine en la herramienta de línea de comandos de gcloud, puedes establecer los valores predeterminados de la siguiente manera:
gcloud config set project project-id
gcloud config set compute/zone compute-zone

Crea un clúster de GKE

Crea un clúster de contenedores llamado domain-test para implementar tu aplicación web:

gcloud container clusters create domain-test

Paso 1: implementa tu aplicación web

Para implementar la aplicación web de muestra, guarda el siguiente manifiesto como helloweb-deployment.yaml:

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: gcr.io/google-samples/hello-app:1.0
        ports:
        - containerPort: 8080

Luego, ejecuta el siguiente comando para crear la implementación:

kubectl apply -f helloweb-deployment.yaml

Paso 2: expón tu aplicación

Puedes exponer tu aplicación en GKE mediante uno de estos métodos:

Para obtener más información sobre las ventajas y desventajas de cada método, consulta el instructivo del balanceo de cargas de HTTP.

Paso 2(a): usa un Servicio

Para garantizar que tu aplicación tenga una dirección IP pública estática, debes reservar una dirección IP estática.

Si decides exponer tu aplicación con un Servicio, debes crear una dirección IP regional. Las direcciones IP globales solo funcionan con el tipo de recurso Ingress, 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

Para encontrar la dirección IP estática que creaste, ejecuta el siguiente comando:

gcloud compute addresses describe helloweb-ip --region us-central1
Resultado:
address: 203.0.113.32
...

Config Connector

Nota: En 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
Para implementar este manifiesto, descárgalo a tu máquina como compute-address-regional.yaml y ejecuta el siguiente comando:
kubectl apply -f compute-address-regional.yaml

Usa el siguiente manifiesto para crear un archivo de manifiesto llamado helloweb-service.yaml que describa un Servicio. Reemplaza 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"

Luego, crea el Servicio:

kubectl apply -f helloweb-service.yaml

Para ver la dirección IP reservada asociada con el balanceador de cargas, ejecuta este comando:

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

Paso 2(b): usa un Ingress

Si decides exponer tu aplicación con un Ingress, que crea un balanceador de cargas de HTTP(S), debes reservar una dirección IP estática global. Las direcciones IP regionales no funcionan con Ingress.

Si quieres obtener más información sobre cómo usar Ingress para exponer tus aplicaciones a la Internet, consulta el instructivo Configura el balanceo de cargas de HTTP con Ingress.

Para crear una dirección IP estática global llamada helloweb-ip, ejecuta el siguiente comando:

gcloud

gcloud compute addresses create helloweb-ip --global

Para encontrar la dirección IP estática que creaste, ejecuta el siguiente comando:

gcloud compute addresses describe helloweb-ip --global
Resultado:
address: 203.0.113.32
...

Config Connector

Nota: En 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
Para implementar este manifiesto, descárgalo en tu máquina como compute-address-global.yaml y ejecuta el siguiente comando:
kubectl apply -f compute-address-global.yaml

Para exponer una aplicación web en una IP estática con Ingress, necesitas implementar los siguientes recursos:

  1. Un Service con type:NodePort
  2. Un Ingress configurado con el nombre del servicio y la anotación de IP estática

Usa el siguiente manifiesto para crear un archivo de manifiesto denominado helloweb-ingress.yaml que describa estos dos recursos:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: helloweb
  annotations:
    kubernetes.io/ingress.global-static-ip-name: helloweb-ip
  labels:
    app: hello
spec:
  backend:
    serviceName: helloweb-backend
    servicePort: 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 asociará con el balanceador de cargas de HTTP(S).

Aplica el archivo de manifiesto helloweb-ingress.yaml al clúster:

kubectl apply -f helloweb-ingress.yaml
Resultado:
ingress "helloweb" created
service "helloweb-backend" created

Para ver la dirección IP de reserva asociada con el balanceador de cargas, ejecuta este comando:

kubectl get ingress
Resultado:
NAME       HOSTS     ADDRESS          PORTS     AGE
helloweb   *         203.0.113.32     80        4m

Paso 3: visita tu dirección IP estática reservada

Para verificar que el balanceador de cargas esté configurado de forma correcta, puedes usar un navegador web para visitar la dirección IP o usar curl:

curl http://203.0.113.32/
Resultado:
Hello, world!
Hostname: helloweb-3766687455-8lvqv

Paso 4: configura los registros de tu nombre de dominio

Para que los navegadores que consultan tu nombre de dominio (como example.com) o el nombre del subdominio (como blog.example.com) apunten a la dirección IP estática que reservaste, 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.

Tu servidor de nombres administra los registros DNS de tu dominio. Tu servidor de nombres puede estar donde registraste tu dominio (en otras palabras, tu “registrador”) o puede ser un servicio de DNS, como Google Cloud DNS o algún otro proveedor de terceros.

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

  • Si tu servidor de nombres es otro proveedor: consulta la documentación de tu servicio de DNS sobre cómo establecer registros DNS A para configurar tu nombre de dominio. Si decides usar Google Cloud DNS en su lugar, consulta Migra a Cloud DNS.

Paso 5: visita tu nombre de dominio

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

Si deseas realizar una consulta de DNS para el registro A del nombre de dominio, ejecuta el comando host:

host example.com
Resultado:
example.com has address 203.0.113.32

A partir de ahora, ya puedes apuntar tu navegador web a tu nombre de dominio y visitar tu sitio web.

Limpieza

Sigue estos pasos para evitar que se apliquen cargos a tu cuenta de Google Cloud Platform por los recursos que usaste en este instructivo:

  1. Borra los recursos de balanceo de cargas:

    kubectl delete ingress,service -l app=hello

  2. Libera la IP estática reservada. Una vez que se borra el balanceador de cargas, la dirección IP reservada, pero sin usar, ya no es gratuita y se factura por precio de direcciones IP sin usar. Ejecuta los siguientes comandos para liberar el recurso de IP estática:

    • Si seguiste el Paso 2(a), ejecuta este comando:

      gcloud compute addresses delete helloweb-ip --region us-central1
    • Si seguiste el Paso 2(b), ejecuta este comando:

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

    kubectl delete -f helloweb-deployment.yaml

  4. Espera a que se borre el balanceador de cargas. Para eso, observa el resultado del siguiente comando (el resultado no debería mostrar una regla de reenvío con “helloweb” en su nombre):

    gcloud compute forwarding-rules list

  5. Borra el clúster de contenedor:

    gcloud container clusters delete domain-test

Próximos pasos