Configure nomes de domínio com endereços IP estáticos


Este tutorial demonstra como usar o Google Kubernetes Engine (GKE) para expor a sua aplicação Web à Internet num endereço IP externo estático e configurar um nome de domínio para apontar para a sua aplicação.

Este tutorial pressupõe que tem um nome de domínio registado, como example.com.

Objetivos

Este tutorial demonstra os seguintes passos:

  • Reserve um endereço IP externo estático para a sua aplicação
  • Configure os recursos Service ou Ingress para usar o endereço IP estático
  • Atualize os registos DNS do seu nome de domínio para apontarem para a sua aplicação

Custos

Neste documento, usa os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custos com base na sua utilização projetada, use a calculadora de preços.

Os novos Google Cloud utilizadores podem ser elegíveis para uma avaliação gratuita.

Quando terminar as tarefas descritas neste documento, pode evitar a faturação contínua eliminando os recursos que criou. Para mais informações, consulte o artigo Limpe.

Antes de começar

Siga os passos abaixo para ativar a API Kubernetes Engine:
  1. Visite a página do Kubernetes Engine na Google Cloud consola.
  2. Crie ou selecione um projeto.
  3. Aguarde até que a API e os serviços relacionados sejam ativados. Esta ação pode demorar vários minutos.
  4. Verify that billing is enabled for your Google Cloud project.

Instale as seguintes ferramentas de linha de comandos usadas neste tutorial:

  • gcloud é usado para criar e eliminar clusters do Kubernetes Engine. gcloud está incluído na CLI gcloud.
  • O kubectl é usado para gerir o Kubernetes, o sistema de orquestração de clusters usado pelo Kubernetes Engine. Pode instalar o kubectl através do gcloud:
    gcloud components install kubectl

Clone o exemplo de código do GitHub:

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

Defina predefinições para a ferramenta de linha de comandos gcloud

Para poupar tempo a escrever o ID do projeto e as opções da zona do Compute Engine na gcloudferramenta de linha de comandos, pode definir as predefinições:
gcloud config set project project-id
gcloud config set compute/zone compute-zone

Crie um cluster

Crie um cluster:

gcloud container clusters create-auto domain-test

Implemente a sua aplicação Web

O manifesto seguinte descreve uma implementação que executa uma imagem de contentor de aplicação Web de exemplo:

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

Crie a implementação:

kubectl apply -f helloweb-deployment.yaml

Exponha a sua aplicação

Pode expor a sua aplicação no GKE através de qualquer um dos seguintes métodos:

Para saber mais acerca das vantagens e desvantagens de cada método, consulte Configurar um Application Load Balancer externo com o Ingress.

Utilize um serviço

Para garantir que a sua aplicação tem um endereço IP externo estático, tem de reservar um endereço IP estático.

Se optar por expor a sua aplicação através de um serviço, tem de criar um endereço IP regional. Os endereços IP globais só funcionam com o tipo de recurso de entrada, conforme explicado na secção seguinte.

Para usar um serviço, crie um endereço IP estático denominado helloweb-ip na região us-central1:

gcloud

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

Encontre o endereço IP estático que criou:

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

O resultado é semelhante ao seguinte:

...
address: 203.0.113.32
...

Config Connector

Nota: este passo requer o Config Connector. Siga as instruções de instalação para instalar o Config Connector no seu cluster.

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

Guarde o manifesto como compute-address-regional.yaml.

Aplique o manifesto ao cluster:

  kubectl apply -f compute-address-regional.yaml

Encontre o endereço IP estático que criou:

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

O manifesto seguinte descreve um serviço do tipo LoadBalancer, que cria um Network Load Balancer de encaminhamento externo para expor pods com um endereço IP externo.

Substitua YOUR.IP.ADDRESS.HERE pelo endereço IP estático:

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"

Crie o serviço:

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

Veja o endereço IP reservado associado ao equilibrador de carga:

kubectl get service

O resultado é semelhante ao seguinte:

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

Use uma entrada

Se optar por expor a sua aplicação através de um Ingress, tem de reservar um endereço IP estático global. Use a anotação kubernetes.io/ingress.global-static-ip-name para especificar um endereço IP global.

