Criação de um enviado como um procurador frontal no Docker com comunicação com outros contentores Docker

Eu já tenho contentores existentes que quero usar como representante e gestor de https em frente. Estou aprendendo a usar o envoy, e estou compartilhando alguns dos meus aprendizados aqui, pois a documentação é um pouco confusa para começar.

O meu contentor já existente chama-se "taxgod" - corre uma aplicação Crystal no porto 3000 (http). Eu quero substituí-lo pela porta 80 no host para http, e pela porta 443 para https.

Vou usar um certificado falso para fins de demonstração. A criação do certificado está fora do âmbito deste artigo.

O contentor do enviado vai ser chamado de penvoyage (picockpit enviado )

Construindo a penugem

imagem

A pasta da penvoyage utilizada para a construção contém

  • Dockerfile
  • envoy.yaml
  • exemplo.crt (certificado)
  • exemplo.key (chave para o certificado)

Dockerfile

DE envoyproxy/envoy:latest
COPY envoy.yaml /etc/envoy/envoy.yaml
Exemplo COPY.crt /etc/example-com.crt
COPY exemplo.key /etc/example-com.key
#VOLUME /etc/envoy/envoy.yaml

EXPOSIÇÃO 80/tcp
EXPOSIÇÃO 443/tcp
#Educated adivinhe que isto é TCP
EXPOSE 9901/tcp

LABEL version="0.2.0″ \
       description="penvoyage is envoy proxy for PiCockpit" {\i1}
       mantenedor=""

Tenha cuidado com os " caracteres, o WordPress pode estragá-los!

Vou entrar no envoy.yaml com um pouco mais de detalhe em breve. Basta dizer, que está nesta pasta e será copiado para a imagem do container recém-criado.

Para construir o container run (a partir do diretório que contém o diretório penvoyage):

construção da doca -t jasmim/penvoyage:0.2.0 -t jasmim/penvoyage:última penvoyage

A sua saída deve terminar com as linhas

Marcação bem sucedida de jasmim/penovieza:0.2.0
Jasmim/penoviejo marcado com sucesso:mais recente

Criar a rede de docas

rede de docas criar -d ponte-multi-ponte-redes

Vamos usar esta rede para fixar os dois contentores um ao outro, para que eles se vejam um ao outro.

Os contentores podem falar uns com os outros usando os nomes dos seus contentores, quando estão na mesma rede de contentores.

Por exemplo, você pode fazer

deus-ping

onde taxgod é o nome do contentor.

Para adicionar um recipiente a uma rede depois de ter sido executado, faça o seguinte:

rede de docas ligar a minha rede de trabalho-importante

Neste caso, a minha rede é a rede, e o taxgod é o contentor a ser ligado a ela.

Para ver como um recipiente que é executado está conectado a uma determinada rede, veja abaixo.

Para ver que contentores estão numa determinada rede Docker, execute o seguinte comando:

rede de docas inspeccionar a minha rede de pontes

Executar a imagem do contentor da penvoyage

docker run -rm -it -p 80:80 -p 443:443 -p 9901:9901 -network=my-bridge-network jasmim/penvoyage

Isto vai:

  • -rm remover o recipiente após o seu encerramento
  • -fixar-se ao contentor (para que se possa ver a saída do enviado)
  • -p 80:80 mapa porta 80 para porta 80 dentro do contêiner (no arquivo Docker eu defini esta como sendo a porta tcp)
  • repetir para a porta 443 e a porta 9901
  • prender o contentor à minha rede-ponte
  • construir o contentor a partir da imagem jasmim/penvoyage:latest (:latest está implícito aqui)

O que vai fazer este contentor?

Ele irá proxy conexões para o host (no meu caso no IP 192.168.1.2) para o container taxgod, na porta 3000.

Ele atuará como um proxy https com os certificados de amostra, e procurará as conexões com o mesmo container de taxgod, na porta 3000.

envoy.yaml

Por favor note: yaml usa espaço em branco para estrutura, o mais provável é que o WordPress MENSAGINE isto. Então use isto como uma referência, em vez de copiar e colar!


