์‚ฌ์ ˆ. 1. ์†Œ๊ฐœ

์ธ์‚ฌ๋ง! ์ด๊ฒƒ์€ "ํŠน์‚ฌ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?", "์™œ ํ•„์š”ํ•œ๊ฐ€์š”?"๋ผ๋Š” ์งˆ๋ฌธ์— ๋‹ตํ•˜๋Š” ์งง์€ ๊ธฐ์‚ฌ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  "์–ด๋””๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผ ํ• ๊นŒ์š”?"

์ด๊ฒŒ ๋ญ์ง€?

Envoy๋Š” ๊ณ ์„ฑ๋Šฅ๊ณผ ๊ฐ€์šฉ์„ฑ์— ์ดˆ์ ์„ ๋งž์ถ˜ C++๋กœ ์ž‘์„ฑ๋œ L4-L7 ๋ฐธ๋Ÿฐ์„œ์ž…๋‹ˆ๋‹ค. ํ•œํŽธ์œผ๋กœ ์ด๊ฒƒ์€ ์–ด๋–ค ๋ฉด์—์„œ nginx ๋ฐ haproxy์™€ ์œ ์‚ฌํ•˜๋ฉฐ ์„ฑ๋Šฅ๋ฉด์—์„œ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜์— ๋” ์ค‘์ ์„ ๋‘๊ณ  ์žˆ์œผ๋ฉฐ zuul ๋˜๋Š” traefik๊ณผ ๊ฐ™์€ Java ๋ฐ Go ๋ฐธ๋Ÿฐ์„œ๋ณด๋‹ค ๋‚˜์˜์ง€ ์•Š์€ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ”๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

haproxy/nginx/envoy์˜ ๋น„๊ตํ‘œ๋Š” ์ ˆ๋Œ€์ ์ธ ์ง„์‹ค์ด๋ผ๊ณ  ์ฃผ์žฅํ•˜์ง€ ์•Š์ง€๋งŒ ์ผ๋ฐ˜์ ์ธ ๊ทธ๋ฆผ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Nginx์—
ํž™ํ•ฉ
์‚ฌ์ ˆ
Traefik

github์˜ ๋ณ„
11.2k/๋ฏธ๋Ÿฌ
1.1k/๋ฏธ๋Ÿฌ
12.4k
27.6k

์“ฐ์—ฌ์ง„
C
C
C + +
go

API
์•„๋‹ˆ
์†Œ์ผ“ ์ „์šฉ/ํ‘ธ์‹œ
๋ฐ์ดํ„ฐํ”Œ๋ ˆ์ธ/ํ’€
๋‹น๊ฒจ

ํ™œ์„ฑ ์ƒํƒœ ํ™•์ธ
์•„๋‹ˆ
์˜ˆ
์˜ˆ
์˜ˆ

์˜คํ”ˆ ํŠธ๋ ˆ์ด์‹ฑ
์™ธ๋ถ€ ํ”Œ๋Ÿฌ๊ทธ์ธ
์•„๋‹ˆ
์˜ˆ
์˜ˆ

JWT
์™ธ๋ถ€ ํ”Œ๋Ÿฌ๊ทธ์ธ
์•„๋‹ˆ
์˜ˆ
์•„๋‹ˆ

์‹ ์žฅ
๋ฃจ์•„/C
๋ฃจ์•„/C
๋ฃจ์•„/C++
์•„๋‹ˆ

๋ฌด์—‡์„ ์œ„ํ•ด

์ด ํ”„๋กœ์ ํŠธ๋Š” ์ดˆ๊ธฐ ๋‹จ๊ณ„์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ˆ„๋ฝ๋œ ๋ถ€๋ถ„์ด ๋งŽ์œผ๋ฉฐ ์ผ๋ถ€๋Š” ์ดˆ๊ธฐ ์•ŒํŒŒ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‚ฌ์ ˆ์—ญ์‹œ ์ Š๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฅด๊ฒŒ ๋ฐœ์ „ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ด๋ฏธ ๋™์  ๊ตฌ์„ฑ, ๊ธฐ์„ฑ ํ•„ํ„ฐ, ์ž์‹ ๋งŒ์˜ ํ•„ํ„ฐ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ์ธํ„ฐํŽ˜์ด์Šค ๋“ฑ ๋งŽ์€ ํฅ๋ฏธ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ”๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ ์šฉ ๋ถ„์•ผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ง€๋งŒ ๋จผ์ € 2๊ฐ€์ง€ ์•ˆํ‹ฐํŒจํ„ด์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ •์  ๋ฐ˜๋™.

