Kubernetes/Network Study

istio 이해하기 - Envoy proxy

백곰곰 2024. 10. 19. 22:26
728x90
반응형

가시다님의 Kubernetes Advanced Networking Study에 참여하게 되어, 스터디 때 다룬 주제를 정리하려고 합니다.
7주차는 Istio를 주제로 진행되었습니다.

이번 글에서는 Istio의 Data Plane인 proxy에 대해 다루고 있습니다.

    istio 아키텍처

    https://istio.io/latest/docs/ops/deployment/architecture/

    proxy : data plane, Envoy proxy 기반으로 구성(L4/7 proxy) 되며, 마이크로서비스 간의 모든 네트워크 통신을 라우팅하고 제어함

    istiod : control plane

     Pilot - data plane과 통신하며 라우팅 규칙 동기화, 서비스 디스커버리와 로드 밸런싱 설정을 제공

     Citadel - 인증서 관리, mTLS 통신 담당

     Galley - Service의 endpoint 정보 업데이트

    Envoy 설치 및 실습

    실습 전 Envoy의 주요 용어를 알아보겠습니다.

    참고) https://www.envoyproxy.io/docs/envoy/latest/intro/life_of_a_request#terminology

    Cluster: Envoy가 요청을 전달하는 여러 엔드포인트(IP)로 구성된 논리적 서비스

     Endpoint: 실제 접근이 가능한 IP 주소, 네트워크 노드이며, 엔드포인트들은 클러스터로 그룹화됨

     Listener: 특정 IP/포트에 바인딩하여 새로운 TCP 연결(또는 UDP)을 받아들이고, 요청 처리를 위한 다운스트림 관련 작업을 조정하는 Envoy 모듈

    Downstream: Envoy에 연결 요청을 전송. 사이드카 모델에서는 로컬 애플리케이션이 될 수 있으며, 비(非) 사이드카 모델에서는 네트워크 노드나 원격 클라이언트가 될 수 있음

     Upstream: Envoy로부터 서비스 요청을 수신. 사이드카 모델에서는 로컬 애플리케이션이 될 수 있으며, 비(非) 사이드카 모델에서는 원격 백엔드를 의미합니다.

    Filter: Listener 로부터 서비스에 트래픽을 전달하기까지의 요청 처리 파이프라인

    Filter chain: 여러 필터들의 연속적인 집합을 의미

     

    이제 Envoy에 조금 더 친숙해지기 위해 EC2에 Envoy 설치 후 여러 실습을 해보겠습니다.

    해당 실습은 아래 페이지를 기반으로 진행됩니다.

    참고) https://www.envoyproxy.io/docs/envoy/latest/start/quick-start/

     

    Envoy 설치

    wget -O- https://apt.envoyproxy.io/signing.key | sudo gpg --dearmor -o /etc/apt/keyrings/envoy-keyring.gpg
    echo "deb [signed-by=/etc/apt/keyrings/envoy-keyring.gpg] https://apt.envoyproxy.io jammy main" | sudo tee /etc/apt/sources.list.d/envoy.list
    sudo apt-get update && sudo apt-get install envoy -y
    
    root@testpc:~# envoy --version
    
    envoy  version: e3b4a6e9570da15ac1caffdded17a8bebdc7dfc9/1.32.0/Clean/RELEASE/BoringSSL

     

    [실습 1]

    데모 config에는 10000 포트에서 HTTP 요청을 수신하고, www.envoyproxy.io로 proxy하는 설정이 포함되어 있습니다. 

    또한, Envoy는 기본적으로 IPv4, IPv6를 모두 사용하기 때문에, IPv6를 지원하지 않는 환경이라면 설정을 disable 해야 합니다.

    아래 설정에 IPv4만 사용하도록 설정되어 있습니다.

      clusters:
      - name: service_envoyproxy_io
        type: LOGICAL_DNS
        # Comment out the following line to test on v6 networks
        dns_lookup_family: V4_ONLY

    이를 배포하고 정상 동작하는지 확인해보겠습니다.

    curl -O https://www.envoyproxy.io/docs/envoy/latest/_downloads/92dcb9714fb6bc288d042029b34c0de4/envoy-demo.yaml
    envoy -c envoy-demo.yaml

    적용 후에 아래와 같이 10000번 포트에 대해 리슨하고 있는 것을 볼 수 있습니다.

    root@testpc:~# ss -tnlp
    State   Recv-Q  Send-Q   Local Address:Port    Peer Address:Port  Process
    LISTEN  0       4096           0.0.0.0:10000        0.0.0.0:*      users:(("envoy",pid=3509,fd=25))
    LISTEN  0       4096           0.0.0.0:10000        0.0.0.0:*      users:(("envoy",pid=3509,fd=24))
    LISTEN  0       4096     127.0.0.53%lo:53           0.0.0.0:*      users:(("systemd-resolve",pid=347,fd=14))
    LISTEN  0       128            0.0.0.0:22           0.0.0.0:*      users:(("sshd",pid=700,fd=3))
    LISTEN  0       511                  *:80                 *:*      users:(("apache2",pid=2394,fd=4),("apache2",pid=2393,fd=4),("apache2",pid=2391,fd=4))
    LISTEN  0       128               [::]:22              [::]:*      users:(("sshd",pid=700,fd=4))

    curl -v localhost:10000 실행 시 www.envoyproxy.io 로 요청이 전달됩니다.

    또한, EC2의 ip:10000로 접속해도 www.envoyproxy.io  페이지로 접근하는 것을 볼 수 있습니다.

    [실습 2]

    이제 아래의 envoy 설정을 override 해보겠습니다.

    해당 설정은 Envoy의 관리 페이지를 9902 포트로 접근할 수 있게 설정합니다.

    cat <<EOT > envoy-override.yaml
    admin:
      address:
        socket_address:
          address: 0.0.0.0
          port_value: 9902
    EOT
    
    envoy -c envoy-demo.yaml --config-yaml "$(cat envoy-override.yaml)"

    설정 후 EC2의 ip:9902로 접속하면 아래와 같은 페이지를 볼 수 있습니다.

    [실습 3]

    이번에는 Envoy를 validate 모드로 실행해 보겠습니다.

    이는 실제 서비스를 시작/재시작하지 않고 Envoy 설정 파일에 대해 검증하는 모드입니다.

    설정 파일이 유효한지 확인할 수 있습니다.

    root@testpc:~# envoy --mode validate -c envoy-demo.yaml
    [2024-10-19 21:12:21.110][3701][info][main] [source/server/server.cc:879] runtime: {}
    [2024-10-19 21:12:21.110][3701][info][config] [source/server/configuration_impl.cc:168] loading tracing configuration
    [2024-10-19 21:12:21.110][3701][info][config] [source/server/configuration_impl.cc:124] loading 0 static secret(s)
    [2024-10-19 21:12:21.110][3701][info][config] [source/server/configuration_impl.cc:130] loading 1 cluster(s)
    [2024-10-19 21:12:21.113][3701][info][config] [source/server/configuration_impl.cc:138] loading 1 listener(s)
    [2024-10-19 21:12:21.115][3701][warning][misc] [source/extensions/filters/network/http_connection_manager/config.cc:88] internal_address_config is not configured. The existing default behaviour will trust RFC1918 IP addresses, but this will be changed in next release. Please explictily config internal address config as the migration step or config the envoy.reloadable_features.explicit_internal_address_config to true to untrust all ips by default
    [2024-10-19 21:12:21.123][3701][info][config] [source/server/configuration_impl.cc:154] loading stats configuration
    configuration 'envoy-demo.yaml' OK

    기존 envoy-demo.yaml 파일을 복사한 후에 syntax 오류를 인위적으로 넣고 실행하면 아래와 같은 error 메세지를 볼 수 있습니다.

    root@testpc:~# envoy --mode validate -c envoy-demo-error.yaml
    [2024-10-19 21:13:09.493][3742][critical][main] [source/server/config_validation/server.cc:71] error initializing configuration 'envoy-demo-error.yaml': Protobuf message (type envoy.config.bootstrap.v3.Bootstrap reason INVALID_ARGUMENT: invalid JSON  in envoy.config.bootstrap.v3.Bootstrap, near 1:20 (offset 19): no such field: 'tatic_resources') has unknown fields

    [실습 4]

    Envoy system log는 기본적으로 /dev/stderr에 보내지는데, 로그 path를 변경해 보겠습니다.

    mkdir logs
    envoy -c envoy-demo.yaml --log-path logs/custom.log

    envoy를 실행하면 logs/custom.log에 로그가 발생하는 것을 볼 수 있습니다.

    root@testpc:~/logs# ls
    custom.log
    root@testpc:~/logs# tail -f custom.log
    [2024-10-19 21:17:26.420][3754][info][config] [source/server/configuration_impl.cc:130] loading 1 cluster(s)
    [2024-10-19 21:17:26.422][3754][info][config] [source/server/configuration_impl.cc:138] loading 1 listener(s)
    [2024-10-19 21:17:26.425][3754][warning][misc] [source/extensions/filters/network/http_connection_manager/config.cc:88] internal_address_config is not configured. The existing default behaviour will trust RFC1918 IP addresses, but this will be changed in next release. Please explictily config internal address config as the migration step or config the envoy.reloadable_features.explicit_internal_address_config to true to untrust all ips by default
    [2024-10-19 21:17:26.426][3754][info][config] [source/server/configuration_impl.cc:154] loading stats configuration

    또한, access log는 /dev/stdout으로 전송하여, 로그를 분리하는 것도 가능합니다.

     

    [실습 5]

    Envoy에 대한 로그 레벨은 기본적으로 info이며, 개별적으로 레벨 변경이 가능합니다. (참고)

    envoy -c envoy-demo.yaml -l off --component-log-level upstream:debug,connection:trace

     

    Envoy 설정 파일 이해하기

    이제 Envoy 설정 파일을 조금 더 자세히 살펴보겠습니다.

    참고) https://www.envoyproxy.io/docs/envoy/latest/start/quick-start/configuration-static

    static_resources:  ## Envoy가 시작될 때 정적으로 설정되는 것
    
      listeners: 
      - name: listener_0
        address:
          socket_address:
            address: 0.0.0.0
            port_value: 10000
        filter_chains:
        - filters:
          - name: envoy.filters.network.http_connection_manager
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
              stat_prefix: ingress_http
              access_log:
              - name: envoy.access_loggers.stdout
                typed_config:
                  "@type": type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLog
              http_filters:
              - name: envoy.filters.http.router
                typed_config:
                  "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
              route_config:     ## path가 일치하는 경우 service_envoyproxy_io로 라우트
                name: local_route
                virtual_hosts:
                - name: local_service
                  domains: ["*"]
                  routes:
                  - match:
                      prefix: "/"
                    route:
                      host_rewrite_literal: www.envoyproxy.io
                      cluster: service_envoyproxy_io
    
      clusters:
      - name: service_envoyproxy_io
        type: LOGICAL_DNS
        # Comment out the following line to test on v6 networks
        dns_lookup_family: V4_ONLY
        load_assignment:
          cluster_name: service_envoyproxy_io
          endpoints:
          - lb_endpoints: ## 실제 연결할 대상 정의
            - endpoint:
                address:
                  socket_address:
                    address: www.envoyproxy.io
                    port_value: 443
        transport_socket:
          name: envoy.transport_sockets.tls
          typed_config:
            "@type": type.googleapis.com/envoy.extensions.transport_sockets.tls.v3.UpstreamTlsContext
            sni: www.envoyproxy.io

    위 demo 파일은 static 설정이며, istio를 사용하는 경우에는 control plane을 통해 Envoy proxy 설정 변경이 필요하므로, 아래와 같은 설정이 포함되어야 합니다.

    node:
      cluster: test-cluster
      id: test-id
    
    dynamic_resources: ## 동적으로 로드할 설정을 지정하며, 연결할 클러스터를 명시
      ads_config:
        api_type: GRPC
        grpc_services:
        - envoy_grpc:
            cluster_name: xds_cluster
      cds_config:
        ads: {}
      lds_config:
        ads: {}
    
    static_resources:
      clusters:
      - type: STRICT_DNS
        typed_extension_protocol_options:
          envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
            "@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
            explicit_http_config:
              http2_protocol_options: {}
        name: xds_cluster
        load_assignment:
          cluster_name: xds_cluster
          endpoints:
          - lb_endpoints: ## control plane에 질의할 수 있도록 구성
            - endpoint:
                address:
                  socket_address:
                    address: my-control-plane
                    port_value: 18000
    
    admin:
      address:
        socket_address:
          address: 0.0.0.0
          port_value: 19000

    이제 istio 설치 후에 해당 파일 설정을 확인해보겠습니다.

    istio 설치

    # istioctl 설치
    export ISTIOV=1.23.2
    echo "export ISTIOV=1.23.2" >> /etc/profile
    curl -s -L https://istio.io/downloadIstio | ISTIO_VERSION=$ISTIOV TARGET_ARCH=x86_64 sh -
    tree istio-$ISTIOV -L 2 # sample yaml 포함
    cp istio-$ISTIOV/bin/istioctl /usr/local/bin/istioctl
    istioctl version --remote=false
    
    istioctl profile dump demo > demo-profile.yaml
    istioctl install -f demo-profile.yaml -y

    참고로 아래와 같은 설정으로 설치합니다.

    apiVersion: install.istio.io/v1alpha1
    kind: IstioOperator
    spec:
      components:
        base:
          enabled: true
        egressGateways:
        - enabled: true
          name: istio-egressgateway
        ingressGateways:
        - enabled: true
          name: istio-ingressgateway
        pilot:
          enabled: true
      hub: docker.io/istio
      profile: demo
      tag: 1.23.2
      values:
        defaultRevision: ""
        gateways:
          istio-egressgateway: {}
          istio-ingressgateway: {}
        global:
          configValidation: true
          istioNamespace: istio-system
        profile: demo

    설치 완료 후 istio-system 네임스페이스에 여러 오브젝트가 생성된 것을 확인할 수 있습니다.

    (⎈|default:N/A) root@k3s-s:~# istioctl install -f demo-profile.yaml -y
            |\
            | \
            |  \
            |   \
          /||    \
         / ||     \
        /  ||      \
       /   ||       \
      /    ||        \
     /     ||         \
    /______||__________\
    ____________________
      \__       _____/
         \_____/
    
    ✔ Istio core installed ⛵️                                                                                                                                
    ✔ Istiod installed 🧠
    ✔ Ingress gateways installed 🛬
    ✔ Egress gateways installed 🛫
    ✔ Installation complete
    Made this installation the default for cluster-wide operations.
    
    kubectl get all,svc,ep,sa,cm,secret,pdb -n istio-system
    kubectl get crd | grep istio.io | sort

    default 네임스페이스에 side car injection을 활성화하고 파드를 생성해보겠습니다.

    kubectl label namespace default istio-injection=enabled
    kubectl run nginx --image=nginx
    (⎈|default:N/A) root@k3s-s:~# k get po
    NAME    READY   STATUS    RESTARTS   AGE
    nginx   2/2     Running   0          6s

    nginx 파드에 컨테이너가 2개가 있는 것을 볼 수 있습니다.

    이제 istio-proxy 컨테이너로 접속해보겠습니다.

    kubectl debug -it nginx -n default --image nicolaka/netshoot --target=istio-proxy

    15000번대 포트를 다수 리슨하고 있고, etc/istio/proxy/envoy-rev.json 파일에서 설정을 읽어가는 것을 볼 수 있습니다.

    참고로, nginx 파드의 sidecar 컨테이너 설정을 확인하면, emptyDir을 사용하는 것을 확인할 수 있습니다.

     nginx  ~  ss -tnlp
    
    State             Recv-Q            Send-Q                       Local Address:Port                        Peer Address:Port           Process
    LISTEN            0                 511                                0.0.0.0:80                               0.0.0.0:*
    LISTEN            0                 4096                             127.0.0.1:15000                            0.0.0.0:*
    LISTEN            0                 4096                             127.0.0.1:15004                            0.0.0.0:*
    LISTEN            0                 4096                               0.0.0.0:15021                            0.0.0.0:*
    LISTEN            0                 4096                               0.0.0.0:15021                            0.0.0.0:*
    LISTEN            0                 4096                               0.0.0.0:15006                            0.0.0.0:*
    LISTEN            0                 4096                               0.0.0.0:15006                            0.0.0.0:*
    LISTEN            0                 4096                               0.0.0.0:15001                            0.0.0.0:*
    LISTEN            0                 4096                               0.0.0.0:15001                            0.0.0.0:*
    LISTEN            0                 4096                               0.0.0.0:15090                            0.0.0.0:*
    LISTEN            0                 4096                               0.0.0.0:15090                            0.0.0.0:*
    LISTEN            0                 511                                   [::]:80                                  [::]:*
    LISTEN            0                 4096                                     *:15020                                  *:*
    
     nginx  ~  ps -ef
    PID   USER     TIME  COMMAND
        1 1337      0:00 /usr/local/bin/pilot-agent proxy sidecar --domain default.svc.cluster.local --proxyLogLevel=warning --proxyComponentLogLevel=misc:er
       14 1337      0:00 /usr/local/bin/envoy -c etc/istio/proxy/envoy-rev.json --drain-time-s 45 --drain-strategy immediate --local-address-ip-version v4 --
       28 root      0:01 zsh
      117 root      0:00 ps -ef

    해당 파일을 살펴보면, 기존 Envoy 설정에 비해 조금 복잡하지만, 유사한 내용이 json 형태로 작성된 것을 확인할 수 있습니다.

    root@k3s-w2:/var/lib/kubelet/pods/7ad60e5d-57fd-45a3-a2f6-36fae75a20f3/volumes/kubernetes.io~empty-dir/istio-envoy# cat envoy-rev.json
    {
      "application_log_config": {
        "log_format": {
            "text_format": "%Y-%m-%dT%T.%fZ\t%l\tenvoy %n %g:%#\t%v\tthread=%t"
        }
      },
      "node": {
        "id": "sidecar~172.16.2.7~nginx.default~default.svc.cluster.local",
        "cluster": "nginx.default",
        "locality": {
        },
        "metadata": {"ANNOTATIONS":{"istio.io/rev":"default","kubectl.kubernetes.io/default-container":"nginx","kubectl.kubernetes.io/default-logs-container":"nginx","kubernetes.io/config.seen":"2024-10-19T21:58:33.783537862+09:00","kubernetes.io/config.source":"api","prometheus.io/path":"/stats/prometheus","prometheus.io/port":"15020","prometheus.io/scrape":"true","sidecar.istio.io/status":"{\"initContainers\":[\"istio-init\"],\"containers\":[\"istio-proxy\"],\"volumes\":[\"workload-socket\",\"credential-socket\",\"workload-certs\",\"istio-envoy\",\"istio-data\",\"istio-podinfo\",\"istio-token\",\"istiod-ca-cert\"],\"imagePullSecrets\":null,\"revision\":\"default\"}"},"APP_CONTAINERS":"nginx","CLUSTER_ID":"Kubernetes","ENVOY_PROMETHEUS_PORT":15090,"ENVOY_STATUS_PORT":15021,"INSTANCE_IPS":"172.16.2.7","INTERCEPTION_MODE":"REDIRECT","ISTIO_PROXY_SHA":"6c72b2179f5a58988b920a55b0be8346de3f7b35","ISTIO_VERSION":"1.23.2","LABELS":{"run":"nginx","security.istio.io/tlsMode":"istio","service.istio.io/canonical-name":"nginx","service.istio.io/canonical-revision":"latest"},"MESH_ID":"cluster.local","NAME":"nginx","NAMESPACE":"default","NODE_NAME":"k3s-w2","OWNER":"kubernetes://apis/v1/namespaces/default/pods/nginx","PILOT_SAN":["istiod.istio-system.svc"],"POD_PORTS":"[\n]","PROXY_CONFIG":{"binaryPath":"/usr/local/bin/envoy","concurrency":2,"configPath":"./etc/istio/proxy","controlPlaneAuthPolicy":"MUTUAL_TLS","discoveryAddress":"istiod.istio-system.svc:15012","drainDuration":"45s","proxyAdminPort":15000,"serviceCluster":"istio-proxy","statNameLength":189,"statusPort":15020,"terminationDrainDuration":"5s"},"SERVICE_ACCOUNT":"default","WORKLOAD_NAME":"nginx"}
      },
    ... 중략 ...
      "admin": {
        "access_log": [
          {
            "name": "envoy.access_loggers.file",
            "typed_config": {
              "@type": "type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog",
              "path": "/dev/null"
            }
          }
        ],
        "profile_path": "/var/lib/istio/data/envoy.prof",
        "address": {
          "socket_address": {
            "address": "127.0.0.1",
            "port_value": 15000
          }
        }
      },
      "dynamic_resources": {
        "lds_config": {
          "ads": {},
          "initial_fetch_timeout": "0s",
          "resource_api_version": "V3"
        },
        "cds_config": {
          "ads": {},
          "initial_fetch_timeout": "0s",
          "resource_api_version": "V3"
        },
        "ads_config": {
          "api_type": "DELTA_GRPC", ## 변경된 내용만 업데이트하도록 설정
          "set_node_on_first_message_only": true,
          "transport_api_version": "V3",
          "grpc_services": [
            {
              "envoy_grpc": {
                "cluster_name": "xds-grpc"
              }
            }
          ]
        }
      },
      "static_resources": {
        "clusters": [
          {
            "name": "prometheus_stats",
            "alt_stat_name": "prometheus_stats;",
            "type": "STATIC",
            "connect_timeout": "0.250s",
            "lb_policy": "ROUND_ROBIN",
            "load_assignment": {
              "cluster_name": "prometheus_stats",
              "endpoints": [{
                "lb_endpoints": [{
                  "endpoint": {
                    "address":{
                      "socket_address": {
                        "protocol": "TCP",
                        "address": "127.0.0.1",
                        "port_value": 15000
                      }
                    }
                  }
                }]
              }]
            }
          },
          {
            "name": "agent",
            "alt_stat_name": "agent;",
            "type": "STATIC",
            "connect_timeout": "0.250s",
            "lb_policy": "ROUND_ROBIN",
            "load_assignment": {
              "cluster_name": "agent",
              "endpoints": [{
                "lb_endpoints": [{
                  "endpoint": {
                    "address":{
                      "socket_address": {
                        "protocol": "TCP",
                        "address": "127.0.0.1",
                        "port_value": 15020
                      }
                    }
                  }
                }]
              }]
            }
          },
          {
            "name": "sds-grpc",
            "alt_stat_name": "sds-grpc;",
            "type": "STATIC",
            "typed_extension_protocol_options": {
              "envoy.extensions.upstreams.http.v3.HttpProtocolOptions": {
               "@type": "type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions",
               "explicit_http_config": {
                "http2_protocol_options": {}
               }
              }
            },
            "connect_timeout": "1s",
            "lb_policy": "ROUND_ROBIN",
            "load_assignment": {
              "cluster_name": "sds-grpc",
              "endpoints": [{
                "lb_endpoints": [{
                  "endpoint": {
                    "address":{
                      "pipe": {
                        "path": "./var/run/secrets/workload-spiffe-uds/socket"
                      }
                    }
                  }
                }]
              }]
            }
          },
          {
            "name": "xds-grpc", ## Envoy 동적 구성을 관리하는데 사용
            "alt_stat_name": "xds-grpc;",
            "type" : "STATIC",
            "connect_timeout": "1s",
            "lb_policy": "ROUND_ROBIN",
            "load_assignment": {
              "cluster_name": "xds-grpc",
              "endpoints": [{
                "lb_endpoints": [{
                  "endpoint": {
                    "address":{
                      "pipe": {
                        "path": "./etc/istio/proxy/XDS"
                      }
                    }
                  }
                }]
              }]
            },
            "circuit_breakers": {
              "thresholds": [
                {
                  "priority": "DEFAULT",
                  "max_connections": 100000,
                  "max_pending_requests": 100000,
                  "max_requests": 100000
                },
                {
                  "priority": "HIGH",
                  "max_connections": 100000,
                  "max_pending_requests": 100000,
                  "max_requests": 100000
                }
              ]
            },
            "upstream_connection_options": {
              "tcp_keepalive": {
                "keepalive_time": 300
              }
            },
            "max_requests_per_connection": 1,
            "typed_extension_protocol_options": {
              "envoy.extensions.upstreams.http.v3.HttpProtocolOptions": {
               "@type": "type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions",
               "explicit_http_config": {
                "http2_protocol_options": {}
               }
              }
            }
          }
    
    
        ],
        "listeners":[
          {
            "address": {
              "socket_address": {
                "protocol": "TCP",
                "address": "0.0.0.0",
    
                "port_value": 15090
              }
            },
            "filter_chains": [
              {
                "filters": [
                  {
                    "name": "envoy.filters.network.http_connection_manager",
                    "typed_config": {
                      "@type": "type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager",
                      "codec_type": "AUTO",
                      "stat_prefix": "stats",
                      "route_config": {
                        "virtual_hosts": [
                          {
                            "name": "backend",
                            "domains": [
                              "*"
                            ],
                            "routes": [
                              {
                                "match": {
                                  "prefix": "/stats/prometheus"
                                },
                                "route": {
                                  "cluster": "prometheus_stats"
                                }
                              }
                            ]
                          }
                        ]
                      },
                      "http_filters": [
                      {
                        "name": "envoy.filters.http.router",
                        "typed_config": {
                          "@type": "type.googleapis.com/envoy.extensions.filters.http.router.v3.Router"
                        }
                      }]
                    }
                  }
                ]
              }
            ]
          },
          {
            "address": {
               "socket_address": {
                 "protocol": "TCP",
                 "address": "0.0.0.0",
                 "port_value": 15021
               }
            },
            "filter_chains": [
              {
                "filters": [
                  {
                    "name": "envoy.filters.network.http_connection_manager",
                    "typed_config": {
                      "@type": "type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager",
                      "codec_type": "AUTO",
                      "stat_prefix": "agent",
                      "route_config": {
                        "virtual_hosts": [
                          {
                            "name": "backend",
                            "domains": [
                              "*"
                            ],
                            "routes": [
                              {
                                "match": {
                                  "prefix": "/healthz/ready"
                                },
                                "route": {
                                  "cluster": "agent"
                                }
                              }
                            ]
                          }
                        ]
                      },
                      "http_filters": [{
                        "name": "envoy.filters.http.router",
                        "typed_config": {
                          "@type": "type.googleapis.com/envoy.extensions.filters.http.router.v3.Router"
                        }
                      }]
                    }
                  }
                ]
              }
            ]
          }
        ]
      }
    
    
      ,
      "cluster_manager": {
        "enable_deferred_cluster_creation": true,
      }
    
    }

     

    지금까지 Envoy에 관한 간단한 실습과 istio 설치 후 설정된 Envoy 설정 파일을 확인해 봤습니다.

    728x90