1 - Estou lendo a documentação e estou um pouco confuso com a redação. Diz:
ClusterIP : expõe o serviço em um IP interno do cluster. A escolha desse valor torna o serviço acessível apenas de dentro do cluster. Este é o ServiceType padrão
NodePort : expõe o serviço no IP de cada nó em uma porta estática (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 : expõe o serviço externamente usando o balanceador de carga de um provedor de nuvem. Os serviços NodePort e ClusterIP, para os quais o balanceador de carga externo irá rotear, são criados automaticamente.
O tipo de serviço NodePort ainda usa, ClusterIP
mas apenas em uma porta diferente, aberta a clientes externos? Então, neste caso, é <NodeIP>:<NodePort>
o mesmo que <ClusterIP>:<NodePort>
?
Ou é NodeIP
realmente o IP encontrado quando você executa kubectl get nodes
e não o IP virtual usado para o tipo de serviço ClusterIP?
2 - Também no diagrama do link abaixo:
http://kubernetes.io/images/docs/services-iptables-overview.svg
Existe alguma razão específica para o fato de Client
estar dentro do Node
? Presumi que ele precisaria estar dentro de um Cluster
no caso de um tipo de serviço ClusterIP.
Se o mesmo diagrama fosse desenhado para o NodePort, seria válido desenhar o cliente completamente fora do Node
e Cluster
ou estou perdendo completamente o ponto?
fonte
externalIPs
muda a equação aqui? Especificamente, é possível atribuir umaexternalIPs
matriz a umClusterIP
serviço do tipo e, em seguida, o serviço também se torna acessível no IP externo? Quando você escolheria isso em um NodePort?spec.clusterIp
. O ClusterIP pode ser mencionado explicitamente em service.yaml. E similarmentespec.loadBalancerIp
Para esclarecer para quem está procurando qual é a diferença entre os 3 em um nível mais simples. Você pode expor seu serviço com o mínimo de ClusterIp (no cluster k8s) ou uma exposição maior com o NodePort (dentro do cluster externo ao cluster do k8s) ou com o LoadBalancer (mundo externo ou o que você definiu no seu LB).
Exposição ClusterIp <exposição NodePort <exposição LoadBalancer
Serviço ClusterIp Expose através do cluster k8s com
ip/name:port
Serviço NodePort Expose através de VMs de rede interna também externas a k8s
ip/name:port
Expor o serviço através do mundo externo ou o que você definiu no seu LB.
fonte
ClusterIP: serviços são alcançáveis por pods / serviços no cluster
Se eu criar um serviço chamado myservice no espaço de nome padrão do tipo: ClusterIP, será criado o seguinte endereço DNS estático previsível para o serviço:
E esse nome DNS só pode ser resolvido por pods e serviços dentro do cluster.
NodePort: os serviços são alcançáveis por clientes na mesma LAN / clientes que podem executar ping nos nós de host do K8s (e pods / serviços no cluster) (Observação para segurança, os nós de host do K8s devem estar em uma sub-rede privada, portanto, os clientes na Internet ganham não é possível acessar esse serviço)
Se eu criar um serviço chamado mynodeportservice no espaço de nome mynamespace do tipo: NodePort em um cluster de Kubernetes de 3 nós. Em seguida, um Serviço do tipo: ClusterIP será criado e poderá ser alcançado pelos clientes dentro do cluster no seguinte endereço DNS estático previsível:
Para cada porta que mynodeportservice ouve em uma nodeport no intervalo de 30000 - 32767, será escolhida aleatoriamente. Para que clientes externos que estão fora do cluster possam acessar o serviço ClusterIP que existe dentro do cluster. Digamos que nossos três nós de host K8s tenham IPs 10.10.10.1, 10.10.10.2, 10.10.10.3, o serviço Kubernetes está escutando na porta 80 e o Nodeport escolhido aleatoriamente foi 31852.
Um cliente que existe fora do cluster pode visitar 10.10.10.1:31852, 10.10.10.2:31852 ou 10.10.10.3:31852 (como o NodePort é escutado por todos os nós de host do Kubernetes) O Kubeproxy encaminhará a solicitação para a porta 80 do mynodeportservice.
LoadBalancer: os serviços são acessíveis a todos os que estão conectados à Internet * (a arquitetura comum é L4 LB é acessível ao público na Internet, colocando-a em uma DMZ ou fornecendo-lhe um IP público e privado e os nós do host k8s e IP públicos e privados em uma sub-rede privada)
( Nota: Esse é o único tipo de serviço que não funciona em 100% das implementações do Kubernetes, como o Kubernetes bare metal, funciona quando o Kubernetes tem integrações de provedor de nuvem.)
Se você criar mylbservice, uma VM L4 LB será gerada (um serviço IP de cluster e um Serviço NodePort também será implicitamente gerado). Desta vez, nosso NodePort é 30222. a idéia é que o L4 LB tenha um IP público 1.2.3.4 e carregue o saldo e encaminhará o tráfego para os 3 nós do K8s que possuem endereços IP privados. (10.10.10.1:30222, 10.10.10.2:30222, 10.10.10.3:30222) e, em seguida, o Kube Proxy o encaminhará para o serviço do tipo ClusterIP que existe dentro do cluster.
Você também perguntou: O tipo de serviço NodePort ainda usa o ClusterIP? Sim *
Ou o NodeIP é realmente o IP encontrado quando você executa o kubectl get nodes? Também sim *
Vamos desenhar um paralelo entre os Fundamentos:
um contêiner está dentro de um pod. um pod está dentro de um replicaset. um replicaset está dentro de uma implantação.
Bem da mesma forma:
um serviço ClusterIP faz parte de um serviço NodePort. Um serviço NodePort faz parte de um serviço do balanceador de carga.
Nesse diagrama que você mostrou, o cliente seria um pod dentro do cluster.
fonte
Vamos supor que você criou uma VM do Ubuntu em sua máquina local. Seu endereço IP é 192.168.1.104 .
Você entra na VM e instala o Kubernetes. Em seguida, você criou um pod em que a imagem nginx é executada nele.
1- Se você deseja acessar esse pod nginx dentro da sua VM, criará um ClusterIP vinculado a esse pod, por exemplo:
Em seu navegador, você pode digitar o endereço IP do nginxclusterip com a porta 80, como:
http://10.152.183.2:80
2- Se você deseja acessar este pod do nginx na sua máquina host, precisará expor sua implantação com o NodePort . Por exemplo:
Agora, na sua máquina host, você pode acessar o nginx como:
http://192.168.1.104:31865/
No meu painel, eles aparecem como:
Abaixo está um diagrama que mostra o relacionamento básico.
fonte
Mesmo que essa pergunta já tenha uma resposta, darei outra, talvez com mais algumas fotos para entender melhor.
1. ClusterIP é o tipo de serviço padrão no Kubernetes e esse tipo fornece um serviço dentro do cluster. Usando isso, outros aplicativos do cluster podem acessar o serviço por meio do proxy Kubernetes.
Devo mencionar que esse tipo de serviço não deve ser usado para expor serviços de produção. No entanto, pode ser usado para
A forma como a solicitação segue é a seguinte: tráfego -> proxy K8s -> serviço K8s (ClusterIP) -> pods e é exibido na figura a seguir.
2. O NodePort é a maneira mais primitiva de aceitar tráfego externo e encaminhá-lo para os serviços kubernetes. Como o nome indica, o tipo de serviço NodePort abre uma porta específica em todas as máquinas virtuais, que são de fato os nós do Kubernetes, para permitir que o tráfego enviado para essa porta específica seja encaminhado para o serviço.
O tipo de serviço NodePort tem algumas desvantagens:
A forma como essa solicitação é feita é a seguinte: tráfego -> porta exposta na máquina virtual -> serviço K8s (NodePort) -> pods e é exibido na figura a seguir:
3. LoadBalancer é a maneira padrão de expor um serviço à Internet. Se o seu desejo é expor diretamente um serviço e todo o tráfego em uma porta específica a ser antecipada ao serviço, então esta é a maneira de fazê-lo. Além disso, o tipo de serviço LoadBalancer não envolve nenhuma filtragem ou roteamento. Além disso, você pode enviar tráfego TCP, UDP, HTTP gRPC para ele.
Desvantagem: cada serviço exposto por meio de um LoadBalancer terá seu próprio endereço IP e cada serviço será exposto por meio de um único LoadBalancer que pode se tornar caro.
A solicitação possui o seguinte caminho: tráfego -> LoadBalancer -> Serviço K8s -> pods e é exibida na figura a seguir.
fonte
O pod3 pode conversar com o pod1 por meio de sua rede clusterIP.
você pode acessar o serviço no pod1 via nodeIPA: nodeportX OU nodeIPB: nodeportX. De qualquer maneira, funcionará porque o kube-proxy (que está instalado em cada nó) receberá sua solicitação e a distribuirá [redireciona (termo do iptables)] entre os nós, usando a rede clusterIP.
basicamente apenas colocando LB na frente, para que o tráfego de entrada seja distribuído para nodeIPA: nodeportX e nodeIPB: nodeportX e continue com o fluxo de processo número 2 acima.
fonte