검색

2.21. 확장

download PDF

WebAssembly 확장을 사용하여 Red Hat OpenShift Service Mesh 프록시에 새 기능을 직접 추가할 수 있습니다. 이를 통해 애플리케이션에서 일반적인 기능을 더 많이 이동하고 WebAssembly 바이트 코드로 컴파일되는 단일 언어로 구현할 수 있습니다.

참고

WebAssembly 확장은 IBM Z® 및 IBM Power®에서 지원되지 않습니다.

2.21.1. WebAssembly 모듈 개요

WebAssembly 모듈은 프록시를 포함한 많은 플랫폼에서 실행할 수 있으며 광범위한 언어 지원, 빠른 실행 및 샌드박스별 보안 모델을 사용할 수 있습니다.

Red Hat OpenShift Service Mesh 확장은 Envoy HTTP 필터 로, 다양한 기능을 제공합니다.

  • 요청 및 응답의 본문과 헤더를 조작합니다.
  • 인증 또는 정책 검사와 같이 요청 경로에 없는 서비스에 대한 대역 외 HTTP 요청입니다.
  • 필터가 서로 통신할 수 있는 사이드 채널 데이터 스토리지 및 큐입니다.
참고

WebAssembly 확장을 새로 생성할 때 WasmPlugin API를 사용합니다. ServiceMeshExtension API는 Red Hat OpenShift Service Mesh 버전 2.2에서 더 이상 사용되지 않으며 Red Hat OpenShift Service Mesh 버전 2.3에서 제거되었습니다.

Red Hat OpenShift Service Mesh 확장을 작성하는 데는 두 가지 부분이 있습니다.

  1. proxy-wasm API 를 노출하고 WebAssembly 모듈로 컴파일하는 SDK를 사용하여 확장을 작성해야 합니다.
  2. 그런 다음 모듈을 컨테이너에 패키징해야 합니다.

지원되는 언어

WebAssembly 바이트 코드에 컴파일된 모든 언어를 사용하여 Red Hat OpenShift Service Mesh 확장을 작성할 수 있지만, 다음 언어에는 proxy-wasm API를 공개하는 기존 SDK가 있어 직접 사용할 수 있습니다.

표 2.13. 지원되는 언어
언어유지 관리자리포지터리

AssemblyScript

solo.io

solo-io/proxy-runtime

C++

proxy-wasm 팀(Istio 커뮤니티)

proxy-wasm/proxy-wasm-cpp-sdk

Go

tetrate.io

tetratelabs/proxy-wasm-go-sdk

Rust

proxy-wasm 팀(Istio 커뮤니티)

proxy-wasm/proxy-wasm-rust-sdk

2.21.2. WasmPlugin 컨테이너 형식

Istio는 Wasm 플러그인 메커니즘에서 OCI(Open Container Initiative) 이미지를 지원합니다. Wasm 플러그인을 컨테이너 이미지로 배포할 수 있으며 spec.url 필드를 사용하여 컨테이너 레지스트리 위치를 참조할 수 있습니다. 예를 들어 quay.io/my-username/my-plugin:latest.

WASM 모듈의 각 실행 환경(runtime)에는 런타임별 구성 매개변수가 있을 수 있으므로 WASM 이미지는 다음 두 계층으로 구성할 수 있습니다.

  • plugin.wasm (필수) - 콘텐츠 계층. 이 계층은 런타임에서 로드할 WebAssembly 모듈의 바이트 코드가 포함된 .wasm 바이너리로 구성됩니다. 이 파일 이름을 plugin.wasm 로 지정해야 합니다.
  • runtime-config.json (선택 사항) - 구성 계층. 이 계층은 대상 런타임의 모듈에 대한 메타데이터를 설명하는 JSON 형식의 문자열로 구성됩니다. 대상 런타임에 따라 구성 계층에 따라 추가 데이터가 포함될 수도 있습니다. 예를 들어 WASM Envoy Filter의 구성에는 필터에서 사용할 수 있는 root_ids가 포함되어 있습니다.

