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.

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 balanceador de carga de aplicaciones 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.