Kubernetes: Serviços e Pods

From Wiki

Não deixe de ler o artigo Kubernetes: Resumo dos Principais Conceitos

Recapitulando:

  • Pods: o menor e mais simples objeto do Kubernetes. É a unidade de deployment no Kubernetes, que representa uma única instância do aplicativo.
Um Pod é uma coleção lógica de um ou mais contêineres, que:
  • São schedulados no mesmo host
  • Compartilham o mesmo network namespace
  • Monte o mesmo storage externo (volumes).
  • Services: é uma abstração que define um conjunto lógico de Pods e uma política para acesso a eles, algumas vezes chamamos de micro-serviços.

Exemplo

Imagine que você tenha um aplicação composta de um frontend (python) e um backend (um banco de dados).

No Kubernetes não podemos acessar diretamente esses Pods, pois os mesmos podem ser criados/destruídos a qualquer momento para atender a demanda. Além disso essa aplicação pode estar distribuída em 1 ou mais Pods, o que ficaria inviável para o cliente/usuário saber de todos os IPs utilizados.

Ao invés de acessarmos diretamente esses Pods, vamos criar uma camada denominada Serviços, onde atribuímos que nomeamos como frontend-svc e backend-svc.


Exemplo de Serviço

Neste trecho de declaração vemos como definir um serviço:

kind: Service
apiVersion: v1
metadata:
  name: frontend-svc
spec:
  selector:
    app: frontend
  ports:
    - name: https
      protocol: TCP
      port: 80
      targetPort: 5080
    - name: https
      protocol: TCP
      port: 443
      targetPort: 5443
  clusterIP: 10.0.171.239
  loadBalancerIP: 78.11.24.19
  type: LoadBalancer


Através do K8s atribuímos Labels: Valores para os pods da seguinte forma app:frontend e app:backend.

No exemplo de declaração do serviços, usamos a chave selector, para selecionar todos os Pods que tem o label app definido como frontend.

O cliente/usuário agora pode conectar neste IP, então a sua requisição é encaminha para um dos Pods. O Serviço faz o balanceamento de carga.

Service Discovery

Como os Serviços são o principal modo de comunicação no Kubernetes, precisamos de uma maneira de descobri-los em tempo de execução. Atualmente existem 2 tipos:

  • Via Variáveis de Ambiente
Definimos variáveis de ambiente de modo a informar aos outros pods as informações de serviço
REDIS_MASTER_SERVICE_HOST=172.17.0.6
REDIS_MASTER_SERVICE_PORT=6379
REDIS_MASTER_PORT=tcp://172.17.0.6:6379
REDIS_MASTER_PORT_6379_TCP=tcp://172.17.0.6:6379
REDIS_MASTER_PORT_6379_TCP_PROTO=tcp
REDIS_MASTER_PORT_6379_TCP_PORT=6379
REDIS_MASTER_PORT_6379_TCP_ADDR=172.17.0.6
  • Via DNS
Neste caso um add-on do K8s, vai cadastrar uma entrada DNS para este serviço
redis-master-svc.my-namesspace.svc.cluster.local

Service Type

Service Type é a definição de acesso deste serviço. Podemos decidir se o serviço:

  • Acessível somente dentro do cluster
  • Acessível de dentro do cluster e do mundo externo
  • Mapeado para uma entidade externa que reside fora do cluster.

Tipos disponíveis:

  • ClusterIP
(Default) disponibiliza o serviço em um IP interno do cluster. A escolha desse valor torna o serviço acessível somente dentro do cluster.
  • NodePort
disponibiliza o serviço no IP de cada nó em uma porta (o NodePort). Um serviço ClusterIP, para o qual o serviço NodePort será roteado, é criado automaticamente. Você poderá entrar em contato com o serviço NodePort, de fora do cluster, solicitando <NodeIP>: <NodePort>.
  • LoadBalancer
disponibiliza o serviço externamente usando o Load Balance de um provedor de nuvem. Os serviços NodePort e ClusterIP, para os quais o balanceador de carga externo será roteado, são criados automaticamente.
  • ExternalName
mapeia o serviço para o conteúdo do campo externalName (por exemplo, foo.bar.example.com), retornando o registro CNAME com seu valor. Nenhum proxy de qualquer tipo é configurado.

Ver também