Kubernetes: ClusterIP, NodePort ou Ingress? Quando usar cada um
O Kubernetes oferece suporte a várias maneiras de obter tráfego externo em seu cluster. ClusterIPs, NodePorts e Ingresses são três recursos amplamente usados que têm uma função no roteamento de tráfego. Cada um permite que você exponha serviços com um conjunto exclusivo de recursos e compensações.
O básico
As cargas de trabalho do Kubernetes não são visíveis na rede por padrão. Você disponibiliza contêineres para o mundo externo criando um serviço. Os recursos de serviço roteiam o tráfego para os contêineres dentro dos pods.
Um serviço é um mecanismo abstrato para expor pods em uma rede. Cada serviço recebe um tipo — ClusterIP, NodePort ou LoadBalancer. Eles definem como o tráfego externo chega ao serviço.
ClusterIP
ClusterIP é o serviço Kubernetes padrão. Seu serviço será exposto em um ClusterIP, a menos que você defina outro tipo manualmente.
Um ClusterIP fornece conectividade de rede dentro do seu cluster. Normalmente não pode ser acessado de fora. Você usa esses serviços para rede interna entre suas cargas de trabalho.
apiVersion: v1
kind: Service
spec:
selector:
app: my-app
type: ClusterIP
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
Este manifesto de exemplo define um serviço ClusterIP. O tráfego para a porta 80 no ClusterIP será encaminhado para a porta 80 em seus pods (targetPort
). Pods com o campo de metadados app: my-app
serão adicionados ao serviço.
Você pode ver o endereço IP atribuído executando kubectl get services
. Outras cargas de trabalho em seu cluster podem usar esse endereço IP para interagir com seu serviço.
Você pode definir manualmente um ClusterIP para um endereço IP específico usando o campo spec.clusterIp
:
spec:
type: ClusterIP
clusterIp: 123.123.123.123
O valor clusterIp
deve ser um endereço IP válido dentro do intervalo configurado para seu cluster. Isso é definido pela configuração service-cluster-ip-range
no servidor API do Kubernetes.
NodePort
Um NodePort expõe publicamente um serviço em um número de porta fixo. Ele permite que você acesse o serviço de fora do seu cluster. Você precisará usar o endereço IP do cluster e o número NodePort
, por exemplo
A criação de um NodePort abrirá essa porta em todos os nós do cluster. O Kubernetes encaminhará automaticamente o tráfego da porta para o serviço ao qual está vinculado.
Aqui está um exemplo de manifesto do serviço NodePort:
apiVersion: v1
kind: Service
spec:
selector:
app: my-app
type: NodePort
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
As definições de NodePort têm as mesmas propriedades obrigatórias que os serviços ClusterIP. A única diferença é a mudança para type: NodePort
. O campo targetPort
ainda é obrigatório, pois os NodePorts são suportados por um serviço ClusterIP.
A aplicação do manifesto acima atribuirá ao seu NodePort um número de porta aleatório do intervalo disponível para o Kubernetes. Geralmente, o padrão é as portas 30000-32767. Você pode especificar manualmente uma porta definindo o campo ports.nodePort
:
spec:
ports:
- name: http
port: 80
targetPort: 80
nodePort: 32000
protocol: TCP
Isso roteará o tráfego na porta 32000 para a porta 80 em seus pods.
Os NodePorts geralmente não são ideais para serviços públicos. Eles usam portas não padrão, que são inadequadas para a maioria do tráfego HTTP. Você pode usar um NodePort para configurar rapidamente um serviço para uso de desenvolvimento ou para expor um serviço TCP ou UDP em sua própria porta. Ao servir um ambiente de produção para os usuários, convém usar uma alternativa.
Entrada
Um Ingress é, na verdade, um recurso completamente diferente de um Serviço. Você normalmente usa Ingresses na frente de seus serviços para fornecer configuração de roteamento HTTP. Eles permitem que você configure URLs externos, hosts virtuais baseados em domínio, SSL e balanceamento de carga.
A configuração do Ingresses requer que um Ingress Controller exista em seu cluster. Há uma ampla seleção de controladores disponíveis. A maioria dos principais provedores de nuvem tem seu próprio Ingress Controller que se integra à sua infraestrutura de balanceamento de carga. nginx-ingress
é uma opção autônoma popular que usa o servidor web NGINX como um proxy reverso para obter tráfego para seus serviços.
Você cria Ingresses usando o tipo de recurso Ingress
. A anotação kubernetes.io/ingress.class
permite indicar qual tipo de Ingress você está criando. Isso é útil se você estiver executando vários controladores de cluster.
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: my-ingress
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- host: example.com
http:
paths:
- path: /
backend:
serviceName: my-service
servicePort: 80
- host: another-example.com
http:
paths:
- path: /
backend:
serviceName: second-service
servicePort: 80
Este manifesto define dois endpoints do Ingress. A primeira regra host
roteia o tráfego example.com
para a porta 80 no serviço my-service
. A segunda regra configura another-example.com
para mapear para pods que fazem parte de second-service
.
Você pode configurar o SSL definindo o campo tls
em sua especificação
do Ingress:
spec:
tls:
- hosts:
- example.com
- another-example.com
Você precisará de um emissor como Cert Manager em seu cluster para que isso funcione. O Emissor adquirirá certificados SSL para seus domínios quando seu Ingress for criado.
As entradas devem ser usadas quando você deseja lidar com o tráfego de vários domínios e caminhos de URL. Você configura seus terminais usando instruções declarativas. O controlador do Ingress provisionará suas rotas e as mapeará para os serviços.
Balanceadores de carga
Um tipo de serviço final é LoadBalancer. Esses serviços se integram automaticamente aos balanceadores de carga fornecidos por ambientes de nuvem pública. Você precisará configurar seu próprio balanceador de carga se estiver auto-hospedando seu cluster.
Os balanceadores de carga são usados para mapear endereços IP externos para serviços em seu cluster. Ao contrário do Ingresses, não há filtragem ou roteamento automático. O tráfego para o IP externo e porta será enviado diretamente para o seu serviço. Isso significa que eles são adequados para todos os tipos de tráfego.
A implementação de cada balanceador de carga depende do provedor. Algumas plataformas de nuvem oferecem mais recursos do que outras. Esteja ciente de que a criação de um balanceador de carga geralmente aplicará cobranças adicionais à sua fatura.
apiVersion: v1
kind: Service
spec:
selector:
app: my-app
type: LoadBalancer
loadBalancerIP: 123.123.123.123
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
Os manifestos do balanceador de carga são semelhantes aos outros tipos de serviço. O tráfego para a porta
do balanceador de carga que você definir será recebido pelo targetPort
em seus pods.
Seu ambiente de nuvem criará um novo balanceador de carga para lidar com seu tráfego. Alguns provedores permitem que você solicite um endereço IP externo específico usando o campo spec.loadBalancerIP
. Você receberá um IP aleatório quando isso não for suportado.
Conclusão
ClusterIPs, NodePorts, Ingresses e Load Balancers roteiam o tráfego externo para os serviços em seu cluster. Cada um é projetado para um caso de uso diferente. Alguns de seus serviços farão mais sentido com um NodePort, enquanto outros precisarão de um Ingress, geralmente quando você deseja fornecer uma URL.
Todas as quatro opções funcionam em conjunto com o conceito mais amplo de “serviço”. Eles são os porteiros que permitem o acesso à rede aos seus serviços. Esses serviços lidam com o último salto em seus pods. As duas camadas de abstração mantêm o roteamento totalmente desacoplado de suas cargas de trabalho: seus pods simplesmente expõem as portas, que os serviços tornam acessíveis publicamente.
Artigos relacionados:
- Conheça o OpenShift Lightspeed, a ferramenta de IA da Red Hat para administradores do Kubernetes
- Como a versão mais recente do Kubernetes agora lida com cargas de trabalho de IA – e muito mais
- Kubernetes completa 10 anos: como conduziu a computação nativa em nuvem na última década – e o que vem a seguir
- Codenotary apresenta serviço de lista de materiais de software para Kubernetes
- Introdução ao Kubernetes | O que é Kubernetes
- Instale Kubernetes usando Minikube no CentOS Linux
- Recursos do Kubernetes explicados em detalhes
- Instale o cluster Kubernetes usando Kubeadm no RHEL
- Crie e gerencie pods Kubernetes no Linux
- Introdução ao Amazon EKS
- Implante cluster Kubernetes na AWS com Amazon EKS
- O que é Kubernetes?
- Como começar a usar Kubernetes em seu laptop usando Minikube
- Os 20 melhores cursos de Kubernetes disponíveis para conferir
- As 20 melhores ferramentas Kubernetes para gerenciar projetos DevOps