2.21.3. WasmPlugin API 참조

WasmPlugins API는 WebAssembly 필터를 통해 Istio 프록시에서 제공하는 기능을 확장하는 메커니즘을 제공합니다.

여러 WasmPlugins를 배포할 수 있습니다. phasepriority 설정은 Envoy의 필터 체인의 일부로 실행 순서를 결정하므로 사용자가 제공하는 WasmPlugins와 Istio의 내부 필터 간의 복잡한 상호 작용을 구성할 수 있습니다.

다음 예에서 인증 필터는 OpenID 흐름을 구현하고 JWT(JSON Web Token)로 인증 헤더를 채웁니다. Istio 인증은 이 토큰을 사용하여 수신 게이트웨이에 배포합니다. WasmPlugin 파일은 프록시 사이드카 파일 시스템에 있습니다. url 필드를 참조하세요.

apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: openid-connect
  namespace: istio-ingress
spec:
  selector:
    matchLabels:
      istio: ingressgateway
  url: file:///opt/filters/openid.wasm
  sha256: 1ef0c9a92b0420cf25f7fe5d481b231464bc88f486ca3b9c83ed5cc21d2f6210
  phase: AUTHN
  pluginConfig:
    openid_server: authn
    openid_realm: ingress

다음은 동일한 예제이지만 이번에는 파일 시스템의 파일 대신 OCI(Open Container Initiative) 이미지가 사용됩니다. url,imagePullPolicy, imagePullSecret 필드에 유의하십시오.

apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: openid-connect
  namespace: istio-system
spec:
  selector:
    matchLabels:
      istio: ingressgateway
  url: oci://private-registry:5000/openid-connect/openid:latest
  imagePullPolicy: IfNotPresent
  imagePullSecret: private-registry-pull-secret
  phase: AUTHN
  pluginConfig:
    openid_server: authn
    openid_realm: ingress
표 2.14. WasmPlugin 필드 참조
필드유형설명필수 항목

spec.selector

WorkloadSelector

이 플러그인 구성을 적용해야 하는 특정 Pod/VM 세트를 선택하는 데 사용되는 기준입니다. 생략하면 이 구성은 동일한 네임스페이스의 모든 워크로드 인스턴스에 적용됩니다. WasmPlugin 필드가 구성 루트 네임스페이스에 있는 경우 모든 네임스페이스에서 적용 가능한 모든 워크로드에 적용됩니다.

없음

spec.url

string

Wasm 모듈 또는 OCI 컨테이너의 URL입니다. 스키마가 없는 경우 기본값은 OCI 이미지를 참조하여 oci:// 입니다. 기타 유효한 스키마는 프록시 컨테이너 내에 로컬에 있는 .wasm 모듈 파일을 참조하는 file:// 이며, 원격으로 호스팅되는 .wasm 모듈 파일의 경우 http[s]:// 입니다.

없음

spec.sha256

string

Wasm 모듈 또는 OCI 컨테이너를 확인하는 데 사용할 SHA256 체크섬입니다. url 필드가 이미 SHA256을 참조하는 경우( @sha256: 표기법 사용) 이 필드의 값과 일치해야 합니다. tag에서 OCI 이미지를 참조하고 이 필드가 설정되면 가져오기 후 이 필드의 콘텐츠에 대해 체크섬을 확인합니다.

없음

spec.imagePullPolicy

PullPolicy

OCI 이미지를 가져올 때 적용할 가져오기 동작입니다. SHA 대신 태그에서 이미지를 참조하는 경우에만 관련이 있습니다. url 필드에서 OCI 이미지를 참조하고 latest 태그를 사용하는 경우를 제외하고 기본값은 IfNotPresent 입니다. 이 경우 Always 값이 기본값인 K8s 동작입니다. url 필드가 file:// 또는 http[s]:// 를 직접 사용하여 Wasm 모듈을 참조하는 경우 설정이 무시됩니다.

없음

spec.imagePullSecret

string

