Nginx์—์„œ Envoy ํ”„๋ก์‹œ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

์•ˆ๋…•, ํ•˜๋ธŒ๋ฅด! ๊ฒŒ์‹œ๋ฌผ ๋ฒˆ์—ญ์„ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค. Nginx์—์„œ Envoy ํ”„๋ก์‹œ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜.

Envoy๋Š” ๊ฐœ๋ณ„ ์„œ๋น„์Šค ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์šฉ์œผ๋กœ ์„ค๊ณ„๋œ ๊ณ ์„ฑ๋Šฅ ๋ถ„์‚ฐ ํ”„๋ก์‹œ ์„œ๋ฒ„(C++๋กœ ์ž‘์„ฑ)์ด๋ฉฐ, ๋Œ€๊ทœ๋ชจ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค "์„œ๋น„์Šค ๋ฉ”์‹œ" ์•„ํ‚คํ…์ฒ˜์šฉ์œผ๋กœ ์„ค๊ณ„๋œ ํ†ต์‹  ๋ฒ„์Šค์ด์ž "๋ฒ”์šฉ ๋ฐ์ดํ„ฐ ํ”Œ๋ ˆ์ธ"์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๋งŒ๋“ค ๋•Œ NGINX, HAProxy, ํ•˜๋“œ์›จ์–ด ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ, ํด๋ผ์šฐ๋“œ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ๋“ฑ ์„œ๋ฒ„ ๊ฐœ๋ฐœ ์ค‘์— ๋ฐœ์ƒํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์„ ๊ณ ๋ คํ–ˆ์Šต๋‹ˆ๋‹ค. Envoy๋Š” ๊ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๊ณ  ๋„คํŠธ์›Œํฌ๋ฅผ ์ถ”์ƒํ™”ํ•˜์—ฌ ํ”Œ๋žซํผ์— ๊ด€๊ณ„์—†์ด ๊ณตํ†ต ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ธํ”„๋ผ์˜ ๋ชจ๋“  ์„œ๋น„์Šค ํŠธ๋ž˜ํ”ฝ์ด Envoy ๋ฉ”์‹œ๋ฅผ ํ†ตํ•ด ํ๋ฅด๋ฉด ์ผ๊ด€๋œ ๊ด€์ฐฐ ๊ฐ€๋Šฅ์„ฑ์œผ๋กœ ๋ฌธ์ œ ์˜์—ญ์„ ์‹œ๊ฐํ™”ํ•˜๊ณ , ์ „๋ฐ˜์ ์ธ ์„ฑ๋Šฅ์„ ์กฐ์ •ํ•˜๊ณ , ํŠน์ • ์œ„์น˜์— ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ

  • ๋…๋ฆฝ ํ”„๋กœ์„ธ์Šค ์•„ํ‚คํ…์ฒ˜: Envoy๋Š” ์†Œ๋Ÿ‰์˜ RAM์„ ์ฐจ์ง€ํ•˜๋Š” ๋…๋ฆฝํ˜• ๊ณ ์„ฑ๋Šฅ ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์–ธ์–ด ๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
  • http/2 ๋ฐ grpc ์ง€์›: envoy๋Š” ๋“ค์–ด์˜ค๊ณ  ๋‚˜๊ฐ€๋Š” ์—ฐ๊ฒฐ์— ๋Œ€ํ•ด ์ตœ๊ณ  ์ˆ˜์ค€์˜ http/2 ๋ฐ grpc ์ง€์›์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” http/1.1์—์„œ http/2๊นŒ์ง€์˜ ํˆฌ๋ช… ํ”„๋ก์‹œ์ž…๋‹ˆ๋‹ค.
  • ๊ณ ๊ธ‰ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ: Envoy๋Š” ์ž๋™ ์žฌ์‹œ๋„, ์ฒด์ธ ์ฐจ๋‹จ, ์ „์—ญ ์†๋„ ์ œํ•œ, ์š”์ฒญ ์„€๋„์ž‰, ๋กœ์ปฌ ์˜์—ญ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ๋“ฑ์„ ํฌํ•จํ•œ ๊ณ ๊ธ‰ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ตฌ์„ฑ ๊ด€๋ฆฌ API: Envoy๋Š” ๊ตฌ์„ฑ์„ ๋™์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ•๋ ฅํ•œ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๊ด€์ฐฐ ๊ฐ€๋Šฅ์„ฑ: L7 ํŠธ๋ž˜ํ”ฝ์— ๋Œ€ํ•œ ์‹ฌ์ธต์ ์ธ ๊ด€์ฐฐ ๊ฐ€๋Šฅ์„ฑ, ๋ถ„์‚ฐ ์ถ”์ ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ง€์›, mongodb, dynamodb ๋ฐ ๊ธฐํƒ€ ์—ฌ๋Ÿฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ด€์ฐฐ ๊ฐ€๋Šฅ์„ฑ.

