Como escolher o endereço IP externo de um balanceador de carga Kubernetes no Google Kubernetes Engine

16

Estou implantando um aplicativo Web usando o Google Kubernetes Engine e quero torná-lo acessível por meio de um balanceador de carga em um endereço IP estático existente que eu controle como parte do mesmo projeto no Google Cloud Platform, porque o nome de domínio que eu quero usar já aponta para esse IP.

O arquivo yaml que usei para o pod é:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
  labels:
    app: my-app
spec:
  containers:
  - name: my-container
    image: gcr.io/my-project/my-app:latest

Posso configurar um balanceador de carga usando:

apiVersion: v1
kind: Service
metadata:
  name: my-load-balancer
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: my-app
  type: LoadBalancer

Isso fornece um IP externo no qual o aplicativo está acessível, mas não consigo encontrar nenhuma maneira de configurá-lo para usar o IP desejado. A documentação dos serviços menciona uma configuração spec.clusterIP, mas isso não parece estar relacionado ao IP externo. Da mesma forma, uma vez configurado o balanceador de carga, o campo status.loadBalancer.ingress.ip do serviço é definido como seu endereço IP externo, mas isso não parece ser uma configuração configurável.

Como alternativa, tentei criar manualmente uma regra de encaminhamento no console do Google Compute Engine para direcionar o tráfego do meu endereço IP estático para o pool de destino configurado pelo Kubernetes, mas quando tento conectar, a conexão é recusada.

Existe alguma maneira de fazer o que eu quero - expor um pod Kubernetes (ou controlador de replicação) no mecanismo do Google Kubernetes em um endereço IP estático escolhido?

Ben
fonte

Respostas:

9

TL; DR O Google Container Engine executando o Kubernetes v1.1 suporta loadBalancerIPapenas marcar o IP atribuído automaticamente como estático primeiro.

O Kubernetes v1.1 suporta IPs externos :

apiVersion: v1
kind: Service
spec:
  type: LoadBalancer
  loadBalancerIP: 10.10.10.10
  ...

Até o momento, não existe uma documentação consistente realmente boa sobre como usá-lo no GCE. O certo é que esse IP deve primeiro ser um dos seus IPs estáticos pré-alocados .

A documentação de balanceamento de carga de região cruzada é principalmente para o Compute Engine e não o Kubernetes / Container Engine, mas ainda é útil, especialmente na parte "Configurar o serviço de balanceamento de carga".

Se você acabou de criar um Kubernetes LoadBalancer no GCE, ele criará um mecanismo de computação em rede> Rede> Balanceamento de carga de rede> Regra de Encaminhamento apontando para um pool de destino feito de suas máquinas no cluster (normalmente apenas aqueles executando os Pods correspondentes ao seletor de serviço) . Parece que excluir um espaço para nome não limpa muito bem as regras criadas.


Atualizar

Agora, atualmente, é suportado (mesmo que esteja documentado):

  1. Verifique se você está executando o Kubernetes 1.1 ou posterior (em GKE, edite seu cluster e marque "Versão do nó")
  2. Em Rede> Endereços IP externos, você já deve ter um Efêmero marcado como apontando para a instância da VM do cluster (se não tiver ou não tiver certeza, implante uma vez sem loadBalancerIP, aguarde até que você tenha um IP externo alocado ao executar kubectl get svce procure esse IP no diretório lista nessa página). Marque um deles como estático , digamos que seja Endereço Externo10.10.10.10 .
  3. Edite seu LoadBalancer para ter loadBalancerIP=10.10.10.10o que foi descrito acima (adapte-se ao IP que lhe foi dado pelo Google).

Agora, se você excluir seu LoadBalancer ou mesmo seu espaço para nome, ele deverá preservar esse endereço IP ao reimplantá-lo nesse cluster. Se você precisar alterar o cluster, algumas correções manuais devem ser possíveis:

  1. Na seção "Balanceamento de carga de rede", guia "Pools de destino" , clique no botão "Criar pool de destino":
    • Nome: cluster-pool(ou qualquer outro nome)
    • Região: selecione a região de um de seus clusters
    • Exame de integridade: opcional, se você desejar
    • Selecione grupos de instâncias existentes: Seu cluster Kubernetes
  2. Na seção "Balanceamento de carga de rede", guia "Regras de encaminhamento" , clique no botão "Criar regra de encaminhamento":
    • Nome: http-cross-region-gfr(ou qualquer outro nome)
    • Região: selecione a região de um de seus clusters
    • IP externo: selecione loadbalancer-ip-crossregionvocê apenas reservado
    • Pool de destino: selecione cluster-poolvocê acabou de criar
Wernight
fonte
Ainda são relevantes?
19416 Ben
8

Boas notícias. Isso será corrigido no Kubernetes v1.1. Você pode definir o service.spec.loadBalancerIPcampo para um IP que você conhece.


Anterior:

Esse é um recurso que caiu nas rachaduras. Deveria funcionar (e pode até ter funcionado em algum momento), mas não foi bem testado e foi quebrado ao longo do caminho e, em seguida, foi acidentalmente projetado (temporariamente).

Está na minha lista curta as coisas para corrigir depois da 1.0.

https://github.com/GoogleCloudPlatform/kubernetes/issues/10323

Tim Hockin
fonte
Provavelmente deve ser um comentário, não uma resposta.
Ala - Restabelecer Monica
5
@Ard: "Não é possível" do dev é uma resposta, IMHO, e foi aceito como tal.
Sven