OCI 이미지 가져오기에 사용할 자격 증명입니다. 이미지를 가져올 때 레지스트리에 대해 인증하기 위한 풀 시크릿이 포함된 WasmPlugin 오브젝트와 동일한 네임스페이스에 있는 보안의 이름입니다.

없음

spec.phase

PluginPhase

필터 체인에서 이 WasmPlugin 오브젝트가 삽입되는 위치를 결정합니다.

없음

spec.priority

int64

동일한 phase 값을 가진 WasmPlugins 오브젝트의 순서를 결정합니다. 동일한 단계의 동일한 워크로드에 여러 WasmPlugins 오브젝트가 적용되면 우선 순위 및 내림차순으로 적용됩니다. priority 필드가 설정되지 않았거나 동일한 값을 가진 두 개의 WasmPlugins 오브젝트는 WasmPlugins 오브젝트의 이름과 네임스페이스에서 순서가 결정됩니다. 기본값은 0 입니다.

없음

spec.pluginName

string

Envoy 구성에 사용되는 플러그인 이름입니다. 일부 Wasm 모듈에는 실행할 Wasm 플러그인을 선택하기 위해 이 값이 필요할 수 있습니다.

없음

spec.pluginConfig

struct

플러그인에 전달될 구성입니다.

없음

spec.pluginConfig.verificationKey

string

서명된 OCI 이미지 또는 Wasm 모듈의 서명을 확인하는 데 사용되는 공개 키입니다. PEM 형식으로 제공해야 합니다.

없음

WorkloadSelector 오브젝트는 필터를 프록시에 적용할 수 있는지 확인하는 데 사용되는 기준을 지정합니다. 일치하는 기준에는 프록시와 관련된 메타데이터, Pod/VM에 연결된 라벨과 같은 워크로드 인스턴스 정보 또는 프록시가 초기 핸드셰이크 중에 Istio에 제공하는 기타 정보가 포함됩니다. 여러 조건이 지정된 경우 워크로드 인스턴스를 선택하기 위해 모든 조건을 일치해야 합니다. 현재는 레이블 기반 선택 메커니즘만 지원됩니다.

표 2.15. WorkloadSelector
필드유형설명필수 항목

matchLabels

map<string, string>

정책을 적용해야 하는 특정 Pod/VM 세트를 나타내는 하나 이상의 레이블입니다. 레이블 검색 범위는 리소스가 있는 구성 네임스페이스로 제한됩니다.

제공됨

PullPolicy 오브젝트는 OCI 이미지를 가져올 때 적용할 가져오기 동작을 지정합니다.

표 2.16. PullPolicy
현재의설명

<empty>

latest 태그가 있는 OCI 이미지를 제외하고 IfNotPresent 의 기본값은 값이 Always 입니다.

IfNotPresent

기존 버전의 이미지를 이전에 가져온 경우 해당 이미지가 사용됩니다. 로컬에 이미지 버전이 없는 경우 최신 버전을 가져옵니다.

Always

이 플러그인을 적용할 때 항상 최신 버전의 이미지를 가져옵니다.

struct 는 동적으로 형식화된 값에 매핑되는 필드로 구성된 구조화된 데이터 값을 나타냅니다. 일부 언어에서는 Struct이 기본 표현으로 지원될 수 있습니다. 예를 들어 JavaScript와 같은 스크립팅 언어에서는 구조를 오브젝트로 나타냅니다.

표 2.17. struct
필드유형설명

필드

map<string, Value>

동적으로 형식화된 값의 맵입니다.

PluginPhase 는 플러그인이 삽입될 필터 체인의 단계를 지정합니다.

표 2.18. PluginPhase
필드설명

<empty>

컨트롤 플레인은 플러그인을 삽입할 위치를 결정합니다. 일반적으로 라우터 바로 앞에 필터 체인의 끝에 있습니다. 플러그인이 다른 사용자와 독립적이면 PluginPhase를 지정하지 마십시오.

AUTHN

Istio 인증 필터 앞에 플러그인을 삽입합니다.

AUTHZ