1๋‹จ๊ณ„ - NGINX ๊ตฌ์„ฑ ์˜ˆ

์ด ์Šคํฌ๋ฆฝํŠธ๋Š” ํŠน๋ณ„ํžˆ ์ œ์ž‘๋œ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. nginx.conf, ์ „์ฒด ์˜ˆ์ œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ NGINX ์œ„ํ‚ค. ํŽธ์ง‘๊ธฐ๋ฅผ ์—ด์–ด์„œ ๊ตฌ์„ฑ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. nginx.conf

nginx ์†Œ์Šค ๊ตฌ์„ฑ

user  www www;
pid /var/run/nginx.pid;
worker_processes  2;

events {
  worker_connections   2000;
}

http {
  gzip on;
  gzip_min_length  1100;
  gzip_buffers     4 8k;
  gzip_types       text/plain;

  log_format main      '$remote_addr - $remote_user [$time_local]  '
    '"$request" $status $bytes_sent '
    '"$http_referer" "$http_user_agent" '
    '"$gzip_ratio"';

  log_format download  '$remote_addr - $remote_user [$time_local]  '
    '"$request" $status $bytes_sent '
    '"$http_referer" "$http_user_agent" '
    '"$http_range" "$sent_http_content_range"';

  upstream targetCluster {
    172.18.0.3:80;
    172.18.0.4:80;
  }

  server {
    listen        8080;
    server_name   one.example.com  www.one.example.com;

    access_log   /var/log/nginx.access_log  main;
    error_log  /var/log/nginx.error_log  info;

    location / {
      proxy_pass         http://targetCluster/;
      proxy_redirect     off;

      proxy_set_header   Host             $host;
      proxy_set_header   X-Real-IP        $remote_addr;
    }
  }
}

NGINX ๊ตฌ์„ฑ์—๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์„ธ ๊ฐ€์ง€ ํ•ต์‹ฌ ์š”์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. NGINX ์„œ๋ฒ„, ๋กœ๊ทธ ๊ตฌ์กฐ ๋ฐ Gzip ๊ธฐ๋Šฅ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์— ์ „์—ญ์ ์œผ๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค.
  2. ํ˜ธ์ŠคํŠธ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ์ˆ˜๋ฝํ•˜๋„๋ก NGINX ๊ตฌ์„ฑ one.example.com ํฌํŠธ 8080์—์„œ.
  3. ๋Œ€์ƒ ์œ„์น˜ ์„ค์ •, URL์˜ ๋‹ค์–‘ํ•œ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•.

๋ชจ๋“  ๊ตฌ์„ฑ์ด Envoy ํ”„๋ก์‹œ์— ์ ์šฉ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ ์ผ๋ถ€ ์„ค์ •์„ ๊ตฌ์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํŠน์‚ฌ ํ”„๋ก์‹œ๋Š” ๋„ค ๊ฐ€์ง€ ์ฃผ์š” ์œ ํ˜•NGINX๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํ•ต์‹ฌ ์ธํ”„๋ผ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ํ•ต์‹ฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ์ฒญ์ทจ์ž: Envoy ํ”„๋ก์‹œ๊ฐ€ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ์ˆ˜๋ฝํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. Envoy ํ”„๋ก์‹œ๋Š” ํ˜„์žฌ TCP ๊ธฐ๋ฐ˜ ๋ฆฌ์Šค๋„ˆ๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ์ด ์„ค์ •๋˜๋ฉด ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ํ•„ํ„ฐ ์„ธํŠธ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
  • ํ•„ํ„ฐ: ์ด๋Š” ๋“ค์–ด์˜ค๊ณ  ๋‚˜๊ฐ€๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ์ดํ”„๋ผ์ธ ์•„ํ‚คํ…์ฒ˜์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์—๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ๋ณด๋‚ด๊ธฐ ์ „์— ์••์ถ•ํ•˜๋Š” Gzip๊ณผ ๊ฐ™์€ ํ•„ํ„ฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ผ์šฐํ„ฐ: ํด๋Ÿฌ์Šคํ„ฐ๋กœ ์ •์˜๋œ ํ•„์ˆ˜ ๋Œ€์ƒ์œผ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • ํด๋Ÿฌ์Šคํ„ฐ: ํŠธ๋ž˜ํ”ฝ ๋ฐ ๊ตฌ์„ฑ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋„ค ๊ฐ€์ง€ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • NGINX ๊ตฌ์„ฑ๊ณผ ์ผ์น˜ํ•˜๋Š” Envoy ํ”„๋ก์‹œ ๊ตฌ์„ฑ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. Envoy์˜ ๋ชฉํ‘œ๋Š” API ๋ฐ ๋™์  ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๊ธฐ๋ณธ ๊ตฌ์„ฑ์€ NGINX์˜ ์ •์ , ํ•˜๋“œ ์ฝ”๋”ฉ๋œ ์„ค์ •์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

