Header Ads

Kubernetes: ClusterIP, NodePort ou Ingress? Quando usar cada um

O Kubernetes oferece suporte a várias maneiras de obter tráfego externo para o seu cluster. ClusterIPs, NodePorts e Ingresses são três recursos amplamente usados ​​que têm uma função no roteamento do tráfego. Cada um permite que você exponha serviços com um conjunto único 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 direcionam 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 é atribuído a 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 manualmente outro tipo.

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 aplicativo: o campo de metadados my-app será adicionado ao serviço.

Você pode ver o endereço IP que foi atribuído executando kubectl get services. Outras cargas de trabalho em seu cluster podem usar este 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 de intervalo de ip-cluster de serviço no servidor da API 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. 123.123.123.123:30000.

Criar um NodePort abrirá essa porta em cada nó em seu cluster. O Kubernetes roteará automaticamente o tráfego da porta para o serviço ao qual está vinculado.

Aqui está um exemplo de manifesto de 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 dos serviços ClusterIP. A única diferença é a mudança de tipo: NodePort. O campo targetPort ainda é obrigatório, pois NodePorts são apoiados por um serviço ClusterIP.

Aplicar o 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 configurando o campo ports. nodePort:

especificações: portas: - nome: http porta: 80 targetPort: 80 nodePort: protocolo 32000: TCP

Isso encaminhará o tráfego na porta 32000 para a porta 80 em seus pods.

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 em desenvolvimento ou para expor um serviço TCP ou UDP em sua própria porta. Ao disponibilizar um ambiente de produção para usuários, você &’ vai querer 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 de Ingresses requer a existência de um Ingress Controller 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 à infraestrutura de balanceamento de carga. nginx-ingress é uma opção autônoma popular que usa o servidor da 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 que você indique 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: caminhos: - path: / backend: serviceName: my-service servicePort: 80 - host: another-example. com http: path: - path: / backend: serviceName: second-service servicePort: 80

Este manifesto define dois endpoints de entrada. A primeira regra de host roteia o tráfego de example. com para a porta 80 no serviço my-service. A segunda regra configura outro-example. com para mapear para pods que fazem parte do segundo serviço.

Você pode configurar SSL definindo o campo tls em seu Ingress &’ especificação:

spec: tls: - hosts: - example. com - another-example. com

Você precisará de um emissor como o gerenciador de certificados em seu cluster para que isso funcione. O Emissor irá adquirir certificados SSL para seus domínios quando seu Ingress for criado.

As entradas devem ser usadas quando você deseja manipular 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 serviços.

Balanceadores de carga

Um último tipo de serviço é 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 hospedando seu cluster por conta própria.

Os balanceadores de carga são usados ​​para mapear endereços IP externos para serviços em seu cluster. Ao contrário dos Ingressos, não há filtragem ou roteamento automático. O tráfego para o IP e porta externos 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 em nuvem oferecem mais recursos do que outras. Esteja ciente de que a criação de um balanceador de carga frequentemente implicará em cobranças adicionais à sua fatura.

apiVersion: v1 kind: Service spec: selector: app: my-app type: LoadBalancer loadBalancerIP: 123.123.123.123 portas: - nome: porta http: 80 targetPort: protocolo 80: 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ê define será recebido pela 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 compatível.

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ê quiser fornecer um URL.

Todas as quatro opções funcionam em conjunto com o “ serviço ” mais amplo; conceito. Eles são os guardiões que permitem o acesso da rede aos seus serviços. Esses serviços então 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 portas, que os serviços tornam acessíveis ao público.

Nenhum comentário