Istio 권한 부여 필터 앞에 플러그인을 삽입하고 Istio 인증 필터 후에 플러그인을 삽입합니다.

STATS

Istio 통계 필터 앞에 플러그인을 삽입하고 Istio 권한 부여 필터 후에 플러그인을 삽입합니다.

2.21.3.1. WasmPlugin 리소스 배포

WasmPlugin 리소스를 사용하여 Red Hat OpenShift Service Mesh 확장을 활성화할 수 있습니다. 이 예에서 istio-system 은 Service Mesh Control Plane 프로젝트의 이름입니다. 다음 예제에서는 사용자를 인증하기 위해 OpenID Connect 흐름을 수행하는 openid-connect 필터를 생성합니다.

프로세스

  1. 다음 예제 리소스를 만듭니다.

    plugin.yaml의 예

    apiVersion: extensions.istio.io/v1alpha1
    kind: WasmPlugin
    metadata:
      name: openid-connect
      namespace: istio-system
    spec:
      selector:
        matchLabels:
          istio: ingressgateway
      url: oci://private-registry:5000/openid-connect/openid:latest
      imagePullPolicy: IfNotPresent
      imagePullSecret: private-registry-pull-secret
      phase: AUTHN
      pluginConfig:
        openid_server: authn
        openid_realm: ingress

  2. 다음 명령을 사용하여 plugin.yaml 파일을 적용합니다.

    $ oc apply -f plugin.yaml

2.21.4. ServiceMeshExtension 컨테이너 형식

컨테이너 이미지를 유효한 확장 이미지로 만들려면 컨테이너 파일 시스템의 루트에 WebAssembly 모듈의 바이트 코드가 포함된 .wasm 파일과 manifest.yaml 파일이 있어야 합니다.

참고

WebAssembly 확장을 새로 생성할 때 WasmPlugin API를 사용합니다. ServiceMeshExtension API는 Red Hat OpenShift Service Mesh 버전 2.2에서 더 이상 사용되지 않으며 Red Hat OpenShift Service Mesh 버전 2.3에서 제거되었습니다.

manifest.yaml

schemaVersion: 1

name: <your-extension>
description: <description>
version: 1.0.0
phase: PreAuthZ
priority: 100
module: extension.wasm

표 2.19. manifest.yml에 대한 필드 참조
필드설명필수 항목

schemaVersion

매니페스트 스키마 버전 지정에 사용됩니다. 현재 가능한 값은 1입니다.

이 필드는 필수 항목입니다.

name

해당 확장의 이름입니다.

이 필드는 메타데이터일 뿐이며 현재 사용되지 않습니다.

description

해당 확장의 설명입니다.

이 필드는 메타데이터일 뿐이며 현재 사용되지 않습니다.

version

해당 확장의 버전입니다.

이 필드는 메타데이터일 뿐이며 현재 사용되지 않습니다.

phase

해당 확장의 기본 실행 단계입니다.

이 필드는 필수 항목입니다.

priority

해당 확장의 기본 우선순위입니다.

이 필드는 필수 항목입니다.

module

컨테이너 파일 시스템의 루트에서 WebAssembly 모듈에 대한 상대적 경로입니다.

이 필드는 필수 항목입니다.

2.21.5. ServiceMeshExtension 참조

ServiceMeshExtension API는 WebAssembly 필터를 통해 Istio 프록시에서 제공하는 기능을 확장하는 메커니즘을 제공합니다. WebAssembly 확장을 작성하는 데는 두 가지 부분이 있습니다.

  1. proxy-wasm API를 노출하고 WebAssembly 모듈로 컴파일하는 SDK를 사용하여 확장을 작성합니다.
  2. 컨테이너에 패키징합니다.
참고

WebAssembly 확장을 새로 생성할 때 WasmPlugin API를 사용합니다. Red Hat OpenShift Service Mesh 버전 2.2에서 더 이상 사용되지 않는 ServiceMeshExtension API가 Red Hat OpenShift Service Mesh 버전 2.3에서 제거되었습니다.

