Em um cluster de contêiner como o Kubernetes ou o Docker 1.12 Swarm, como você resolve com o DNS externo para o bom contêiner no bom host?

2

Talvez eu seja burro, talvez eu não esteja usando as boas palavras, mas não consigo encontrar nem uma resposta em nenhum lugar do StackExchange ou de toda a Web.

Eu criei muitos sites, principalmente com o Wordpress, Drupal, ...
(E recentemente, comecei a experimentar com o Scala e o Go, tentando criar um site para obter algum conhecimento sobre esses idiomas.)
Meu provedor de DNS é principalmente DNSMadeEasy .

Inicialmente, eu estava usando apenas um grande servidor dedicado, sob o Debian, com meus diferentes sites sendo apenas diferentes pastas, e Nginx, PHP-FPM, servindo todos os meus sites. Configuração tradicional.

Então, há alguns anos, mudei para uma configuração do Docker, ainda em um único host , com um contêiner Nginx, um contêiner PHP-FPM, um contêiner MySQL, ... por site. < br> E um contêiner de proxy reverso nginx na frente de tudo, para redirecionar o visitante do site example.com para os contêineres example.com.

Ou com a configuração tradicional ou com a configuração baseada no Docker, eu estava atribuindo o endereço IP do meu host ao registro A de meus sites diferentes no DNSMadeEasy e voilà, tudo funcionaria conforme o esperado .

AGORA, eu gostaria de mudar de uma configuração de host único para uma configuração de vários hosts aka Cluster , usando o Docker Swarm (1.12 Swarm) ou o Kubernetes, para poder escalar mais facilmente, como esse era o propósito de mudar para o Docker em primeiro lugar.
Assim, os contêineres dos meus diferentes sites serão distribuídos entre os diferentes hosts do meu cluster.

Estou planejando usar uma nuvem europeia em execução no OpenStack, pois não posso (< > leis de privacidade) e não quero usar (< > muito caro) nuvens americanas como o Google Cloud Engine ou AWS EC2 (< > Patriot Act < > European Data), então, por favor, não me diga para usar essas nuvens. Eu já consegui configurar um cluster do Kubernetes e um cluster do Docker Swarm, nesta nuvem do Openstack.

MINHA PERGUNTA: O que não consigo entender é como você aponta seus sites DINAMICAMENTE para os novos serviços & pods que são criados automaticamente?

Digamos que eu tenha quatro hosts (um mestre e três trabalhadores).
Se eu apenas fizer resolução de DNS Round Robin , colocando todos os quatro IP dos meus quatro hosts no registro A dos meus sites para que ele vá para qualquer um dos quatro, será um pesadelo e uma bagunça total, com os cabeçalhos de cache e tudo mais. Além disso, com o DNSMadeEasy, eles têm uma API para adicionar e excluir registros automaticamente, portanto, suponho que seja possível atualizar automaticamente o registro A ou o registro CNAME dos sites como este plugin faz com o AWS Route53: link ? (Podemos ver que isso usa um LoadBalancer externo, então eu suponho que eu preciso de um lb externo também para minha configuração, se eu deveria seguir essa solução?)

Estou ciente de que tanto o Kubernetes quanto o Docker Swarm usam DNS para descoberta de serviço e etcd / consul para registro & eleição.
Mas pelo que entendi, isso é usado como um sistema de DNS interno, não externo, não?

Ou devo apontar o NS para meus hosts e usar meus hosts em vez de DnsMadeEasy !! ??

Estou faltando alguma coisa? Estou fazendo errado?

Por favor, alguém me ajude, eu começo a ter dores de cabeça enormes tentando resolver as coisas:)

Y

    
por Yannovitch 03.08.2016 / 15:57

2 respostas

3

DNS incorporado do Kubernetes

A partir do Kubernetes 1.3, o DNS é um serviço embutido lançado automaticamente usando o complemento de cluster do gerenciador de complementos. Um DNS Pod e um serviço serão agendados no cluster, e os kubelets serão configurados para dizer aos contêineres individuais que usem o IP do serviço DNS para resolver os nomes DNS.

Cada Serviço definido no cluster (incluindo o próprio servidor DNS) receberá um nome DNS. Por padrão, a lista de pesquisa de DNS de um pod de cliente incluirá o namespace do próprio Pod e o domínio padrão do cluster. Isso é melhor ilustrado pelo exemplo:

Assuma um serviço chamado foo na barra de espaços para nome do Kubernetes. Um Pod em execução na barra de espaço para nome pode procurar esse serviço simplesmente fazendo uma consulta DNS para foo. Um Pod rodando no namespace quux pode procurar este serviço fazendo uma consulta DNS por foo.bar.

Para mais informações, consulte a Documentação do Kubernetes .

Balanceamento de carga NGINX

Configurações padrão para balanceamento de carga:

http {
    upstream myapp1 {
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://myapp1;
        }
    }
}

Para mais informações, consulte a Documentação do NGINX .

API REST do DNS

Você pode criar um script personalizado para interagir com a API do provedor de DNS conforme necessário.

Para obter mais informações, consulte a Documentação da API REST do DNSMadeEasy .

    
por 03.08.2016 / 16:05
3

O Docker 1.12 com o modo Swarm vem com balanceamento de carga integrado.

No seu caso, o principal benefício disso é que você não precisa atualizar dinamicamente seu DNS dependendo do host em que um determinado contêiner acaba sendo executado (o que provavelmente levaria a um desastre de qualquer maneira, por causa do DNS ttl e cache).

Digamos, por exemplo, que você executou:

docker service create --name nginx -p 80:80 nginx

Isso criará um serviço nginx com uma réplica, para que um único contêiner seja iniciado em um host aleatório no seu enxame. Mas o balanceamento de carga integrado encaminhará solicitações na porta 80 em qualquer dos hosts de enxame para o host em que o contêiner é executado. E da mesma forma, se você dimensionar o serviço com:

docker service scale nginx=2

Isso cria uma configuração muito simples:

  1. Use o recurso DNSMadeEasy round-robin e adicione registros A para todos os IPs de host em seu enxame.
  2. Implante seu aplicativo com docker service create
  3. Lucro

Da sua pergunta, parece que você gostaria de executar vários sites no seu enxame, por exemplo. vários aplicativos todos escutando na porta 80 e porta 443. Como @Flippy aponta, para fazer isso você atualmente tem que executar um loadbalancer de camada 7 como HAProxy ou nginx, que inspeciona requisições de cabeçalhos de host e encaminha solicitações apropriadamente. Isso também é simples de fazer com o modo Swarm do Docker 1.12 e este é um bom guia de primeiros passos .

    
por 04.08.2016 / 01:13