Configura nombres de dominio con direcciones IP estáticas


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

En este instructivo, se da por sentado que tienes un nombre de dominio registrado (como example.com).

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 Service o Ingress para usar la IP estática
  • Actualizar los registros DNS de tu nombre de dominio para que apunten a tu aplicación

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

Cuando finalices las tareas que se describen en este documento, puedes borrar los recursos que creaste para evitar que continúe la facturación. Para obtener más información, consulta Cómo realizar una limpieza.

Antes de comenzar

Sigue los pasos que se indican a continuación para habilitar la API de Kubernetes Engine:
  1. Consulta la página Kubernetes Engine en la consola de Google Cloud.
  2. Crea o selecciona un proyecto.
  3. Espera a que la API y los servicios relacionados se habiliten. Esto puede tardar varios minutos.
  4. Make sure that billing is enabled for your Google Cloud project.

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 la CLI de gcloud.
  • kubectl se usa para administrar Kubernetes, el sistema de organización de clústeres que emplea Kubernetes Engine. Puedes instalar kubectl con gcloud:
    gcloud components install kubectl

Clona el código de ejemplo desde GitHub:

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

Establece 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 valores predeterminados:
gcloud config set project project-id
gcloud config set compute/zone compute-zone

Crea un clúster

Crea un clúster:

gcloud container clusters create-auto domain-test

Implementa tu aplicación web

En el siguiente manifiesto, se describe una implementación que ejecuta una imagen de contenedor de aplicación web de muestra:

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 Deployment:

kubectl apply -f helloweb-deployment.yaml

Expón tu aplicación

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

Para obtener más información sobre las ventajas y desventajas de cada método, consulta Configura un balanceador de cargas de aplicaciones externo con Ingress.

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 Service, 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 Service, 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 creaste:

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

El resultado es similar al siguiente:

...
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 el clúster.

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

Guarda el manifiesto como compute-address-regional.yaml:

Aplica el manifiesto al clúster:

  kubectl apply -f compute-address-regional.yaml

Busca la dirección IP estática que creaste:

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

En el siguiente manifiesto, se describe un Service de tipo LoadBalancer, que crea un balanceador de cargas de red de paso externo para exponer los Pods con una dirección IP externa.

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"

Crea el objeto Service

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

Visualiza la dirección IP reservada asociada con el balanceador de cargas:

kubectl get service

El resultado es similar al siguiente:

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

Usa un Ingress

Si decides exponer tu aplicación con 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.

Si deseas exponer tu aplicación a los clientes y servicios de una región, usa una dirección IP interna estática regional mientras implementas un recurso de entrada interno para GKE junto con las anotaciones requeridas.

Si deseas obtener información sobre cómo usar Ingress para exponer tus aplicaciones a la Internet, consulta Configura un balanceador de cargas de aplicaciones externo 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

Busca la dirección IP estática que creaste:

gcloud compute addresses describe helloweb-ip --global

El resultado es similar al siguiente:

...
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 el clúster.

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

Guarda el manifiesto como compute-address-global.yaml:

Aplica el manifiesto al clúster:

  kubectl apply -f compute-address-global.yaml

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

  • Un 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 asociará con el balanceador de cargas de HTTP(S).

Aplica el manifiesto al clúster:

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

Visualiza la dirección IP asociada con el balanceador de cargas:

kubectl get ingress

El resultado es similar al que se muestra a continuación:

NAME       HOSTS     ADDRESS          PORTS     AGE
helloweb   *         203.0.113.32     80        4m

Visualiza la 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/

El resultado es similar al siguiente:

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

Configurar tus registros de 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.

La administración de los registros DNS de tu dominio se realiza a través de tu servidor de nombres Tu servidor de nombres puede ser el “registrador” donde registraste tu dominio, un servicio de DNS, como Cloud DNS, o algún otro proveedor de terceros.

  • Si tu servidor de nombres es Cloud DNS: Sigue la Guía de inicio rápido de Cloud DNS para configurar un registro A de DNS 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 tus proveedores de DNS para configurar registros A de DNS a fin de configurar tu nombre de dominio. Si decides usar Google Cloud DNS en su lugar, consulta Migra a Cloud DNS.

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

El resultado es similar al siguiente:

example.com has address 203.0.113.32

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

Limpia

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.

  1. Borra el Service y el Ingress:

    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, se factura por precio de direcciones IP sin usar.

    • Si usaste un Service:

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

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

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

    gcloud container clusters delete domain-test
    

¿Qué sigue?