표 2.20. ServiceMeshExtension 필드 참조
필드설명

metadata.namespace

ServiceMeshExtension 소스의 metadata.namespace 필드에는 특별한 의미가 있습니다. 컨트롤 플레인 네임스페이스와 같은 경우 확장은 해당 workloadSelector 값과 일치하는 서비스 메시의 모든 워크로드에 적용됩니다. 다른 메시 네임스페이스에 배포하면 동일한 네임스페이스의 워크로드에만 적용됩니다.

spec.workloadSelector

spec.workloadSelector 필드는 Istio 게이트웨이 리소스spec.selector 필드와 동일한 의미가 있습니다. Pod 레이블을 기반으로 하는 워크로드와 일치합니다. workloadSelector 값을 지정하지 않으면 네임스페이스의 모든 워크로드에 확장이 적용됩니다.

spec.config

이는 배포 중인 확장에 따라 의미 체계가 달라지며 확장에 전달되는 구조화된 필드입니다.

spec.image

확장자가 있는 이미지를 가리키는 컨테이너 이미지 URI입니다.

spec.phase

단계는 인증, 권한 부여, 지표 생성과 같은 기존 Istio 기능과 관련하여 필터 체인에서 확장이 삽입되는 위치를 결정합니다. 유효한 값: PreAuthN, PostAuthN, PreAuthZ, PostAuthZ, PreStats, PostStats. 이 필드의 기본값은 확장자의 manifest.yaml 파일에 설정된 값이지만 사용자가 덮어쓸 수 있습니다.

spec.priority

spec.phase 값이 동일한 여러 확장이 동일한 워크로드 인스턴스에 적용되는 경우 spec.priority 값이 실행 순서를 결정합니다. 우선순위가 높은 확장이 먼저 실행됩니다. 이를 통해 상호 의존적인 확장을 허용합니다. 이 필드의 기본값은 확장자의 manifest.yaml 파일에 설정된 값이지만 사용자가 덮어쓸 수 있습니다.

2.21.5.1. ServiceMeshExtension 리소스 배포

ServiceMeshExtension 리소스를 사용하여 Red Hat OpenShift Service Mesh 확장을 활성화할 수 있습니다. 이 예에서 istio-system 은 Service Mesh Control Plane 프로젝트의 이름입니다.

참고

WebAssembly 확장을 새로 생성할 때 WasmPlugin API를 사용합니다. ServiceMeshExtension API는 Red Hat OpenShift Service Mesh 버전 2.2에서 더 이상 사용되지 않으며 Red Hat OpenShift Service Mesh 버전 2.3에서 제거되었습니다.

Rust SDK를 사용하여 빌드된 전체 예제는 header-append-filter를 참조하십시오. 확장의 config 필드에서 가져온 이름과 값을 사용하여 하나 이상의 헤더를 HTTP 응답에 추가하는 간단한 필터입니다. 아래 코드 조각의 샘플 구성을 참조하십시오.

프로세스

  1. 다음 예제 리소스를 만듭니다.

    ServiceMeshExtension 리소스 extensions.yaml의 예

    apiVersion: maistra.io/v1
    kind: ServiceMeshExtension
    metadata:
      name: header-append
      namespace: istio-system
    spec:
      workloadSelector:
        labels:
          app: httpbin
      config:
        first-header: some-value
        another-header: another-value
      image: quay.io/maistra-dev/header-append-filter:2.1
      phase: PostAuthZ
      priority: 100

  2. 다음 명령을 사용하여 extension.yaml 파일을 적용합니다.

    $ oc apply -f <extension>.yaml

2.21.6. ServiceMeshExtension 에서 WasmPlugin 리소스로 마이그레이션

Red Hat OpenShift Service Mesh 버전 2.2에서 더 이상 사용되지 않는 ServiceMeshExtension API가 Red Hat OpenShift Service Mesh 버전 2.3에서 제거되었습니다. ServiceMeshExtension API를 사용하는 경우 WebAssembly 확장을 계속 사용하려면 WasmPlugin API로 마이그레이션해야 합니다.

