Sessão complicada com Docker Swarm (CE) no Debian 9

Introdução

O Docker Swarm transforma seus servidores individuais em um cluster de computadores; facilitando o dimensionamento, a alta disponibilidade e o balanceamento de carga. O balanceador de carga Swarm implementa uma estratégia de balanceamento de carga round-robin, e isso pode interferir no funcionamento correto de aplicativos stateful (legados) que requerem alguma forma de sessões fixas para permitir uma configuração de alta disponibilidade com várias instâncias. O Docker Enterprise Edition oferece suporte à sessão de camada 7, mas neste guia, focaremos na versão gratuita (CE) do Docker. Para implementar sessões complicadas, usaremos o Traefik.

Pré-requisitos

  • Pelo menos duas instâncias Debian 9 recém-implantadas e atualizadas na mesma sub-rede com rede privada ativada
  • Docker CE instalado nessas instâncias
  • As instâncias devem fazer parte do mesmo Swarm e devem poder se comunicar através da rede privada
  • Conhecimento prévio do Docker e do Docker Swarm
  • Um usuário não root com sudodireitos (opcional, mas é altamente recomendável não usar o usuário root)

Neste tutorial, usaremos duas instâncias do Vultr com endereços IP privados 192.168.0.100e 192.168.0.101. Ambos são nós do gerenciador do Docker Swarm (o que não é ideal para produção, mas é suficiente para este tutorial).

Quem sou eu

Este tutorial usa a jwilder/whoamiimagem do docker como um aplicativo de demonstração. Esse contêiner simples responderá a uma chamada REST com o nome do contêiner de resposta, facilitando o teste se as sessões persistentes estão funcionando. Obviamente, esta imagem é usada apenas para fins de demonstração e precisa ser substituída pela imagem do seu próprio aplicativo.

O serviço whoami está configurado da seguinte maneira:

sudo docker network create whoaminet -d overlay
sudo docker service create --name whoami-service --mode global --network whoaminet --publish "80:8000"  jwilder/whoami
sudo iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT

Se subseqüentemente curlo ponto de extremidade REST whoami em http://192.168.0.100/, poderemos ver o balanceamento de carga round-robin do Docker Swarm em funcionamento:

curl http://192.168.0.100
I'm a6a8c9294fc3
curl http://192.168.0.100
I'm ae9d1763b4ad
curl http://192.168.0.100
I'm a6a8c9294fc3
curl http://192.168.0.100
I'm ae9d1763b4ad
curl http://192.168.0.100
I'm a6a8c9294fc3

Não adianta testar isso com navegadores modernos, como o Chrome ou Firefox, porque eles são projetados para manter as conexões ativas, e o balanceador de carga do Docker Swarm só muda para o outro contêiner a cada nova conexão. Se você quiser testar isso com um navegador, precisará aguardar pelo menos 30 segundos para que a conexão feche antes de atualizar novamente.

Configurando o Traefik

O Traefik suporta nativamente o Docker Swarm, ele pode detectar e registrar ou cancelar o registro de contêineres em tempo real e se comunica com o seu aplicativo pela rede de sobreposição interna. O Traefik precisa de algumas informações sobre seu aplicativo antes que ele possa começar a manipular pedidos. Essas informações são fornecidas à Traefik adicionando etiquetas ao seu serviço Swarm:

sudo docker service update --label-add "traefik.docker.network=whoaminet" --label-add "traefik.port=8000" --label-add "traefik.frontend.rule=PathPrefix:/" --label-add "traefik.backend.loadbalancer.stickiness=true" whoami-service

A lista a seguir descreve o significado de cada rótulo:

  • traefik.docker.network : A rede de sobreposição do Docker, pela qual o Traefik se comunicará com seu serviço
  • traefik.port : A porta na qual seu serviço está atendendo (esta é a porta exposta internamente, não a porta publicada)
  • traefik.frontend.rule: PathPrefix:/ liga a raiz de contexto ' /' a este serviço
  • traefik.backend.loadbalancer.stickiness : Ativa sessões permanentes para este serviço

Agora que whoami-serviceele foi configurado com os rótulos necessários, podemos adicionar o serviço Traefik ao enxame:

sudo docker service create --name traefik -p8080:80 -p9090:8080 --mount type=bind,source=/var/run/docker.sock,destination=/var/run/docker.sock --mode=global --constraint 'node.role == manager' --network whoaminet traefik --docker --docker.swarmmode --docker.watch --web --loglevel=DEBUG