Para expor a sua aplicação a clientes e serviços numa região, use um endereço IP interno estático regional ao implementar um recurso de entrada interno para o GKE, juntamente com as anotações necessárias.

Para saber como usar o Ingress para expor as suas aplicações à Internet, consulte o artigo Configurar um equilibrador de carga de aplicações externo com o Ingress.

Para criar um endereço IP estático global com o nome helloweb-ip:

gcloud

gcloud compute addresses create helloweb-ip --global

Encontre o endereço IP estático que criou:

gcloud compute addresses describe helloweb-ip --global

O resultado é semelhante ao seguinte:

...
address: 203.0.113.32
...

Config Connector

Nota: este passo requer o Config Connector. Siga as instruções de instalação para instalar o Config Connector no seu cluster.

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

Guarde o manifesto como compute-address-global.yaml.

Aplique o manifesto ao cluster:

  kubectl apply -f compute-address-global.yaml

O manifesto seguinte descreve um Ingress que expõe uma aplicação Web num IP estático com dois recursos:

  • Service com type:NodePort
  • Um Ingress configurado com o nome do serviço e a anotação de IP estático
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

A anotação kubernetes.io/ingress.global-static-ip-name especifica o nome do recurso de endereço IP global a associar ao balanceador de carga.

Aplique o manifesto ao cluster:

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

Veja o endereço IP associado ao equilibrador de carga:

kubectl get ingress

O resultado é semelhante ao seguinte

NAME       HOSTS     ADDRESS          PORTS     AGE
helloweb   *         203.0.113.32     80        4m

Veja o seu endereço IP estático reservado

Para verificar se o balanceador de carga está configurado corretamente, pode usar um navegador de Internet para visitar o endereço IP ou usar curl:

curl http://203.0.113.32/

O resultado é semelhante ao seguinte:

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

Configure os registos do nome de domínio

Para que os navegadores que consultam o seu nome de domínio, como example.com, ou o nome do subdomínio, como blog.example.com, apontem para o endereço IP estático que reservou, tem de atualizar os registos DNS (servidor de nomes de domínio) do seu nome de domínio.

Tem de criar um registo DNS do tipo A (Endereço) para o nome do seu domínio ou subdomínio e ter o respetivo valor configurado com o endereço IP reservado

Os registos DNS do seu domínio são geridos pelo seu servidor de nomes. O seu servidor de nomes pode ser a "entidade de registo" onde registou o seu domínio, um serviço DNS, como o Cloud DNS, ou outro fornecedor de terceiros.

  • Se o seu servidor de nomes for o Cloud DNS: siga o guia de início rápido do Cloud DNS para configurar o registo A de DNS para o seu nome de domínio com o endereço IP reservado da sua aplicação.

  • Se o seu servidor de nomes for outro fornecedor: consulte a documentação do seu fornecedor de DNS sobre a definição de registos A de DNS para configurar o seu nome de domínio. Se optar por usar o Cloud DNS, consulte o artigo Migrar para o Cloud DNS.

Visite o nome do seu domínio

Para verificar se os registos A de DNS do nome do seu domínio são resolvidos para o endereço IP que reservou, visite o nome do seu domínio.

Para fazer uma consulta de DNS para o registo A do nome do domínio, execute o comando host:

host example.com

O resultado é semelhante ao seguinte:

example.com has address 203.0.113.32

Agora, pode direcionar o navegador de Internet para o nome do domínio e visitar o seu Website.

Limpar

Para evitar incorrer em custos na sua conta do Google Cloud pelos recursos usados neste tutorial, elimine o projeto que contém os recursos ou mantenha o projeto e elimine os recursos individuais.

  1. Elimine o serviço e o Ingress:

    kubectl delete ingress,service -l app=hello
    
  2. Liberte o IP estático reservado. Após a eliminação do equilibrador de carga, o endereço IP não usado, mas reservado, é faturado de acordo com os preços de IP não usado.

    • Se usou um Serviço:

      gcloud compute addresses delete helloweb-ip --region us-central1
      
    • Se usou um Ingress:

      gcloud compute addresses delete helloweb-ip --global
      
  3. Elimine a aplicação de exemplo:

    kubectl delete -f helloweb-deployment.yaml
    
  4. Elimine o cluster:

    gcloud container clusters delete domain-test
    

O que se segue?