์‚ฌ์‹ค์€ ํ˜„์žฌ ์ด ์ˆœ๊ฐ„์—๋„ ์‚ฌ์ ˆ ์บ์‹ฑ ์ง€์›์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ตฌ๊ธ€ ์‚ฌ๋žŒ๋“ค์ด ์ด๊ฒƒ์„ ์‹œ๋„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค ๊ณ ์น˜๊ธฐ. ์ด ์•„์ด๋””์–ด๋Š” ๋‚ด๋…„์— ํ•œ ๋ฒˆ ๊ตฌํ˜„๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ์‚ฌ์ ˆ RFC ์ค€์ˆ˜์˜ ๋ชจ๋“  ๋ฏธ๋ฌ˜ํ•จ(๋™๋ฌผ์› ํ—ค๋”)๊ณผ ํŠน์ • ๊ตฌํ˜„์„ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ ์•ŒํŒŒ๋„ ์•„๋‹ˆ๊ณ  ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค. PR open (PR ๊ธฐ์‚ฌ๋ฅผ ์“ฐ๋Š” ๋™์•ˆ PR์ด ๋ฉˆ์ท„์ง€๋งŒ ์ด ์ ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค).

์ง€๊ธˆ์€ ์ •์ ์šฉ์œผ๋กœ nginx๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

  • ์ •์  ๊ตฌ์„ฑ.

์‚ฌ์šฉํ•˜์…”๋„ ๋˜์ง€๋งŒ ์‚ฌ์ ˆ ๊ทธ๋Ÿฐ ๋ชฉ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ •์  ๊ตฌ์„ฑ์˜ ๊ธฐ๋Šฅ์€ ๋…ธ์ถœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์ˆœ๊ฐ„์ด ์žˆ์Šต๋‹ˆ๋‹ค:

yaml์—์„œ ๊ตฌ์„ฑ์„ ํŽธ์ง‘ํ•  ๋•Œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์žฅํ™ฉํ•˜๋‹ค๊ณ  ๊พธ์ง–๊ณ  nginx/haproxy ๊ตฌ์„ฑ์ด ๋œ ๊ตฌ์กฐ์ ์ด์ง€๋งŒ ๋” ๊ฐ„๊ฒฐํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ์š”์ ์ž…๋‹ˆ๋‹ค. Nginx์™€ Haproxy์˜ ๊ตฌ์„ฑ์€ ์ง์ ‘ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ƒ์„ฑ๋˜์—ˆ์œผ๋ฉฐ, ์‚ฌ์ ˆ ์ฝ”๋“œ์—์„œ ์ƒ์„ฑ์„ ์œ„ํ•ด. ์ „์ฒด ๊ตฌ์„ฑ์€ ๋‹ค์Œ์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœํ†  ๋ฒ„ํ”„, proto ํŒŒ์ผ์—์„œ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ˆ˜ํ•˜๊ธฐ๊ฐ€ ํ›จ์”ฌ ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

Canary, b/g ๋ฐฐํฌ ์‹œ๋‚˜๋ฆฌ์˜ค ๋“ฑ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋™์  ๊ตฌ์„ฑ์—์„œ๋งŒ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ์ •์ ์œผ๋กœ ์ด๋ฃจ์–ด์งˆ ์ˆ˜ ์—†๋‹ค๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๋ชจ๋‘๋Š” ๊ทธ๊ฒƒ์„ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋ฐธ๋Ÿฐ์„œ์—์„œ ๋ชฉ๋ฐœ์„ ์ฐฉ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์ ˆ ํฌํ•จ

Envoy๊ฐ€ ๊ผญ ํ•„์š”ํ•œ ์ž‘์—…:

  • ๋ณต์žกํ•˜๊ณ  ์—ญ๋™์ ์ธ ์‹œ์Šคํ…œ์˜ ํŠธ๋ž˜ํ”ฝ ๋ฐธ๋Ÿฐ์‹ฑ. ์—ฌ๊ธฐ์—๋Š” ์„œ๋น„์Šค ๋ฉ”์‹œ๊ฐ€ ํฌํ•จ๋˜์ง€๋งŒ ๋ฐ˜๋“œ์‹œ ์œ ์ผํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.
  • ๋ถ„์‚ฐ ์ถ”์  ๊ธฐ๋Šฅ, ๋ณต์žกํ•œ ์ธ์ฆ ๋˜๋Š” ๋‹ค์Œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํƒ€ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ํ•„์š”์„ฑ ์‚ฌ์ ˆ ์ฆ‰์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜ ํŽธ๋ฆฌํ•˜๊ฒŒ ๊ตฌํ˜„๋˜์ง€๋งŒ nginx/haproxy์—์„œ๋Š” lua ๋ฐ ๋ชจํ˜ธํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ๋‘˜๋Ÿฌ์‹ธ์—ฌ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋‘˜ ๋‹ค ๊ณ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฑฐ ์–ด๋–ป๊ฒŒ ์ž‘๋™ ์‹œ์ผœ์š”

