Service

O que é um Service?

Um Service é um objeto do Kubernetes que define um conjunto de Pods e uma política de acesso a esses Pods. Os Services permitem que um conjunto de Pods seja acessado através de um único IP e DNS name. Eles também permitem que os Pods sejam escalados e movidos sem que o cliente perceba.

Tipos de Services

Existem 4 tipos de Services no Kubernetes:

  • ClusterIP: Expõe o Service em um IP interno no cluster. Este tipo torna o Service acessível apenas dentro do cluster.
  • NodePort: Expõe o Service na mesma porta de cada Node selecionado no cluster usando NAT. Torna o Service acessível de fora do cluster usando {NodeIP}:{NodePort}.
  • LoadBalancer: Cria um balanceador de carga externo no ambiente de nuvem atual (se suportado) e atribui um IP fixo, externo ao cluster, ao Service. Tornando o Service acessível de fora do cluster.
  • ExternalName: O Service é acessível através de um DNS name externo. Esse tipo de Service é utilizado para acessar recursos externos ao cluster.

Criando um Service do tipo ClusterIP, NodePort, LoadBalancer

Para criarmos um service precisamos de um Deployment ou um StatefulSet rodando. Vamos usar no exemplo o Nginx.

kubectl create deployment nginx --image=nginx --port=80
kubectl expose deployment nginx --port=80 --type=ClusterIP
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl expose deployment nginx --port=80 --type=LoadBalancer

Para termos um serviço do tipo LoadBalancer funcionando, precisamos de um provedor de nuvem que suporte esse tipo de serviço ou podemos usar um Ingress Controller, como por exemplo o MetalLB. Caso contrário, o serviço será criado, mas não terá um IP externo atribuído.

Criando um Service do tipo ExternalName

kubectl create service externalname giropops-db --external-name db.giropops.com.br

Criando um Service expondo outro Service

Podemos criar um Service que exponha outro Service. Isso é útil quando queremos expor um Service que não é acessível de fora do cluster, como por exemplo um Service do tipo ClusterIP.

kubectl create deployment nginx --image=nginx --port=80
kubectl expose deployment nginx --port=80 --type=ClusterIP
kubectl expose service nginx --name opa --type=NodePort

O que são os Endpoints?

Os Endpoints são objetos do Kubernetes que armazenam informações sobre os Pods que fazem parte de um Service. Eles são criados automaticamente pelo Kubernetes quando um Service é criado. Os Endpoints são utilizados para descoberta de Pods através de DNS.