estática_recursos:
   Ouvintes:
   - morada:
       endereço_da_cova:
         morada: 0.0.0.0
         port_value: 80
     filter_chains:
     - filtros:
       - nome: envoy.http_connection_manager
         configurar:
           codec_type: auto
           stat_prefix: ingresso_http
           route_config:
             nome: local_route
             virtual_hosts:
             - nome: local_service
               domínios: [“*”]
               rotas:
               - ...partida: Prefixo: “/” }
                 rota: { cluster: target_taxgod }
           http_filters:
           - nome: envoy.router
   - morada:
       endereço_da_cova:
         morada: 0.0.0.0
         port_value: 443
     filter_chains:
     - tls_context:
         texto_comum_tls_context:
           tls_certificates:
           - cadeia_cade certificado: { nome do ficheiro: "/etc/example-com.crt" }
             private_key: { filename: "/etc/example-com.key" }
       filtros:
       - nome: envoy.http_connection_manager
         configurar:
           stat_prefix: ingresso_https
           route_config:
             virtual_hosts:
             - nome: default
               domínios: [“*”]
               rotas:
               - ...partida: Prefixo: “/” }
                 rota: { cluster: target_taxgod }
           http_filters:
           - nome: envoy.router
   grupos:
   - nome: target_taxgod
     connect_timeout: 0.25s
     tipo: strict_dns
     lb_policy: round_robin
     anfitriões:
     - endereço_da_cova:
         endereço: taxgod
         port_value: 3000
administração:
   access_log_path: "/tmp/envoy.log"
   morada:
     endereço_da_cova:
       morada: 0.0.0.0
       port_value: 9901


Breve explicação do ficheiro do enviado yaml:

Existem duas secções principais, recursos_estáticos e administração

admin é para a administração do emissário e fora do âmbito deste artigo. Em um ambiente de produção, você provavelmente precisará assegurá-lo apropriadamente. NÃO COPIE E COLE ESSA PARTE!!!

static_resources define uma configuração estática para envoy (o envoy também pode ser configurado usando sua API)

nos ouvintes, definimos em que portas queremos ouvir, e o que deve acontecer com as conexões.

  • endereço - define endereço e porta para ouvir em
    • envoy.http_connection_manager - gerencia conexões http, lê cabeçalhos, etc. é um filtro pré-definido
    • stat_prefix: define um nome legível por humanos para logs / estatísticas
    • domínios: ["*"] - corresponde a todos os domínios
    • rota: { cluster: target_taxgod } - irá encaminhar o tráfego para o nosso cluster target_taxgod (irá corresponder a /, ou seja, tudo no site)

o endereço e sua sub configuração é repetida duas vezes, uma para a porta 80, e outra para a porta 443. Para a porta 443 também adicionamos o tls_context e common_tls_context nas cadeias de filtragem para injetar os certificados.

Note que ainda é envoy.http_connection_manager, NÃO https_connection_manager para a porta 443.

em clusters definimos nossos pontos finais aos quais queremos ser capazes de nos conectar / proxy de tráfego.

  • o agrupamento tem um nome
  • um tempo limite de conexão
  • lb_policy - a política de equilíbrio de carga. Existe apenas um host, portanto ele receberá todo o tráfego (round_robin significa que cada host receberá o tráfego por sua vez)
  • nos anfitriões, o endereço do socket_address é definido como endereço taxgod - este é o nome do Docker do contentor, e o porto como port_value 3000

O porto 3000 é o porto interno do taxgod do contêiner, não é o porto ao qual você o prende no host externo!

Espero que este post no blogue ajude as pessoas que tentam montar uma configuração https:// em enviado.

Mensagens de erro

imagem

Enviado nenhuma corrente sã a montante mensagem de erro

o recipiente do enviado não está na mesma rede da Docker como seu recipiente alvo, como não pode vê-lo, não pode ligar-se a ele.

imagem

Enviado erro de conexão a montante ou desconectar/resetar antes dos cabeçalhos erro

Tente remover

http2_protocol_options: {}

do seu enviado.yaml

Recursos úteis