Envoy๋Š” Docker ์ด๋ฏธ์ง€๋กœ๋งŒ ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€์—๋Š” ์ด๋ฏธ ์ •์  ๊ตฌ์„ฑ์˜ ์˜ˆ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋งŒ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

envoy.yaml ์ •์  ๊ตฌ์„ฑ

static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address:
        protocol: TCP
        address: 0.0.0.0
        port_value: 10000
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: local_service
              domains: ["*"]
              routes:
              - match:
                  prefix: "/"
                route:
                  host_rewrite: www.google.com
                  cluster: service_google
          http_filters:
          - name: envoy.router
  clusters:
  - name: service_google
    connect_timeout: 0.25s
    type: LOGICAL_DNS
    # Comment out the following line to test on v6 networks
    dns_lookup_family: V4_ONLY
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: service_google
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: www.google.com
                port_value: 443
    transport_socket:
      name: envoy.transport_sockets.tls
      typed_config:
        "@type": type.googleapis.com/envoy.api.v2.auth.UpstreamTlsContext
        sni: www.google.com

๋™์  ๊ตฌ์„ฑ

์šฐ๋ฆฌ๋Š” ์–ด๋–ค ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ๊ณ  ์žˆ๋‚˜์š”? ๋กœ๋“œ๋œ ์ƒํƒœ์—์„œ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ๊ตฌ์„ฑ์„ ๋‹ค์‹œ ๋กœ๋“œํ•  ์ˆ˜๋Š” ์—†์œผ๋ฉฐ "์ž‘์€" ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  • ๊ตฌ์„ฑ ๊ฒ€์ฆ.

๊ตฌ์„ฑ์€ ํด ์ˆ˜๋„ ์žˆ๊ณ  ๋งค์šฐ ํด ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ์— ๋ชจ๋‘ ๊ณผ๋ถ€ํ•˜ํ•˜๋ฉด ์–ด๋”˜๊ฐ€์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค.

  • ์˜ค๋ž˜ ์ง€์†๋˜๋Š” ์—ฐ๊ฒฐ.

์ƒˆ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ ์ด์ „ ๋ฆฌ์Šค๋„ˆ์—์„œ ์‹คํ–‰ ์ค‘์ธ ์—ฐ๊ฒฐ์„ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ์ด ์ž์ฃผ ๋ฐœ์ƒํ•˜๊ณ  ์—ฐ๊ฒฐ์ด ์˜ค๋ž˜ ์ง€์†๋˜๋Š” ๊ฒฝ์šฐ ํƒ€ํ˜‘์ ์„ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•ˆ๋…•ํ•˜์„ธ์š”, nginx์˜ kubernetes ์ˆ˜์‹ ์ž…๋‹ˆ๋‹ค.

  • ํ™œ์„ฑ ์ƒํƒœ ํ™•์ธ.

ํ™œ์„ฑ ์ƒํƒœ ํ™•์ธ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ํŠธ๋ž˜ํ”ฝ์„ ๋ณด๋‚ด๊ธฐ ์ „์— ์ƒˆ ๊ตฌ์„ฑ์—์„œ ์ด๋ฅผ ๋ชจ๋‘ ๋‹ค์‹œ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—…์ŠคํŠธ๋ฆผ์ด ๋งŽ์œผ๋ฉด ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ์•ˆ๋…•ํ•˜์„ธ์š” ํ•˜ํ”„๋ก์‹œ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๊นŒ? ์‚ฌ์ ˆํ’€ ๋ชจ๋ธ์— ๋”ฐ๋ผ ๊ตฌ์„ฑ์„ ๋™์ ์œผ๋กœ ๋กœ๋“œํ•จ์œผ๋กœ์จ ๋ณ„๋„์˜ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„๊ณ  ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ๋ถ€๋ถ„์„ ๋‹ค์‹œ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์‹œ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐ ๋น„์šฉ์ด ๋งŽ์ด ๋“ค๊ณ  ๊ฑฐ์˜ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ์‚ฌ์ ˆ (์œ„ ํŒŒ์ผ์—์„œ) ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—”ํ„ฐํ‹ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ฒฝ์ฒญ์ž โ€” ํŠน์ • IP/ํฌํŠธ์— ๋ฆฌ์Šค๋„ˆ๊ฐ€ ๊ฑธ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ€์ƒ ํ˜ธ์ŠคํŠธ - ๋„๋ฉ”์ธ ์ด๋ฆ„๋ณ„ ๊ฐ€์ƒ ํ˜ธ์ŠคํŠธ
  • ๊ธธ - ๊ท ํ˜• ๊ทœ์น™
  • ํด๋Ÿฌ์Šคํ„ฐ โ€” ๊ท ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ์—…์ŠคํŠธ๋ฆผ ๊ทธ๋ฃน
  • ์—”๋“œ ํฌ์ธํŠธ โ€” ์—…์ŠคํŠธ๋ฆผ ์ธ์Šคํ„ด์Šค ์ฃผ์†Œ

