본문으로 건너뛰기

EnvoyFilter

Terminology

  • Host: 네트워크 통신이 가능한 Entity로 Envoy 문서에서는 하나의 논리적 네트워크 애플리케이션을 의미합니다.
  • Downstream: Envoy에 요청을 보내고 응답을 받는 host입니다.
  • Upstream: Envoy로부터 요청을 받고 응답을 보내는 host입니다.
  • Listener: downstream에 연결될 수 있는 네임드 네트워크 위치입니다. e.g., port, unix domain socket
  • Cluster: Envoy에 연결되는 논리적으로 유사한 upstream host 그룹입니다.
  • Mesh: 일관된 네트워크 topology를 제공하기 위해 조정되는 호스트 그룹으로 Envoy 문서에서는 Envoy proxy 그룹입니다.
  • Runtime configuration: 실시간으로 변경가능한 설정입니다.

EnvoyFilter

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: <name>
namespace: <namespace>
spec:
workloadSelector:
labels:
<key>: <value>
configPatches:
[]
# - applyTo:
# match:
# patch:
# 패치가 적용되는 우선순위는 namespace 기준으로 루트 네임스페이스 -> 개별 네임스페이스
# 순으로 적용됩니다.
# 같은 namespace에 여러 EnvoyFilter가 존재하는 경우, 우선순위는 priority 기준으로
# 오름차순으로 적용됩니다.
# 같은 EnvoyFilter에 여러 패치가 존재하는 경우, 우선순위는 패치의 순서로 적용됩니다.
priority: 0 # default
  • workloadSelector
    • 설정하면 동일한 namespace 내에서 선택된 Workload의 Envoy에 필터가 적용됩니다
    • 설정하지 않으면 동일한 namespace 내의 모든 Workload의 Envoy에 필터가 적용됩니다
    • namespace가 MeshConfig의 rootNamespace(default: istio-system)와 같은 경우 namespace에 관계없이 적용됩니다
  • configPatches
    • applyTo
      • LISTENER
      • FILTER_CHAIN
      • NETWORK_FILTER
      • HTTP_FILTER
      • ROUTE_CONFIGURATION
      • VIRTUAL_HOST
      • HTTP_ROUTE
      • CLUSTER
      • EXTENSION_CONFIG
      • BOOTSTRAP
      • LISTENER_FILTER
    • match
      • context
        • ANY
        • SIDECAR_INBOUND
        • SIDECAR_OUTBOUND
        • GATEWAY
    • patch
      • operation
        • MERGE
        • ADD
        • REMOVE
        • INSERT_BEFORE
        • INSERT_AFTER
        • INSERT_FIRST
        • REPLACE

Debug

https://jimmysong.io/en/blog/sidecar-injection-iptables-and-traffic-routing/

그림에서 15006 포트로 들어가는 트래픽이 SIDECAR_INBOUND 트래픽이고, 15001 포트로 나가는 트래픽이 SIDECAR_OUTBOUND 트래픽입니다.

따라서 EnvoyFilter 적용이 잘 되었는지 확인하기 위해 아래 명령어를 사용하여 설정된 내용을 확인하면 됩니다.

istioctl proxy-status listener -n <namespace> <pod> --port 15006 -o yaml | yq '.[0]'
name: virtualInbound
listenerFilters: []
filterChains:
- name:
filterChainMatch:
filters:
- name:
typedConfig:
"@type":
istioctl proxy-status listener -n <namespace> <pod> --port 15001 -o yaml | yq '.[0]'