Este comando faz várias coisas ao mesmo tempo, como mostra a lista a seguir:

  • --name traefik : O nome do nosso novo serviço Docker é Traefik
  • -p8080:80: Publicamos porta 80a porta do Traefik 8080porque a porta 80já está em uso pelo nosso serviço whoami
  • -p9090:8080 : Publicamos a interface web do Traefik na porta 9090
  • --mount ... : Montamos o soquete do Docker no contêiner para que o Traefik possa acessar o tempo de execução do Docker do host
  • --global : Queremos contêineres Traefik em cada nó do gerente por motivos de alta disponibilidade
  • --constraint 'node.role == manager': Queremos que o Traefik seja executado apenas nos nós do gerente, porque os nós dos trabalhadores não podem fornecer ao Traefik as informações necessárias. Por exemplo, docker service lsem um nó de trabalho não funciona, portanto, o Traefik nem seria capaz de descobrir quais serviços estão em execução
  • --network whoaminet: Conecte o Traefik à mesma rede que a nossa whoami-service, caso contrário, ele não poderá se conectar a ele. Dissemos anteriormente ao Traefik para se conectar ao nosso serviço nessa rede com a traefik.docker.networketiqueta
  • traefik : Diga ao docker para usar a imagem mais recente do dock do Traefik para este serviço
  • --docker --docker.swarmmode --docker.watch --web --loglevel=DEBUG: Argumentos da linha de comando transmitidos diretamente ao Traefik para permitir a execução no modo de enxame do Docker. DEBUGé opcional aqui, mas interessante durante a instalação e para este tutorial

Tudo o que resta a fazer é abrir as portas necessárias no firewall Debian:

sudo iptables -I INPUT 1 -p tcp --dport 8080 -j ACCEPT
sudo iptables -I INPUT 1 -p tcp --dport 9090 -j ACCEPT

Como funciona

Assim que o Traefik é iniciado, você pode ver nos logs que o Traefik descobre os dois whoamicontêineres. Também está emitindo o nome do cookie que será usado para lidar com a sessão complicada:

time="2018-11-25T13:17:30Z" level=debug msg="Configuration received from provider docker: {\"backends\":{\"backend-whoami-service\":{\"servers\":{\"server-whoami-service-1-a179b2e38a607b1127e5537c2e614b05\":{\"url\":\"http://10.0.0.5:8000\",\"weight\":1},\"server-whoami-service-2-df8a622478a5a709fcb23c50e689b5b6\":{\"url\":\"http://10.0.0.4:8000\",\"weight\":1}},\"loadBalancer\":{\"method\":\"wrr\",\"stickiness\":{}}}},\"frontends\":{\"frontend-PathPrefix-0\":{\"entryPoints\":[\"http\"],\"backend\":\"backend-whoami-service\",\"routes\":{\"route-frontend-PathPrefix-0\":{\"rule\":\"PathPrefix:/\"}},\"passHostHeader\":true,\"priority\":0,\"basicAuth\":null}}}"
time="2018-11-25T13:17:30Z" level=debug msg="Wiring frontend frontend-PathPrefix-0 to entryPoint http"
time="2018-11-25T13:17:30Z" level=debug msg="Creating backend backend-whoami-service"
time="2018-11-25T13:17:30Z" level=debug msg="Adding TLSClientHeaders middleware for frontend frontend-PathPrefix-0"
time="2018-11-25T13:17:30Z" level=debug msg="Creating load-balancer wrr"
time="2018-11-25T13:17:30Z" level=debug msg="Sticky session with cookie _a49bc"
time="2018-11-25T13:17:30Z" level=debug msg="Creating server server-whoami-service-1-a179b2e38a607b1127e5537c2e614b05 at http://10.0.0.5:8000 with weight 1"
time="2018-11-25T13:17:30Z" level=debug msg="Creating server server-whoami-service-2-df8a622478a5a709fcb23c50e689b5b6 at http://10.0.0.4:8000 with weight 1"
time="2018-11-25T13:17:30Z" level=debug msg="Creating route route-frontend-PathPrefix-0 PathPrefix:/"
time="2018-11-25T13:17:30Z" level=info msg="Server configuration reloaded on :80"
time="2018-11-25T13:17:30Z" level=info msg="Server configuration reloaded on :8080"

Se nos enrolarmos http://192.168.0.100:8080, podemos ver que um novo cookie, _a49bcfoi definido:

curl -v http://192.168.0.100:8080
* About to connect() to 192.168.0.100 port 8080 (#0)
*   Trying 192.168.0.100...
* Connected to 192.168.0.100 (192.168.0.100) port 8080 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 192.168.0.100:8080
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Length: 17
< Content-Type: text/plain; charset=utf-8
< Date: Sun, 25 Nov 2018 13:18:40 GMT
< Set-Cookie: _a49bc=http://10.0.0.5:8000; Path=/
<
I'm a6a8c9294fc3
* Connection #0 to host 192.168.0.100 left intact

Se, nas chamadas subsequentes, enviarmos esse cookie para o Traefik, sempre seremos encaminhados para o mesmo contêiner:

curl http://192.168.0.100:8080 --cookie "_a49bc=http://10.0.0.5:8000"
I'm a6a8c9294fc3
curl http://192.168.0.100:8080 --cookie "_a49bc=http://10.0.0.5:8000"
I'm a6a8c9294fc3
curl http://192.168.0.100:8080 --cookie "_a49bc=http://10.0.0.5:8000"
I'm a6a8c9294fc3
curl http://192.168.0.100:8080 --cookie "_a49bc=http://10.0.0.5:8000"
I'm a6a8c9294fc3

O cookie não contém nada além do endereço IP interno do contêiner ao qual o Traefik deve enviar para solicitar. Se você alterar para o valor do cookie para http://10.0.0.4:8000, a solicitação será efetivamente encaminhada para o outro contêiner. Se o cookie nunca deve ser reenviado para o Traefik, a sessão permanente não funcionará e as solicitações serão equilibradas entre os contêineres do aplicativo e os contêineres do Traefik.

Isso é tudo o que é necessário para configurar as sessões adesivas da camada 7 no Docker CE no Debian 9.



Instalando o Docker no Ubuntu 14.04

Instalando o Docker no Ubuntu 14.04

Usando um sistema diferente? O Docker é um aplicativo que permite implantar programas executados como contêineres. Foi escrito no popular programa Go

Configurar Sentry via Docker no Ubuntu 16.04

Configurar Sentry via Docker no Ubuntu 16.04

Usando um sistema diferente? Introdução O Sentry é uma solução de código aberto para rastreamento de erros. O Sentry rastreia exceções e outras mensagens úteis

Instale o Rancher Server no RancherOS

Instale o Rancher Server no RancherOS

O RancherOS é um sistema operacional incrivelmente leve (apenas cerca de 60 MB) que executa um daemon do Docker do sistema como PID 0 para executar serviços do sistema

Como instalar o Harbor no CentOS 7

Como instalar o Harbor no CentOS 7

O Harbor é um servidor de registro de classe empresarial de código aberto que armazena e distribui imagens do Docker. Harbor estende o Docker Distribution b de código aberto

Como usar o Docker: Criando seu primeiro contêiner Docker

Como usar o Docker: Criando seu primeiro contêiner Docker

Este tutorial explica os conceitos básicos de introdução ao Docker. Presumo que você já tenha o Docker instalado. As etapas deste tutorial funcionarão em um

Equilíbrio de carga com o Docker

Equilíbrio de carga com o Docker

Ao executar um aplicativo Web, normalmente você deseja aproveitar ao máximo seus recursos sem precisar converter seu software para usar multithreading

No CoreOS, configure seu próprio registro do Docker

No CoreOS, configure seu próprio registro do Docker

Todos conhecemos e amamos o Docker, uma plataforma para criar, gerenciar e distribuir contêineres de aplicativos em várias máquinas. A Docker Inc. fornece um serviço t

Implantar um aplicativo Node.js usando o Docker

Implantar um aplicativo Node.js usando o Docker

Este artigo mostra como implantar o aplicativo Node em um contêiner do Docker. Nota: Este tutorial pressupõe que você tenha o Docker instalado e leia

Criar um enxame Docker no Alpine Linux 3.9.0

Criar um enxame Docker no Alpine Linux 3.9.0

Introdução Este guia mostra como criar e configurar um enxame Docker usando vários servidores Alpine Linux 3.9.0 e o Portainer. Esteja ciente de que

Implante o Kubernetes com o Kubeadm no CentOS 7

Implante o Kubernetes com o Kubeadm no CentOS 7

Visão geral Este artigo tem como objetivo ajudá-lo a colocar um cluster do Kubernetes em funcionamento com o kubeadm rapidamente. Este guia estará implantando dois servidores, em

Instalando o docker-compose no CoreOS

Instalando o docker-compose no CoreOS

Este artigo explica como instalar o docker-compose no CoreOS. No CoreOS, a pasta / usr / é imutável, portanto o caminho padrão / usr / local / bin não está disponível para

Implante e gerencie com segurança contêineres LXC no Ubuntu 14.04

Implante e gerencie com segurança contêineres LXC no Ubuntu 14.04

Os contêineres LXC (contêineres do Linux) são um recurso do sistema operacional no Linux que pode ser usado para executar vários sistemas Linux isolados em um único host. Thes

Instale o Docker CE no Ubuntu 18.04

Instale o Docker CE no Ubuntu 18.04

Introdução O Docker é um aplicativo que nos permite implantar programas executados como contêineres. Foi escrito na popular linguagem de programação Go

Introdução ao Kubernetes no CentOS 7

Introdução ao Kubernetes no CentOS 7

O Kubernetes é uma plataforma de código aberto desenvolvida pelo Google para gerenciar aplicativos em contêineres em um cluster de servidores. Ele se baseia em uma década e

Implantar um aplicativo PHP usando o Docker-compone

Implantar um aplicativo PHP usando o Docker-compone

Os aplicativos PHP geralmente são compostos por um servidor da web, um sistema de banco de dados relacional e o próprio interpretador de linguagem. Neste tutorial, estaremos alavancando

Instale o Rancher no Ubuntu 16.04

Instale o Rancher no Ubuntu 16.04

Usando um sistema diferente? Introdução O Rancher é uma plataforma de código aberto para executar contêineres e criar um serviço de contêiner particular. Rancheiro é a base

Instalando o Docker CE no CentOS 7

Instalando o Docker CE no CentOS 7

A tecnologia de contêiner do Docker permite executar aplicativos em um ambiente específico e isolado. Docker Community Edition (CE) é o novo nome para o fre

Introdução ao SQL Server 2017 (MS-SQL) no CentOS 7 com Docker

Introdução ao SQL Server 2017 (MS-SQL) no CentOS 7 com Docker

Pré-requisitos Docker engine 1.8+. Mínimo de 4 GB de espaço em disco. Mínimo de 4 GB de RAM. Etapa 1. Instalar o Docker Para instalar o SQL-Server, o Docker deve

Instalando o Docker CE no Debian 9

Instalando o Docker CE no Debian 9

Usando um sistema diferente? Introdução O Docker é um aplicativo que permite a implantação de software em contêineres virtuais. Foi escrito no G

A IA pode lutar contra o aumento do número de ataques de ransomware

A IA pode lutar contra o aumento do número de ataques de ransomware

Os ataques de ransomware estão aumentando, mas a IA pode ajudar a lidar com os vírus de computador mais recentes? AI é a resposta? Leia aqui para saber se é AI boone ou bane

ReactOS: Este é o futuro do Windows?

ReactOS: Este é o futuro do Windows?

ReactOS, um sistema operacional de código aberto e gratuito está aqui com a versão mais recente. Será que ela pode atender às necessidades dos usuários modernos do Windows e derrubar a Microsoft? Vamos descobrir mais sobre esse estilo antigo, mas uma experiência de sistema operacional mais recente.

Fique conectado por meio do aplicativo WhatsApp Desktop 24 * 7

Fique conectado por meio do aplicativo WhatsApp Desktop 24 * 7

O Whatsapp finalmente lançou o aplicativo Desktop para usuários de Mac e Windows. Agora você pode acessar o Whatsapp do Windows ou Mac facilmente. Disponível para Windows 8+ e Mac OS 10.9+

Como a IA pode levar a automação de processos ao próximo nível?

Como a IA pode levar a automação de processos ao próximo nível?

Leia isto para saber como a Inteligência Artificial está se tornando popular entre as empresas de pequena escala e como está aumentando as probabilidades de fazê-las crescer e dar vantagem a seus concorrentes.

A atualização do suplemento do macOS Catalina 10.15.4 está causando mais problemas do que resolvendo

A atualização do suplemento do macOS Catalina 10.15.4 está causando mais problemas do que resolvendo

Recentemente, a Apple lançou o macOS Catalina 10.15.4, uma atualização suplementar para corrigir problemas, mas parece que a atualização está causando mais problemas, levando ao bloqueio de máquinas mac. Leia este artigo para saber mais

13 Ferramentas de Extração de Dados Comerciais de Big Data

13 Ferramentas de Extração de Dados Comerciais de Big Data

13 Ferramentas de Extração de Dados Comerciais de Big Data

O que é um sistema de arquivos de registro no diário e como ele funciona?

O que é um sistema de arquivos de registro no diário e como ele funciona?

Nosso computador armazena todos os dados de uma maneira organizada conhecida como sistema de arquivos Journaling. É um método eficiente que permite ao computador pesquisar e exibir arquivos assim que você clicar em search.https: //wethegeek.com/? P = 94116 & preview = true

Singularidade tecnológica: um futuro distante da civilização humana?

Singularidade tecnológica: um futuro distante da civilização humana?

À medida que a ciência evolui em um ritmo rápido, assumindo muitos de nossos esforços, os riscos de nos sujeitarmos a uma singularidade inexplicável também aumentam. Leia, o que a singularidade pode significar para nós.

Uma visão sobre 26 técnicas analíticas de Big Data: Parte 1

Uma visão sobre 26 técnicas analíticas de Big Data: Parte 1

Uma visão sobre 26 técnicas analíticas de Big Data: Parte 1

O impacto da inteligência artificial na saúde 2021

O impacto da inteligência artificial na saúde 2021

A IA na área da saúde deu grandes saltos nas últimas décadas. Portanto, o futuro da IA ​​na área da saúde ainda está crescendo dia a dia.