์ด๋Ÿฌํ•œ ๊ฐ ์—”ํ„ฐํ‹ฐ์™€ ๋‹ค๋ฅธ ์—”ํ„ฐํ‹ฐ๋Š” ๋™์ ์œผ๋กœ ์ฑ„์›Œ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๊ตฌ์„ฑ์€ ๊ตฌ์„ฑ์ด ์ˆ˜์‹ ๋  ์„œ๋น„์Šค์˜ ์ฃผ์†Œ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋น„์Šค๋Š” REST ๋˜๋Š” gRPC์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, gRPC๊ฐ€ ๋ฐ”๋žŒ์งํ•ฉ๋‹ˆ๋‹ค.

์„œ๋น„์Šค ์ด๋ฆ„์€ ๊ฐ๊ฐ LDS, VHDS, RDS, CDS ๋ฐ EDS๋กœ ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ๋™์  ๋ฆฌ์†Œ์Šค๋ฅผ ์ •์  โ€‹โ€‹๋ฆฌ์†Œ์Šค์— ์ง€์ •ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ œํ•œ ์‚ฌํ•ญ์„ ์ œ์™ธํ•˜๊ณ  ์ •์  ๊ตฌ์„ฑ๊ณผ ๋™์  ๊ตฌ์„ฑ์„ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…์—์„œ๋Š” ๋งˆ์ง€๋ง‰ ์„ธ ๊ฐ€์ง€ ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ADS(Aggregated Discovery Service)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ž๋ฐ” ์†Œ์Šค์˜ ๊ฐœ์ฒด๋งŒ ์ฑ„์šฐ๋ฉด ๋˜๋Š” gRPC ๋ฐ์ดํ„ฐํ”Œ๋ ˆ์ธ์˜ ๊ธฐ์„ฑ ๊ตฌํ˜„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ์„ฑ์€ ๋‹ค์Œ ํ˜•์‹์„ ์ทจํ•ฉ๋‹ˆ๋‹ค.

envoy.yaml ๋™์  ๊ตฌ์„ฑ

dynamic_resources:
  ads_config:
    api_type: GRPC
    grpc_services:
      envoy_grpc:
        cluster_name: xds_clr
  cds_config:
    ads: {}
static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address:
        protocol: TCP
        address: 0.0.0.0
        port_value: 10000
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
          stat_prefix: ingress_http
          rds:
            route_config_name: local_route
            config_source:
              ads: {}
          http_filters:
          - name: envoy.router
  clusters:
  - name: xds_clr
    connect_timeout: 0.25s
    type: LOGICAL_DNS
    dns_lookup_family: V4_ONLY
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: xds_clr
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: xds
                port_value: 6565

์‹œ์ž‘ํ•  ๋•Œ ์‚ฌ์ ˆ ์ด ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ œ์–ด ํ‰๋ฉด์— ์—ฐ๊ฒฐํ•˜๊ณ  RDS, CDS ๋ฐ EDS ๊ตฌ์„ฑ์„ ์š”์ฒญํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์ƒํ˜ธ ์ž‘์šฉ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ฐœ์ƒํ•˜๋Š”์ง€ ์„ค๋ช…๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—.

์ฆ‰, ์‚ฌ์ ˆ ์š”์ฒญ๋˜๋Š” ๋ฆฌ์†Œ์Šค ์œ ํ˜•, ๋…ธ๋“œ์˜ ๋ฒ„์ „ ๋ฐ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ๋ฆฌ์†Œ์Šค์™€ ๋ฒ„์ „์„ ์ˆ˜์‹ ํ•˜๋ฉฐ, ์ œ์–ด ํ‰๋ฉด์˜ ๋ฒ„์ „์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์‘๋‹ตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
4๊ฐ€์ง€ ์ƒํ˜ธ์ž‘์šฉ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค:

  • ๋ชจ๋“  ์œ ํ˜•์˜ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ํ•˜๋‚˜์˜ gRPC ์ŠคํŠธ๋ฆผ, ๋ฆฌ์†Œ์Šค์˜ ์ „์ฒด ์ƒํƒœ๊ฐ€ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.
  • ๋ณ„๋„์˜ ์ŠคํŠธ๋ฆผ, ์™„์ „ํ•œ ์ƒํƒœ.
  • ํ•˜๋‚˜์˜ ์ŠคํŠธ๋ฆผ, ์ฆ๋ถ„ ์ƒํƒœ.
  • ๋ณ„๋„์˜ ์ŠคํŠธ๋ฆผ, ์ฆ๋ถ„ ์ƒํƒœ.

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

