EgressNetwork
Linkerd의 이그레스(egress) 기능은 클러스터 밖으로 나가는 트래픽을 모니터링하고 제어할 수 있게 해 줘요. 이 동작은 EgressNetwork 리소스를 만들어서 제어하는데, 이 리소스는 클러스터를 떠나는 트래픽의 특성을 설명하고 Gateway API 프리미티브를 이용해 그 트래픽에 정책을 적용할 방법을 제공해요.
본문
Linkerd의 이그레스 기능은 클러스터를 떠나는 트래픽을 모니터링하고 제어할 수 있게 해 줘요. 이 동작은 EgressNetwork 리소스를 만들어서 제어하는데, 이들은 클러스터를 떠나는 트래픽의 특성을 설명하고 Gateway API 프리미티브를 사용해 정책을 적용하는 방법을 제공해요.
경고
어떤 서비스 메시도 그 자체만으로 이그레스 트래픽에 대해 강력한 보안 보장을 제공할 수 없어요. 예를 들어 악의적인 행위자가 Linkerd 사이드카(따라서 Linkerd의 이그레스 제어)를 완전히 우회할 수 있어요. 임의의 애플리케이션이 존재하는 상황에서 이그레스 트래픽을 완전히 제한하려면 일반적으로 더 포괄적인 접근이 필요해요.
EgressNetwork 의미론
EgressNetwork는 본질적으로 클러스터 외부에 있는 일련의 트래픽 대상에 대한 설명이에요. 그런 의미에서 Service와 비교할 수 있는데, 주요 차이는 Service가 단일 논리적 대상을 포함하는 반면 EgressNetwork는 대상의 집합을 포함할 수 있다는 점이에요. 이 집합의 크기는 단일 IP 주소부터 클러스터 경계 밖의 전체 네트워크 공간까지 다양할 수 있어요.
EgressNetwork 리소스는 기본적으로 몇 가지 네임스페이스 의미론을 가지는데, 짚고 넘어갈 가치가 있어요. EgressNetwork는 네임스페이스 리소스라서, 자신이 위치한 네임스페이스 안의 클라이언트에만 영향을 줘요. 유일한 예외는 전역 이그레스 네임스페이스에 생성된 EgressNetwork로, 이들은 모든 네임스페이스의 클라이언트에 영향을 줘요. 네임스페이스 로컬 리소스가 우선권을 가져요. 기본적으로 전역 이그레스 네임스페이스는 linkerd-egress로 설정되지만, egress.globalEgressNetworkNamespace Helm 값으로 구성할 수 있어요.
EgressNetwork 스펙
EgressNetwork 스펙은 다음 최상위 필드를 포함할 수 있어요.
| field | value |
|---|---|
| field | value |
| networks | 이 EgressNetwork가 포괄하는 주소 공간을 설명하는 네트워크 스펙 집합 |
| trafficPolicy | 이 리소스의 기본 트래픽 정책 |
networks
이 필드는 이 네트워크가 포괄하는 외부 네트워크 집합을 구체적으로 설명하는 데 사용돼요. 이 대상으로 가는 모든 트래픽은 이 EgressNetwork로 흐르는 것으로 간주되어 그 트래픽 정책의 적용을 받아요. EgressNetwork가 networks를 지정하지 않으면, Linkerd 설치 시 제공된 clusterNetworks 값이 지정하는 인클러스터 네트워크를 제외한 전체 IP 주소 공간을 포괄해요.
| field | value |
|---|---|
| field | value |
| cidr | CIDR 표기법의 서브넷 |
| except | 제외할 CIDR 표기법의 서브넷 목록 |
trafficPolicy
이 필드는 필수이며 Allow 또는 Deny여야 해요. trafficPolicy가 Allow이면 이 EgressNetwork를 통과하는 모든 트래픽은 그것을 설명하는 명시적 Gateway API Route가 없어도 통과돼요. trafficPolicy가 Deny이면 Route로 명시적으로 매칭되지 않는 이 EgressNetwork를 통과하는 트래픽은 거부돼요.
예시
아래는 httpbin.org의 443 포트로 가는 HTTPS 트래픽을 제외한 모든 외부 트래픽을 차단하는 EgressNetwork 리소스 예시예요. HTTPS 트래픽은 명시적 TLSRoute로 처리돼요.
`apiVersion: policy.linkerd.io/v1alpha1
kind: EgressNetwork
metadata:
namespace: linkerd-egress
name: all-egress-traffic
spec:
trafficPolicy: Deny
---
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: TLSRoute
metadata:
name: tls-egress
namespace: linkerd-egress
spec:
hostnames:
- httpbin.org
parentRefs:
- name: all-egress-traffic
kind: EgressNetwork
group: policy.linkerd.io
namespace: linkerd-egress
port: 443
rules:
- backendRefs:
- kind: EgressNetwork
group: policy.linkerd.io
name: all-egress-traffic
`