Kubernetes: Serviços e Pods: Difference between revisions
No edit summary |
|||
(2 intermediate revisions by the same user not shown) | |||
Line 32: | Line 32: | ||
app: frontend | app: frontend | ||
ports: | ports: | ||
- protocol: TCP | - name: https | ||
protocol: TCP | |||
port: 80 | port: 80 | ||
targetPort: | targetPort: 5080 | ||
- name: https | |||
protocol: TCP | |||
port: 443 | |||
targetPort: 5443 | |||
clusterIP: 10.0.171.239 | |||
loadBalancerIP: 78.11.24.19 | |||
type: LoadBalancer | |||
Line 43: | Line 51: | ||
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. | 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 = | = Ver também = |
Latest revision as of 03:12, 27 February 2019
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.