์šฐ๋ฆฌ์˜ ์˜ˆ์—์„œ๋Š” RDS, CDS, EDS ๋ฐ ๋น„์ฆ๋ถ„ ๋ชจ๋“œ์— ๋Œ€ํ•œ ํ•˜๋‚˜์˜ ์ŠคํŠธ๋ฆผ์ธ ADS๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ฆ๋ถ„ ๋ชจ๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. api_type: DELTA_GRPC

์š”์ฒญ์— ๋…ธ๋“œ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋‹ค์–‘ํ•œ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•ด ๋‹ค์–‘ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ์–ด ํ”Œ๋ ˆ์ธ์œผ๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์ ˆ, ์ด๋Š” ์„œ๋น„์Šค ๋ฉ”์‹œ ๊ตฌ์ถ•์— ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์›Œ๋ฐ์—…

์— ์‚ฌ์ ˆ ์‹œ์ž‘ ์‹œ ๋˜๋Š” ์ œ์–ด ์˜์—ญ์—์„œ ์ƒˆ ๊ตฌ์„ฑ์„ ์ˆ˜์‹ ํ•  ๋•Œ ๋ฆฌ์†Œ์Šค ์ค€๋น„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ๋ฆฌ์Šค๋„ˆ ์›Œ๋ฐ์—…๊ณผ ํด๋Ÿฌ์Šคํ„ฐ ์›Œ๋ฐ์—…์œผ๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” RDS/LDS์— ๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ ์‹œ์ž‘๋˜๊ณ , ๋‘ ๋ฒˆ์งธ๋Š” CDS/EDS๊ฐ€ ์žˆ์„ ๋•Œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์—…์ŠคํŠธ๋ฆผ๋งŒ ๋ณ€๊ฒฝ๋˜๋ฉด ๋ฆฌ์Šค๋„ˆ๊ฐ€ ๋‹ค์‹œ ์ƒ์„ฑ๋˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์›Œ๋ฐ์—… ํ”„๋กœ์„ธ์Šค ์ค‘์— ์ œํ•œ ์‹œ๊ฐ„ ๋™์•ˆ ์ œ์–ด ์˜์—ญ์—์„œ ์ข…์† ๋ฆฌ์†Œ์Šค๊ฐ€ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ดˆ๊ธฐํ™”๊ฐ€ ์‹คํŒจํ•˜๊ณ  ์ƒˆ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ํฌํŠธ์—์„œ ์ˆ˜์‹  ๋Œ€๊ธฐ๋ฅผ ์‹œ์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์ดˆ๊ธฐํ™” ์ˆœ์„œ: EDS, CDS, ํ™œ์„ฑ ์ƒํƒœ ํ™•์ธ, RDS, LDS. ํ™œ์„ฑ ์ƒํƒœ ํ™•์ธ์ด ํ™œ์„ฑํ™”๋˜๋ฉด ์ƒํƒœ ํ™•์ธ์ด ํ•œ ๋ฒˆ ์„ฑ๊ณตํ•œ ํ›„์—๋งŒ ํŠธ๋ž˜ํ”ฝ์ด ์—…์ŠคํŠธ๋ฆผ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

๋ฆฌ์Šค๋„ˆ๊ฐ€ ๋‹ค์‹œ ์ƒ์„ฑ๋œ ๊ฒฝ์šฐ ์ด์ „ ๋ฆฌ์Šค๋„ˆ๋Š” DRAIN ์ƒํƒœ๊ฐ€ ๋˜๊ณ  ๋ชจ๋“  ์—ฐ๊ฒฐ์ด ๋‹ซํžˆ๊ฑฐ๋‚˜ ์ œํ•œ ์‹œ๊ฐ„์ด ๋งŒ๋ฃŒ๋œ ํ›„ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. --drain-time-s, ๊ธฐ๋ณธ๊ฐ’์€ 10๋ถ„์ž…๋‹ˆ๋‹ค.

๊ณ„์† ๋ ๊ฑฐ์•ผ.

์ถœ์ฒ˜ : habr.com

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