2๋‹จ๊ณ„ - NGINX ๊ตฌ์„ฑ

์ฒซ ๋ฒˆ์งธ ๋ถ€๋ถ„ nginx.conf ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋Š” ์ผ๋ถ€ NGINX ๋‚ด๋ถ€๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

์ž‘์—…์ž ์—ฐ๊ฒฐ

์•„๋ž˜ ๊ตฌ์„ฑ์€ ์ž‘์—…์ž ํ”„๋กœ์„ธ์Šค ๋ฐ ์—ฐ๊ฒฐ ์ˆ˜๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” NGINX๊ฐ€ ์ˆ˜์š”๋ฅผ ์ถฉ์กฑํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ป๊ฒŒ ํ™•์žฅ๋˜๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

worker_processes  2;

events {
  worker_connections   2000;
}

Envoy ํ”„๋ก์‹œ๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ์›Œํฌํ”Œ๋กœ์™€ ์—ฐ๊ฒฐ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Envoy๋Š” ์‹œ์Šคํ…œ์˜ ๊ฐ ํ•˜๋“œ์›จ์–ด ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•ด ์ž‘์—…์ž ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์ž‘์—…์ž ์Šค๋ ˆ๋“œ๋Š” ๋‹ค์Œ์„ ๋‹ด๋‹นํ•˜๋Š” ๋น„์ฐจ๋‹จ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ฒญ์ทจ์ž ํ•œ ๋ถ„ ํ•œ ๋ถ„์˜ ๋ง์”€์„ ๋“ฃ๊ณ 
  2. ์ƒˆ๋กœ์šด ์—ฐ๊ฒฐ ์ˆ˜๋ฝ
  3. ์—ฐ๊ฒฐ์„ ์œ„ํ•œ ํ•„ํ„ฐ ์„ธํŠธ ๋งŒ๋“ค๊ธฐ
  4. ์—ฐ๊ฒฐ ์ˆ˜๋ช… ๋™์•ˆ ๋ชจ๋“  I/O ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ „๋‹ฌ ๋™์ž‘์„ ํฌํ•จํ•˜์—ฌ ๋ชจ๋“  ์ถ”๊ฐ€ ์—ฐ๊ฒฐ ์ฒ˜๋ฆฌ๋Š” ์ „์ ์œผ๋กœ ์ž‘์—…์ž ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

Envoy์˜ ๊ฐ ์ž‘์—…์ž ์Šค๋ ˆ๋“œ์—๋Š” ์—ฐ๊ฒฐ ํ’€์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ HTTP/2 ์—ฐ๊ฒฐ ํ’€์€ ์™ธ๋ถ€ ํ˜ธ์ŠคํŠธ๋‹น ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์—ฐ๊ฒฐ๋งŒ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…์ž ์Šค๋ ˆ๋“œ๊ฐ€ 2๊ฐœ๋ผ๋ฉด ์•ˆ์ •์ ์ธ ์ƒํƒœ์—์„œ๋Š” ์™ธ๋ถ€ ํ˜ธ์ŠคํŠธ๋‹น XNUMX๊ฐœ์˜ HTTP/XNUMX ์—ฐ๊ฒฐ์ด ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์„ ํ•˜๋‚˜์˜ ์ž‘์—…์ž ์Šค๋ ˆ๋“œ์— ์œ ์ง€ํ•จ์œผ๋กœ์จ ๋งˆ์น˜ ๋‹จ์ผ ์Šค๋ ˆ๋“œ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๊ฑฐ์˜ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์ฐจ๋‹จ ์—†์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ์ž‘์—…์ž ์Šค๋ ˆ๋“œ๊ฐ€ ํ• ๋‹น๋˜๋ฉด ์ด๋กœ ์ธํ•ด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋‚ญ๋น„๋˜๊ณ  ์œ ํœด ์—ฐ๊ฒฐ์ด ๋งŽ์ด ์ƒ์„ฑ๋˜๋ฉฐ ์—ฐ๊ฒฐ์ด ํ’€๋กœ ๋‹ค์‹œ ๋ฐ˜ํ™˜๋˜๋Š” ํšŸ์ˆ˜๊ฐ€ ์ค„์–ด๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž์„ธํ•œ ์ •๋ณด๋Š” Envoy ํ”„๋ก์‹œ ๋ธ”๋กœ๊ทธ.