API는 매우 비슷합니다. 마이그레이션은 다음 두 단계로 구성됩니다.

  1. 플러그인 파일 이름 변경 및 모듈 패키지 업데이트입니다.
  2. 업데이트된 컨테이너 이미지를 참조하는 WasmPlugin 리소스를 생성합니다.

2.21.6.1. API 변경

새로운 WasmPlugin API는 ServiceMeshExtension 와 유사하지만 특히 필드 이름에서 몇 가지 차이점이 있습니다.

표 2.21. ServiceMeshExtensions 와 WasmPlugin간 필드 변경
ServiceMeshExtensionWasmPlugin

spec.config

spec.pluginConfig

spec.workloadSelector

spec.selector

spec.image

spec.url

spec.phase 유효한 값: PreAuthN, PostAuthN, PreAuthZ, PostAuthZ, PreStats, PostStats

spec.phase 유효한 값: <empty>, AUTHN, AUTHZ, STATS

다음은 ServiceMeshExtension 리소스를 WasmPlugin 리소스로 변환하는 방법의 예입니다.

ServiceMeshExtension 리소스

apiVersion: maistra.io/v1
kind: ServiceMeshExtension
metadata:
  name: header-append
  namespace: istio-system
spec:
  workloadSelector:
    labels:
      app: httpbin
  config:
    first-header: some-value
    another-header: another-value
  image: quay.io/maistra-dev/header-append-filter:2.2
  phase: PostAuthZ
  priority: 100

위의 ServiceMeshExtension에 해당하는 새로운 WasmPlugin 리소스

apiVersion: extensions.istio.io/v1alpha1
kind: WasmPlugin
metadata:
  name: header-append
  namespace: istio-system
spec:
  selector:
    matchLabels:
      app: httpbin
  url: oci://quay.io/maistra-dev/header-append-filter:2.2
  phase: STATS
  pluginConfig:
    first-header: some-value
    another-header: another-value

2.21.6.2. 컨테이너 이미지 형식 변경

새로운 WasmPlugin 컨테이너 이미지 형식은 ServiceMeshExtensions 와 유사하지만 다음과 같은 차이점이 있습니다.

  • ServiceMeshExtension 컨테이너 형식에는 컨테이너 파일 시스템의 루트 디렉터리에 manifest.yaml 이라는 메타데이터 파일이 필요했습니다. WasmPlugin 컨테이너 형식에는 manifest.yaml 파일이 필요하지 않습니다.
  • 이전에 파일 이름을 사용할 수 있는 .wasm 파일(실제 플러그인)은 이제 plugin.wasm 로 지정해야 하며 컨테이너 파일 시스템의 루트 디렉터리에 있어야 합니다.

2.21.6.3. WasmPlugin 리소스로 마이그레이션

WebAssembly 확장을 ServiceMeshExtension API에서 WasmPlugin API로 업그레이드하려면 플러그인 파일의 이름을 바꿉니다.

사전 요구 사항

  • ServiceMeshControlPlane 이 버전 2.2 이상으로 업그레이드됩니다.

프로세스

  1. 컨테이너 이미지를 업데이트합니다. 플러그인이 컨테이너 내 /plugin.wasm에 이미 있는 경우 다음 단계로 건너뜁니다. 그렇지 않은 경우:

    1. 플러그인 파일 이름이 plugin.wasm 인지 확인합니다. 플러그인 파일 이름을 plugin.wasm 으로 지정해야 합니다.
    2. 플러그인 파일이 루트(/) 디렉터리에 있는지 확인합니다. 확장 파일을 컨테이너 파일 시스템의 루트에 저장해야 합니다.
    3. 컨테이너 이미지를 다시 빌드하고 컨테이너 레지스트리로 내보냅니다.
  2. ServiceMeshExtension 리소스를 제거하고 빌드한 새 컨테이너 이미지를 참조하는 WasmPlugin 리소스를 생성합니다.
Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.