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
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.yamlEXPOSIÇÃO 80/tcp
EXPOSIÇÃO 443/tcp
#Educated adivinhe que isto é TCP
EXPOSE 9901/tcpLABEL 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
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.
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
- https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/http_connection_management
- https://runnable.com/docker/basic-docker-networking
- https://docs.docker.com/engine/reference/commandline/network_create/
- https://docs.docker.com/v17.09/engine/userguide/networking/
- https://github.com/envoyproxy/envoy/tree/master/examples/front-proxy
- https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/http_routing
- https://www.envoyproxy.io/docs/envoy/latest/configuration/http_conn_man/header_sanitizing
- https://www.envoyproxy.io/docs/envoy/latest/api-v2/api/v2/route/route.proto#envoy-api-field-route-routeaction-host-rewrite
- prefix_rewrite parece interessante - permite alterar as URLs das aplicações para um caminho diferente do exposto na camada de proxy reversa
- https://www.envoyproxy.io/docs/envoy/latest/api-v2/config/filter/network/http_connection_manager/v2/http_connection_manager.proto#envoy-api-enum-config-filter-network-http-connection-manager-v2-httpconnectionmanager-codectype
- existem filtros incorporados
- https://www.envoyproxy.io/docs/envoy/latest/configuration/http_filters/router_filter#config-http-filters-router
- "O filtro do roteador implementa o encaminhamento HTTP. Ele será usado em quase todos os cenários de proxy HTTP para os quais o Envoy é implantado".
- https://blog.turbinelabs.io/setting-up-ssl-with-envoy-f7c5aa06a5ce
- tem uma seção sobre redirecionamento do tráfego inseguro
- https://www.envoyproxy.io/try/migrating-from-nginx-to-envoy
- útil também como uma introdução ao Enviado
- https://www.envoyproxy.io/docs/envoy/latest/configuration/access_log#config-access-log-format-dictionaries