정책 마이그레이션하기
정책 마이그레이션하기 (Migrate policies)
앰비언트 모드에서는 L7 트래픽 관리를 사이드카 프록시가 아니라 웨이포인트 프록시가 처리해요. 이는 정책이 표현되고 적용되는 방식을 바꿔요:
출처: Istio 문서
본문
VirtualService의 웨이포인트 지원은 Alpha예요. 제한된 경우에 동작할 수는 있지만,HTTPRoute로의 마이그레이션을 강력히 권장해요. 같은 워크로드에VirtualService와HTTPRoute를 섞는 것은 지원되지 않으며 정의되지 않은 동작을 초래해요.DestinationRule트래픽 정책(커넥션 풀 설정, 아웃라이어 탐지, TLS)은 웨이포인트가 지원하며 변경이 필요 없어요. 다만HTTPRoute는 라우팅에 DestinationRule 서브셋이 아니라 쿠버네티스 Service를backendRefs로 사용하므로,HTTPRoute에서 버전 기반 트래픽 분할은 버전별로 별도의 Service가 필요해요.- L7 규칙(HTTP 메서드, 경로, 헤더)이나
action: CUSTOM,action: AUDIT을 사용하는AuthorizationPolicy리소스는, 워크로드selector대신targetRefs를 사용해 정책을 지원되는 리소스에 연결해야 해요. 자세한 내용은 AuthorizationPolicy 문서를 확인하세요. RequestAuthentication과WasmPlugin리소스는 웨이포인트 프록시가 필요하며, 웨이포인트를 가리키도록targetRefs를 사용해 대상으로 삼아야 해요.EnvoyFilter리소스는 웨이포인트에서 지원되지 않아요. 사이드카 프록시 동작을 구성하는EnvoyFilter리소스가 있다면, 마이그레이션 후 조용히 무시되므로 진행 전에 처리해야 해요: 필터가 커스텀 Envoy 기능을 추가한다면 WasmPlugin이 웨이포인트에서 동등한 동작을 제공할 수 있는지 평가하세요. 필터가 더 이상 필요 없다면 삭제하세요. 앰비언트 호환 대안이 없다면 이는 마이그레이션 블로커예요. 의존성이 해결될 때까지 진행하지 마세요.
기존 정책 감사하기 (Audit your existing policies)
먼저 클러스터의 모든 L7 리소스를 나열하세요:
$ kubectl get virtualservice,destinationrule -A
웨이포인트가 필요한 AuthorizationPolicy 리소스(L7 규칙 또는 CUSTOM/AUDIT 액션)를 식별하세요:
$ kubectl get authorizationpolicy -A --no-headers | while read ns name rest; do
if kubectl get authorizationpolicy "$name" -n "$ns" -o yaml | grep -qE "(methods:|paths:|headers:|action: CUSTOM|action: AUDIT)"; then
echo "$ns/$name"
fi
done
서브셋이 있는 DestinationRule 리소스를 식별하세요 (앰비언트 모드에서는 버전별 Service가 필요해요):
$ kubectl get destinationrule -A --no-headers | while read ns name rest; do
if kubectl get destinationrule "$name" -n "$ns" -o yaml | grep -q "subsets:"; then
echo "$ns/$name"
fi
done
VirtualService를 HTTPRoute로 마이그레이션하기 (Migrate VirtualService to HTTPRoute)
HTTPRoute는 앰비언트 모드를 위한 안정적이고 지원되는 L7 라우팅 API예요.
예제: 헤더 기반 라우팅 (Example: Header-based routing)
다음 VirtualService는 end-user: jason 헤더가 있는 요청을 reviews 버전 2로, 그 외 모든 요청은 서브셋을 사용해 버전 1로 라우팅해요:
apiVersion: networking.istio.io/v1
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- match:
- headers:
end-user:
exact: jason
route:
- destination:
host: reviews
subset: v2
- route:
- destination:
host: reviews
subset: v1
HTTPRoute는 DestinationRule 서브셋을 지원하지 않으므로, 먼저 버전별 Service를 만들어야 해요:
apiVersion: v1
kind: Service
metadata:
name: reviews-v1
namespace: bookinfo
spec:
selector:
app: reviews
version: v1
ports:
- port: 9080
name: http
---
apiVersion: v1
kind: Service
metadata:
name: reviews-v2
namespace: bookinfo
spec:
selector:
app: reviews
version: v2
ports:
- port: 9080
name: http
그런 다음 VirtualService를 reviews Service에 직접 연결하는(kind: Service를 parentRef로 사용) HTTPRoute로 교체하세요. 이것이 앰비언트 모드의 올바른 연결 모델이에요. 웨이포인트가 Service를 라우팅 앵커로 사용하니까요:
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: reviews
namespace: bookinfo
spec:
parentRefs:
- group: ""
kind: Service
name: reviews
port: 9080
rules:
- matches:
- headers:
- name: end-user
value: jason
backendRefs:
- name: reviews-v2
port: 9080
- backendRefs:
- name: reviews-v1
port: 9080
HTTPRoute 기능에 대한 완전한 참조는 트래픽 관리 문서를 참조하세요.
L7 규칙을 위한 AuthorizationPolicy 마이그레이션하기 (Migrate AuthorizationPolicy for L7 rules)
사이드카 모드에서 AuthorizationPolicy 리소스는 selector를 사용해 파드를 직접 대상으로 삼아요. 앰비언트 모드에서 L7 인가 정책은 웨이포인트 프록시가 적용해야 하므로, 웨이포인트의 상위 Service 또는 Gateway 자체를 대상으로 targetRefs를 사용해야 해요.
L4 정책 (변경 필요 없음)
소스 프린시펄, 네임스페이스, IP 범위만 매칭하는 L4 AuthorizationPolicy 리소스는 수정 없이 앰비언트 모드에서 동작해요. ztunnel이 적용해요.
# This L4 policy requires no changes for ambient mode
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: allow-frontend
namespace: bookinfo
spec:
selector:
matchLabels:
app: reviews
action: ALLOW
rules:
- from:
- source:
principals: ["cluster.local/ns/bookinfo/sa/productpage"]
L7 정책
HTTP 메서드, 경로, 헤더에 매칭하거나 action: CUSTOM, action: AUDIT을 사용하는 정책은 웨이포인트 프록시를 대상으로 해야 해요. selector를 웨이포인트가 보호하는 Service 또는 웨이포인트 Gateway 리소스 자체를 가리키는 targetRefs로 교체하세요:
# Before: sidecar-style (selector based)
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: allow-get-reviews
namespace: bookinfo
spec:
selector:
matchLabels:
app: reviews
action: ALLOW
rules:
- to:
- operation:
methods: ["GET"]
# After: ambient-style (targetRefs to Service)
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: allow-get-reviews
namespace: bookinfo
spec:
targetRefs:
- kind: Service
group: ""
name: reviews
action: ALLOW
rules:
- to:
- operation:
methods: ["GET"]
또는 웨이포인트 Gateway 리소스를 직접 대상으로 할 수 있어요. 이는 목적지 Service에 관계없이 웨이포인트가 처리하는 모든 트래픽에 정책을 적용해요:
# After: ambient-style (targetRefs to waypoint Gateway)
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: allow-get-reviews
namespace: bookinfo
spec:
targetRefs:
- kind: Gateway
group: gateway.networking.k8s.io
name: waypoint
action: ALLOW
rules:
- to:
- operation:
methods: ["GET"]
Service를 대상으로 하는 것이 더 정밀한 옵션이며, 정책이 단일 서비스에 적용되어야 할 때 권장돼요. Gateway를 대상으로 하는 것은 정책이 네임스페이스의 모든 서비스에 적용되어야 할 때 유용해요.
웨이포인트 우회 방지하기 (Prevent waypoint bypass)
웨이포인트를 사용할 때는 워크로드가 그것을 우회해 도달하지 못하게 해야 해요. ztunnel이 (목적지 파드에서) 적용하는 워크로드 selector DENY 정책을 사용하세요. 이 정책은 소스 프린시펄(L4 속성)만 검사하므로 ztunnel이 올바르게 적용할 수 있어요.
우회 방지 적용 시점 결정하기 (Decide when to apply bypass prevention)
점진적 마이그레이션 중에는 일부 소스 워크로드가 여전히 사이드카 모드일 수 있어요. 사이드카 모드 워크로드는 웨이포인트를 우회하고 목적지에서 ztunnel에 직접 연결하므로, ztunnel은 웨이포인트 신원이 아니라 사이드카 신원을 소스 프린시펄로 보게 돼요. 엄격한 waypoint-only DENY 정책은 그들의 트래픽을 거부할 거예요.
정책을 적용하기 전에 다음 옵션 중 하나를 선택하세요:
옵션 1: 모든 소스가 마이그레이션될 때까지 우회 방지 지연하기. 이 서비스를 호출하는 모든 워크로드가 앰비언트 모드로 전환될 때까지 DENY 정책을 적용하지 마세요. 모든 호출자를 통제할 때 더 간단한 접근 방식이에요.
옵션 2: 웨이포인트와 사이드카 프린시펄 양쪽의 트래픽 허용하기.
정책을 즉시 적용하되, 웨이포인트와 함께 남아 있는 사이드카 워크로드의 service account를 notPrincipals 예외 목록에 추가하세요. 각 사이드카 프린시펄이 마이그레이션되면 목록에서 제거해요. 모든 호출자가 앰비언트 모드가 되면 웨이포인트 프린시펄만 남으면 돼요.
우회 방지 정책 적용하기 (Apply the bypass prevention policy)
웨이포인트가 사용하는 service account를 조회하세요:
$ kubectl get pod -n <namespace> -l gateway.istio.io/managed=istio.io-mesh-controller \
-o jsonpath='{.items[0].spec.serviceAccountName}'
옵션 1의 경우, 모든 호출자가 마이그레이션된 후에만 정책을 적용하세요:
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: deny-waypoint-bypass
namespace: bookinfo
spec:
selector:
matchLabels:
app: reviews
action: DENY
rules:
- from:
- source:
notPrincipals:
- "cluster.local/ns/bookinfo/sa/waypoint"
옵션 2의 경우, 마이그레이션 동안 예외 목록에 사이드카 프린시펄을 포함하세요:
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: deny-waypoint-bypass
namespace: bookinfo
spec:
selector:
matchLabels:
app: reviews
action: DENY
rules:
- from:
- source:
notPrincipals:
- "cluster.local/ns/bookinfo/sa/waypoint"
- "cluster.local/ns/bookinfo/sa/productpage"
다음 단계 (Next steps)
네임스페이스에 레이블을 붙이고 웨이포인트를 활성화하며 사이드카 주입을 제거하려면 앰비언트 모드 활성화로 진행하세요.