HTTP ๊ตฌ์„ฑ

๋‹ค์Œ NGINX ๊ตฌ์„ฑ ๋ธ”๋ก์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ HTTP ์„ค์ •์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

  • ์ง€์›๋˜๋Š” MIME ์œ ํ˜•
  • ๊ธฐ๋ณธ ์‹œ๊ฐ„ ์ดˆ๊ณผ
  • Gzip ๊ตฌ์„ฑ

๋‚˜์ค‘์— ์„ค๋ช…ํ•  Envoy ํ”„๋ก์‹œ์˜ ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์ธก๋ฉด์„ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3๋‹จ๊ณ„ - ์„œ๋ฒ„ ๊ตฌ์„ฑ

HTTP ๊ตฌ์„ฑ ๋ธ”๋ก์—์„œ NGINX ๊ตฌ์„ฑ์€ ํฌํŠธ 8080์—์„œ ์ˆ˜์‹  ๋Œ€๊ธฐํ•˜๊ณ  ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ ์ˆ˜์‹  ์š”์ฒญ์— ์‘๋‹ตํ•˜๋„๋ก ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. one.example.com ะธ www.one.example.com.

 server {
    listen        8080;
    server_name   one.example.com  www.one.example.com;

Envoy ๋‚ด๋ถ€์—์„œ๋Š” Listener์— ์˜ํ•ด ์ œ์–ด๋ฉ๋‹ˆ๋‹ค.

ํŠน์‚ฌ ์ฒญ์ทจ์ž

Envoy Proxy๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ธก๋ฉด์€ ์ฒญ์ทจ์ž๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Envoy ์ธ์Šคํ„ด์Šค ์‹คํ–‰ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜ ์Šค๋‹ˆํŽซ์€ ์ƒˆ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ ํฌํŠธ 8080์— ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์„ฑ์€ ์ˆ˜์‹  ์š”์ฒญ์— ๋Œ€ํ•ด ๋ฐ”์ธ๋”ฉํ•ด์•ผ ํ•˜๋Š” ํฌํŠธ๋ฅผ Envoy ํ”„๋ก์‹œ์— ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

Envoy ํ”„๋ก์‹œ๋Š” ๊ตฌ์„ฑ์— YAML ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ํ‘œ๊ธฐ๋ฒ•์— ๋Œ€ํ•œ ์†Œ๊ฐœ๋Š” ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ๋งํฌ.

Copy to Editorstatic_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: { address: 0.0.0.0, port_value: 8080 }

์ •์˜ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์ด๋ฆ„, Envoy ํ”„๋ก์‹œ ํ•„ํ„ฐ๊ฐ€ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

4๋‹จ๊ณ„ - ์œ„์น˜ ๊ตฌ์„ฑ

์š”์ฒญ์ด NGINX์— ๋“ค์–ด์˜ค๋ฉด ์œ„์น˜ ๋ธ”๋ก์€ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ๋ผ์šฐํŒ…ํ•  ์œ„์น˜๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์กฐ๊ฐ์—์„œ๋Š” ์‚ฌ์ดํŠธ์— ๋Œ€ํ•œ ๋ชจ๋“  ํŠธ๋ž˜ํ”ฝ์ด ์ด๋ฆ„์ด ์ง€์ •๋œ ์—…์ŠคํŠธ๋ฆผ(๋ฒˆ์—ญ์ž ์ฐธ๊ณ  ์‚ฌํ•ญ: ์—…์ŠคํŠธ๋ฆผ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์ž„) ํด๋Ÿฌ์Šคํ„ฐ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ํƒ€๊ฒŸํด๋Ÿฌ์Šคํ„ฐ. ์—…์ŠคํŠธ๋ฆผ ํด๋Ÿฌ์Šคํ„ฐ๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ ๋…ผ์˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

location / {
    proxy_pass         http://targetCluster/;
    proxy_redirect     off;

    proxy_set_header   Host             $host;
    proxy_set_header   X-Real-IP        $remote_addr;
}

Envoy์—์„œ๋Š” Filters๊ฐ€ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํŠน์‚ฌ ํ•„ํ„ฐ

์ •์  ๊ตฌ์„ฑ์˜ ๊ฒฝ์šฐ ํ•„ํ„ฐ๋Š” ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ผ์น˜ํ•˜๋Š” ํ•„ํ„ฐ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์ด๋ฆ„ ์ด์ „ ๋‹จ๊ณ„์—์„œ. ํŠน์ • ๋„๋ฉ”์ธ ๋ฐ ๊ฒฝ๋กœ์™€ ์ผ์น˜ํ•˜๋Š” ์ˆ˜์‹  ์š”์ฒญ์ด ๋„์ฐฉํ•˜๋ฉด ํŠธ๋ž˜ํ”ฝ์ด ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๋ผ์šฐํŒ…๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” NGINX ์ƒํ–ฅ์‹ ๊ตฌ์„ฑ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

Copy to Editor    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        config:
          codec_type: auto
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: backend
              domains:
                - "one.example.com"
                - "www.one.example.com"
              routes:
              - match:
                  prefix: "/"
                route:
                  cluster: targetCluster
          http_filters:
          - name: envoy.router

์ด๋ฆ„ ํŠน์‚ฌ.http_connection_manager Envoy Proxy์— ๋‚ด์žฅ๋œ ํ•„ํ„ฐ์ž…๋‹ˆ๋‹ค. ๊ธฐํƒ€ ํ•„ํ„ฐ์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. Redis, ๋ชฝ๊ณ , TCP. ์ „์ฒด ๋ชฉ๋ก์€ ๋‹ค์Œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ์  ์„œ๋ฅ˜ ๋น„์น˜.

๋‹ค๋ฅธ ๋ถ€ํ•˜ ๋ถ„์‚ฐ ์ •์ฑ…์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์„ ๋ณด๋ ค๋ฉด ๋‹ค์Œ์„ ๋ฐฉ๋ฌธํ•˜์„ธ์š”. ํŠน์‚ฌ ๋ฌธ์„œ.

5๋‹จ๊ณ„ - ํ”„๋ก์‹œ ๋ฐ ์—…์ŠคํŠธ๋ฆผ ๊ตฌ์„ฑ

NGINX์—์„œ ์—…์ŠคํŠธ๋ฆผ ๊ตฌ์„ฑ์€ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•  ๋Œ€์ƒ ์„œ๋ฒ„ ์„ธํŠธ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋‘ ๊ฐœ์˜ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ํ• ๋‹น๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  upstream targetCluster {
    172.18.0.3:80;
    172.18.0.4:80;
  }

Envoy์—์„œ๋Š” ์ด๋Š” ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

ํŠน์‚ฌ ํด๋Ÿฌ์Šคํ„ฐ

์—…์ŠคํŠธ๋ฆผ์— ํ•ด๋‹นํ•˜๋Š” ํ•ญ๋ชฉ์€ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ํŠธ๋ž˜ํ”ฝ์„ ์ œ๊ณตํ•  ํ˜ธ์ŠคํŠธ๊ฐ€ ์‹๋ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋“ฑ ํ˜ธ์ŠคํŠธ์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐฉ์‹์€ ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ์œผ๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋Œ€๊ธฐ ์‹œ๊ฐ„ ๋ฐ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ๊ณผ ๊ฐ™์€ ์ธก๋ฉด์„ ๋ณด๋‹ค ์„ธ๋ถ€์ ์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Copy to Editor  clusters:
  - name: targetCluster
    connect_timeout: 0.25s
    type: STRICT_DNS
    dns_lookup_family: V4_ONLY
    lb_policy: ROUND_ROBIN
    hosts: [
      { socket_address: { address: 172.18.0.3, port_value: 80 }},
      { socket_address: { address: 172.18.0.4, port_value: 80 }}
    ]

์„œ๋น„์Šค ๊ฒ€์ƒ‰์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ STRICT_DNS Envoy๋Š” ์ง€์ •๋œ DNS ๋Œ€์ƒ์„ ์ง€์†์ ์œผ๋กœ ๋น„๋™๊ธฐ์‹์œผ๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. DNS ๊ฒฐ๊ณผ์—์„œ ๋ฐ˜ํ™˜๋œ ๊ฐ IP ์ฃผ์†Œ๋Š” ์—…์ŠคํŠธ๋ฆผ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ช…์‹œ์  ํ˜ธ์ŠคํŠธ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์š”์ฒญ์ด ๋‘ ๊ฐœ์˜ IP ์ฃผ์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ Envoy๋Š” ํด๋Ÿฌ์Šคํ„ฐ์— ๋‘ ๊ฐœ์˜ ํ˜ธ์ŠคํŠธ๊ฐ€ ์žˆ๊ณ  ๋‘˜ ๋‹ค ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์—์„œ ํ˜ธ์ŠคํŠธ๊ฐ€ ์ œ๊ฑฐ๋˜๋ฉด Envoy๋Š” ํ•ด๋‹น ํ˜ธ์ŠคํŠธ๊ฐ€ ๋” ์ด์ƒ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๊ธฐ์กด ์—ฐ๊ฒฐ ํ’€์—์„œ ํŠธ๋ž˜ํ”ฝ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ ํŠน์‚ฌ ํ”„๋ก์‹œ ๋ฌธ์„œ.

6๋‹จ๊ณ„ - ๋กœ๊ทธ ์•ก์„ธ์Šค ๋ฐ ์˜ค๋ฅ˜

์ตœ์ข… ๊ตฌ์„ฑ์€ ๋“ฑ๋ก์ž…๋‹ˆ๋‹ค. Envoy Proxy๋Š” ์˜ค๋ฅ˜ ๋กœ๊ทธ๋ฅผ ๋””์Šคํฌ์— ํ‘ธ์‹œํ•˜๋Š” ๋Œ€์‹  ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ทจํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๊ทธ๋Š” ๋‹ค์Œ์œผ๋กœ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. ํ‘œ์ค€ ์ถœ๋ ฅ ะธ ํ‘œ์ค€ ์˜ค๋ฅ˜.

์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•  ๋•Œ ์•ก์„ธ์Šค ๋กœ๊ทธ๋Š” ์„ ํƒ ์‚ฌํ•ญ์ด๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. HTTP ์š”์ฒญ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๋กœ๊ทธ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ๊ตฌ์„ฑ์„ ํ™œ์„ฑํ™”ํ•˜์‹ญ์‹œ์˜ค. ์•ก์„ธ์Šค_๋กœ๊ทธ HTTP ์—ฐ๊ฒฐ ๊ด€๋ฆฌ์ž์˜ ๊ฒฝ์šฐ. ๊ฒฝ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์žฅ์น˜์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‘œ์ค€ ์ถœ๋ ฅ, ๋˜๋Š” ์š”๊ตฌ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ๋””์Šคํฌ์˜ ํŒŒ์ผ.

๋‹ค์Œ ๊ตฌ์„ฑ์€ ๋ชจ๋“  ์•ก์„ธ์Šค ๋กœ๊ทธ๋ฅผ ๋‹ค์Œ์œผ๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•ฉ๋‹ˆ๋‹ค. ํ‘œ์ค€ ์ถœ๋ ฅ (๋ฒˆ์—ญ์ž ์ฐธ๊ณ  ์‚ฌํ•ญ - docker ๋‚ด๋ถ€์—์„œ envoy๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด stdout์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. docker ์—†์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ /dev/stdout์„ ์ผ๋ฐ˜ ๋กœ๊ทธ ํŒŒ์ผ ๊ฒฝ๋กœ๋กœ ๋ฐ”๊พธ์„ธ์š”.) ์—ฐ๊ฒฐ ๊ด€๋ฆฌ์ž์˜ ๊ตฌ์„ฑ ์„น์…˜์— ์ฝ”๋“œ ์กฐ๊ฐ์„ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

Copy to Clipboardaccess_log:
- name: envoy.file_access_log
  config:
    path: "/dev/stdout"

๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

      - name: envoy.http_connection_manager
        config:
          codec_type: auto
          stat_prefix: ingress_http
          access_log:
          - name: envoy.file_access_log
            config:
              path: "/dev/stdout"
          route_config:

๊ธฐ๋ณธ์ ์œผ๋กœ Envoy์—๋Š” HTTP ์š”์ฒญ์˜ ์„ธ๋ถ€์ •๋ณด๊ฐ€ ํฌํ•จ๋œ ํ˜•์‹ ๋ฌธ์ž์—ด์ด ์žˆ์Šต๋‹ˆ๋‹ค.

[%START_TIME%] "%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%" %RESPONSE_CODE% %RESPONSE_FLAGS% %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% "%REQ(X-FORWARDED-FOR)%" "%REQ(USER-AGENT)%" "%REQ(X-REQUEST-ID)%" "%REQ(:AUTHORITY)%" "%UPSTREAM_HOST%"n

์ด ํ˜•์‹ ๋ฌธ์ž์—ด์˜ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

[2018-11-23T04:51:00.281Z] "GET / HTTP/1.1" 200 - 0 58 4 1 "-" "curl/7.47.0" "f21ebd42-6770-4aa5-88d4-e56118165a7d" "one.example.com" "172.18.0.4:80"

์ถœ๋ ฅ ๋‚ด์šฉ์€ ํ˜•์‹ ํ•„๋“œ๋ฅผ ์„ค์ •ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

access_log:
- name: envoy.file_access_log
  config:
    path: "/dev/stdout"
    format: "[%START_TIME%] "%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%" %RESPONSE_CODE% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% "%REQ(X-REQUEST-ID)%" "%REQ(:AUTHORITY)%" "%UPSTREAM_HOST%"n"

ํ•„๋“œ๋ฅผ ์„ค์ •ํ•˜์—ฌ ๋กœ๊ทธ ๋ผ์ธ์„ JSON ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. json_format. ์˜ˆ :

access_log:
- name: envoy.file_access_log
  config:
    path: "/dev/stdout"
    json_format: {"protocol": "%PROTOCOL%", "duration": "%DURATION%", "request_method": "%REQ(:METHOD)%"}

Envoy ๋“ฑ๋ก ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์„ ๋ณด๋ ค๋ฉด ๋‹ค์Œ ์‚ฌ์ดํŠธ๋ฅผ ๋ฐฉ๋ฌธํ•˜์„ธ์š”.

https://www.envoyproxy.io/docs/envoy/latest/configuration/access_log#config-access-log-format-dictionaries

๋กœ๊น…์ด Envoy ํ”„๋ก์‹œ ์ž‘์—…์— ๋Œ€ํ•œ ํ†ต์ฐฐ๋ ฅ์„ ์–ป๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ ์•„๋‹™๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๊ณ ๊ธ‰ ์ถ”์  ๋ฐ ์ธก์ • ๊ธฐ๋Šฅ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ”์  ๋ฌธ์„œ ๋˜๋Š”๋ฅผ ํ†ตํ•ด ๋Œ€ํ™”ํ˜• ์ถ”์  ์Šคํฌ๋ฆฝํŠธ.

7๋‹จ๊ณ„ - ์‹คํ–‰

์ด์ œ ๊ตฌ์„ฑ์„ NGINX์—์„œ Envoy ํ”„๋ก์‹œ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„๋Š” Envoy Proxy ์ธ์Šคํ„ด์Šค๋ฅผ ์‹œ์ž‘ํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๋กœ ์‹คํ–‰

NGINX ๊ตฌ์„ฑ ์ค„ ์ƒ๋‹จ์— ์‚ฌ์šฉ์ž www www; ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋‚ฎ์€ ๊ถŒํ•œ์˜ ์‚ฌ์šฉ์ž๋กœ NGINX๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

Envoy Proxy๋Š” ํ”„๋กœ์„ธ์Šค ์†Œ์œ ์ž๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ†ตํ•ด Envoy ํ”„๋ก์‹œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ๊ถŒํ•œ์ด ๋‚ฎ์€ ์‚ฌ์šฉ์ž๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Envoy ํ”„๋ก์‹œ ์‹คํ–‰

์•„๋ž˜ ๋ช…๋ น์€ ํ˜ธ์ŠคํŠธ์˜ Docker ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ†ตํ•ด Envoy ํ”„๋ก์‹œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋ฉด Envoy๋Š” ํฌํŠธ 80์—์„œ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์„ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฆฌ์Šค๋„ˆ ๊ตฌ์„ฑ์— ์ง€์ •๋œ ๋Œ€๋กœ Envoy ํ”„๋ก์‹œ๋Š” ํฌํŠธ 8080์—์„œ ๋“ค์–ด์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ์„ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‚ฎ์€ ๊ถŒํ•œ์˜ ์‚ฌ์šฉ์ž๋กœ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

docker run --name proxy1 -p 80:8080 --user 1000:1000 -v /root/envoy.yaml:/etc/envoy/envoy.yaml envoyproxy/envoy

ํ…Œ์ŠคํŠธ

ํ”„๋ก์‹œ๊ฐ€ ์‹คํ–‰๋˜๋ฉด ์ด์ œ ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ cURL ๋ช…๋ น์€ ํ”„๋ก์‹œ ๊ตฌ์„ฑ์— ์ •์˜๋œ ํ˜ธ์ŠคํŠธ ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ์„ ๋ฐœํ–‰ํ•ฉ๋‹ˆ๋‹ค.

curl -H "Host: one.example.com" localhost -i

HTTP ์š”์ฒญ์œผ๋กœ ์ธํ•ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. 503. ์ด๋Š” ์—…์ŠคํŠธ๋ฆผ ์—ฐ๊ฒฐ์ด ์ž‘๋™ํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Envoy ํ”„๋ก์‹œ์—๋Š” ์š”์ฒญ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€์ƒ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ช…๋ น์€ Envoy์— ์ •์˜๋œ ๊ตฌ์„ฑ๊ณผ ์ผ์น˜ํ•˜๋Š” ์ผ๋ จ์˜ HTTP ์„œ๋น„์Šค๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

docker run -d katacoda/docker-http-server; docker run -d katacoda/docker-http-server;

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์„œ๋น„์Šค๋ฅผ ํ†ตํ•ด Envoy๋Š” ํŠธ๋ž˜ํ”ฝ์„ ๋Œ€์ƒ์œผ๋กœ ์„ฑ๊ณต์ ์œผ๋กœ ํ”„๋ก์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

curl -H "Host: one.example.com" localhost -i

์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ Docker ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์‘๋‹ต์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. Envoy ํ”„๋ก์‹œ ๋กœ๊ทธ์—๋Š” ์•ก์„ธ์Šค ๋ฌธ์ž์—ด ์ถœ๋ ฅ๋„ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€ HTTP ์‘๋‹ต ํ—ค๋”

์‹ค์ œ ์š”์ฒญ์˜ ์‘๋‹ต ํ—ค๋”์— ์ถ”๊ฐ€ HTTP ํ—ค๋”๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ํ—ค๋”์—๋Š” ์—…์ŠคํŠธ๋ฆผ ํ˜ธ์ŠคํŠธ๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์†Œ์š”๋œ ์‹œ๊ฐ„์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋„คํŠธ์›Œํฌ ๋Œ€๊ธฐ ์‹œ๊ฐ„๊ณผ ๋น„๊ตํ•˜์—ฌ ์„œ๋น„์Šค ์‹œ๊ฐ„์„ ํ™•์ธํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

x-envoy-upstream-service-time: 0
server: envoy

์ตœ์ข… ๊ตฌ์„ฑ

static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: { address: 0.0.0.0, port_value: 8080 }
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        config:
          codec_type: auto
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: backend
              domains:
                - "one.example.com"
                - "www.one.example.com"
              routes:
              - match:
                  prefix: "/"
                route:
                  cluster: targetCluster
          http_filters:
          - name: envoy.router
          clusters:
  - name: targetCluster
    connect_timeout: 0.25s
    type: STRICT_DNS
    dns_lookup_family: V4_ONLY
    lb_policy: ROUND_ROBIN
    hosts: [
      { socket_address: { address: 172.18.0.3, port_value: 80 }},
      { socket_address: { address: 172.18.0.4, port_value: 80 }}
    ]

admin:
  access_log_path: /tmp/admin_access.log
  address:
    socket_address: { address: 0.0.0.0, port_value: 9090 }

๋ฒˆ์—ญ๊ฐ€์˜ ์ถ”๊ฐ€ ์ •๋ณด

Envoy Proxy ์„ค์น˜ ์ง€์นจ์€ ์›น์‚ฌ์ดํŠธ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. https://www.getenvoy.io/

๊ธฐ๋ณธ์ ์œผ๋กœ rpm์—๋Š” ์‹œ์Šคํ…œ ์„œ๋น„์Šค ๊ตฌ์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.

์‹œ์Šคํ…œ ์„œ๋น„์Šค ๊ตฌ์„ฑ /etc/systemd/system/envoy.service๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

[Unit]
Description=Envoy Proxy
Documentation=https://www.envoyproxy.io/
After=network-online.target
Requires=envoy-auth-server.service
Wants=nginx.service

[Service]
User=root
Restart=on-failure
ExecStart=/usr/bin/envoy --config-path /etc/envoy/config.yaml
[Install]
WantedBy=multi-user.target

/etc/envoy/ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ฑฐ๊ธฐ์— config.yaml ๊ตฌ์„ฑ์„ ๋„ฃ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํŠน์‚ฌ ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ…”๋ ˆ๊ทธ๋žจ ์ฑ„ํŒ…์ด ์žˆ์Šต๋‹ˆ๋‹ค: https://t.me/envoyproxy_ru

Envoy ํ”„๋ก์‹œ๋Š” ์ •์  ์ฝ˜ํ…์ธ  ์ œ๊ณต์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๊ธฐ๋Šฅ์— ํˆฌํ‘œํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://github.com/envoyproxy/envoy/issues/378

๋“ฑ๋ก๋œ ์‚ฌ์šฉ์ž๋งŒ ์„ค๋ฌธ ์กฐ์‚ฌ์— ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋กœ๊ทธ์ธ์ œ๋ฐœ

์ด ๊ฒŒ์‹œ๋ฌผ์ด ํŠน์‚ฌ ํ”„๋ก์‹œ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๋„๋ก ๊ถŒ์žฅํ–ˆ์Šต๋‹ˆ๊นŒ?

  • ์˜ˆ

  • ์•„๋‹ˆ

75๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ํˆฌํ‘œํ–ˆ์Šต๋‹ˆ๋‹ค. 18๋ช…์˜ ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ๊ถŒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€