F5 AI Gateway Kubernetes NGINX Ingress Controller 통합

이 포스트에서는 Kubernetes 클러스터에 배포된 F5 AI Gateway 를 NGINX Ingress Controller를 통해 클러스터 외부로 노출하는 방법에 관해 설명합니다. 또한 NGINX Ingress Controller의 Policy 리소스 구성을 통해 F5 AI Gateway로 전달할 요청에 다양한 정책을 적용하는 방법을 설명합니다.

이 포스트에서는 F5 AI Gateway를 클러스터에 배포하는 방법은 다루지 않으며, Policy 구성 중 JWT 인증의 경우 NGINX Ingress Controller의 상업 구독 버전인 NGINX Plus Ingress Controller 전용 기능입니다. JWT 인증을 제외한 Policy의 경우 NGINX Ingress Controller에서 모두 사용 가능합니다.

포스트의 예제는 NGINX Plus Ingress Controller를 사용했으며, NGINX Ingress Controller로 용어를 통일하여 작성했습니다. 포스트에서 소개된 인증 관련 기능 중 JWT 인증을 제외한 모든 기능은 일반 NGINX Ingress Controller에서도 사용할 수 있습니다.

목차

1. F5 AI Gateway란?
2. 버전 정보
3. F5 AI Gateway, NGINX Ingress Controller Virtualserver 구성
4. NGINX Ingress Controller Policy 구성
5. 결론

1. F5 AI Gateway 란?

F5 AI Gateway

F5 AI Gateway는 생성형 AI 서비스에 대한 보안, 가시성, 제어 기능을 제공하는 프록시 기반의 게이트웨이 솔루션입니다.
LLM(Large Language Model) 기반 서비스가 폭발적으로 증가함에 따라, AI 응답을 조작하거나 민감한 데이터를 유출하는 Prompt Injection, System Prompt Leakage 등의 공격에 대응하기 위한 보안 솔루션이 필수적으로 요구되고 있습니다.

F5 AI Gateway는 클라이언트와 LLM 모델 사이에서 이러한 보안 위협을 방지하고, AI 서비스의 요청과 응답 흐름을 통제할 수 있도록 도와줍니다.

주요 기능
  • 요청/응답 프록시
    사용자의 LLM 요청을 사전에 검사하고, 응답 내용 역시 점검한 뒤 전달하는 중간자 역할을 수행합니다.
  • 보안 정책 적용
    OWASP에서 발표한 LLM Top 10 위협 요소 일부에 대응할 수 있는 다양한 정책을 적용할 수 있습니다. 예를 들어 Prompt Injection, System Prompt Leakage 공격을 정책으로 방어할 수 있습니다.
  • 정책 기반 제어
    JSON 형식의 정책을 통해 요청에 대한 필터링, 리디렉션, 차단 등의 제어를 수행할 수 있으며, 컨텍스트 기반의 응답 조작도 가능합니다.
  • 로깅 및 가시성
    모든 요청과 응답에 대한 세부 정보를 수집하고 S3 스토리지에 저장할 수 있어, 보안 분석 및 감사가 용이합니다.

2. 버전 정보

  • Kubernetes: v1.32.2
  • NGINX Plus Ingress Controller: 4.0.1
  • F5 AI Gateway: v1.0.2
  • F5 AI Gateway Helm chart: aigw-0.1.1

3. F5 AI Gateway, NGINX Ingress Controller Virtualserver 구성

F5 AI Gateway는 프론트에 HTTP 리버스 프록시 서버가 존재하는 아키텍처를 전제로 설계되었습니다.

  • 다수의 AI Gateway 코어 인스턴스(Replica)를 운영하는 경우, 로드 밸런싱을 통해 트래픽을 분산시켜 가용성을 높입니다.
  • 인증되지 않은 사용자나 불필요한 요청이 AI Gateway에 직접 접근하지 못하도록, 보안 제어 기능을 수행합니다.
  • 클라이언트와 리버스 프록시 서버 간 통신은 TLS(HTTPS)를 사용해 암호화하고, 리버스 프록시 서버와 AI Gateway 코어 간 통신은 mTLS를 적용합니다.

Kubernetes 클러스터에 배포된 NGINX Ingress Controller와 F5 AI Gateway를 통합하여 이러한 요구 사항을 충족할 수 있습니다.

F5 AI Gateway는 Kubernetes 클러스터의 ai-gateway 네임스페이스에 배포되어 있습니다.
설치 가이드 문서와 같이 Helm을 사용해 배포했습니다.

$ kubectl get po,svc -n ai-gateway 

NAME                                      READY   STATUS    RESTARTS   AGE
pod/aigw-75ddb684cf-78ftq                 1/1     Running   0          37m
pod/aigw-processors-f5-67747cf466-c79fv   1/1     Running   0          36m

NAME                         TYPE           CLUSTER-IP       EXTERNAL-IP              PORT(S)     AGE
service/aigw                 ClusterIP      10.98.79.54      <none>                   80/TCP      9d
service/aigw-processors-f5   ClusterIP      10.111.248.231   <none>                   80/TCP      9d

NGINX Ingress Controller를 통해 AI Gateway로 요청을 전달하기 위한 VirtualServer를 AI Gateway가 배포된 네임스페이스(ai-gateway)에 배포합니다. 추가적인 Policy 구성이 적용되지 않은 기본적인 트래픽 라우팅 구성입니다.

apiVersion: k8s.nginx.org/v1
kind: VirtualServer
metadata:
  name: aigw
  namespace: ai-gateway
spec:
  host: aigw.example.com
  tls:
    secret: aigw-nic-tls
    redirect:
      enable: true
  upstreams:
    - name: aigw
      service: aigw
      port: 80
      connect-timeout: 240s
      read-timeout: 240s
      send-timeout: 240s
      client-max-body-size: 512k
    - name: ollama
      service: ollama-ext-svc
      port: 11434
  routes:
    - path: /
      action:
        proxy:
          upstream: aigw
    - path: /api/tags
      action:
        proxy:
          upstream: ollama
    - path: /api/version
      action:
        proxy:
          upstream: ollama

aigw.example.com로 host를 구성했으며, aigw-nic-tls Secret의 인증서/키 파일을 통해 SSL/TLS 구성 및 HTTP to HTTPS redirect 구성이 되어있습니다. Kubernetes Secret을 사용한 SSL/TLS 구성의 경우 NGINX Ingress Controller SSL/TLS 구성 튜토리얼 포스트를 참고하세요.

/api/tags, /api/version 경로 요청의 경우 직접 LLM 백엔드인 Ollama로 전달되도록 구성하고, 이외의 생성형 AI 트래픽은 F5 AI Gateway Pod로 전달되도록 구성했습니다.

AI Gateway의 경우 응답 시간을 고려한 timeout 설정과 요청 본문 크기 설정을 적용합니다. client-max-body-size의 기본값은 1m, timeout의 경우 60으로 환경에 맞춰 설정합니다.

  upstreams:
    - name: aigw
      service: aigw
      port: 80
      connect-timeout: 240s
      read-timeout: 240s
      send-timeout: 240s
      client-max-body-size: 512k

timeout 설정의 경우 F5 AI Gateway의 설정도 동일하게 구성되어야 합니다.

    routes:
      - path: /api/chat
        policy: chat-policy     
        schema: v1/chat_completions
        timeoutSeconds: 240

Postman을 사용하여 구성한 host로 요청 전송 시 정상적으로 응답함을 확인할 수 있습니다.

4. NGINX Ingress Controller Policy 구성

NGINX Ingress Controller와 F5 AI Gateway를 통합 시 NGINX Ingress Controller의 다양한 Policy 리소스를 활용할 수 있습니다. 각 Policy 및 Policy에서 참조하는 Secret의 경우 동일한 VirtualServer 리소스와 네임스페이스에 배포되어야 합니다.
NGINX Ingress Controller의 Policy에 대한 더 상세한 내용은 정책 리소스 문서를 참고하세요.

apiVersion: k8s.nginx.org/v1
kind: VirtualServer
metadata:
  name: aigw
  namespace: ai-gateway
spec:
  host: aigw.example.com
  tls:
    secret: aigw-nic-tls
    redirect:
      enable: true
  upstreams:
    - name: aigw
      service: aigw
      port: 80
      connect-timeout: 240s
      read-timeout: 240s
      send-timeout: 240s
      client-max-body-size: 512k
      tls:
        enable: true
    - name: ollama
      service: ollama-ext-svc
      port: 11434

  routes:
    - path: /
      policies:
        - name: aigw-mtls
        - name: aigw-rate-limit
        - name: aigw-jwt
        - name: aigw-access-control
      action:
        proxy:
          upstream: aigw
          requestHeaders:
            set:
              - name: nic-aud
                value: ${jwt_claim_aud}
              - name: token # JWT가 포함된 헤더 비움
                value: ""
    - path: /api/tags
      action:
        proxy:
          upstream: ollama
    - path: /api/version
      action:
        proxy:
          upstream: ollama

spec.routes.policy 리스트에 생성한 Polciy 리소스의 이름을 명시하여 해당 path에 정책을 적용할 수 있습니다.

mTLS

다음과 같이 egress mTLS Policy를 구성하여 NGINX Ingress Controller와 AI Gateway 사이의 통신을 암호화할 수 있습니다.

apiVersion: k8s.nginx.org/v1
kind: Policy
metadata:
  name: aigw-mtls
  namespace: ai-gateway
spec:
  egressMTLS:
    tlsSecret: aigw-nic-client-tls
    trustedCertSecret: internal-ca
    verifyServer: on
    serverName: on
    sslName: aigw.ai-gateway.svc.cluster.local
    protocols: TLSv1.3

NGINX Ingress Controller가 AI Gateway로 요청을 전송할 때 사용할 클라이언트 인증서는 aigw-nic-client-tls Secret에, AI Gateway TLS 인증서를 검증하기 위한 내부 CA는 internal-ca Secret에 저장되어 있어야 합니다.
Secret 구성의 경우 정책 리소스 문서의 EgressMTLS 항목을 참고하세요.

mTLS 적용을 위해 AI Gateway 설정에도 추가 설정이 필요합니다.

server:
  address: :4141
  tls:
    enabled: true
    serverCertPath: /etc/tls/tls.crt
    serverKeyPath: /etc/tls/tls.key
  mtls:
    enabled: true
    clientCertPath: /etc/internal-ca/ca.crt

Secret에 저장된 인증서를 Pod에 마운트하기 위해 아래와 같이 Helm value를 구성하여 마운트 할 수 있습니다.

aigw:
  volumes:
    - name: internal-ca-volume
      secret:
        secretName: internal-ca
    - name: tls-volume
      secret:
        secretName: aigw-tls
  volumeMounts:
    - name: internal-ca-volume
      readOnly: true
      mountPath: "/etc/internal-ca"
    - name: tls-volume
      readOnly: true
      mountPath: "/etc/tls"
Rate limit

다음과 같이 rate limit Policy를 구성하여 요청을 전송한 주소(IP:port)별로 초당 1회의 요청 제한을 적용할 수 있습니다.

apiVersion: k8s.nginx.org/v1
kind: Policy
metadata:
  name: aigw-rate-limit
  namespace: ai-gateway
spec:
  rateLimit:
    rate: 1r/s
    key: ${binary_remote_addr}
    zoneSize: 10M
JWT

다음과 같이 JWT Policy를 구성하여 token 헤더에 포함된 JWT를 https://example.com/keys/jwks의 JWK를 통해서 검증하도록 구성할 수 있습니다.
해당 기능은 NGINX Ingress Controller의 상업 구독 버전인 NGINX Plus Ingress Controller 전용 기능입니다.

apiVersion: k8s.nginx.org/v1
kind: Policy
metadata:
  name: aigw-jwt
  namespace: ai-gateway
spec:
  jwt:
    realm: MyProductAPI
    token: $http_token
    jwksURI: https://example.com/keys/jwks
    keyCache: 1h

JWKs URI가 아닌 Kubernetes Secret을 활용하여 JWT를 검증하는 방법은 Kubernetes Secret 활용 NGINX Ingress Controller JWT 인증 설정 포스트를 참고하세요.

또한 VirtualServer의 requestHeaders 구성을 통해 JWT의 claim 값을 헤더로 전달하고, JWT를 AI Gateway로 전달하지 않도록 설정할 수 있습니다.

      action:
        proxy:
          upstream: aigw
          requestHeaders:
            set:
              - name: nic-aud
                value: ${jwt_claim_aud}
              - name: token # JWT가 포함된 헤더 값 비움
                value: ""

위 구성의 경우 JWT의 aud claim 값을 nic-aud 헤더에 담아 F5 AI Gateway로 전달하며, JWT 토큰 자체는 전달하지 않습니다.

Access control

다음과 같이 access control Policy를 적용하여 특정 IP/서브넷의 요청만을 허용하도록 제한할 수 있습니다.

apiVersion: k8s.nginx.org/v1
kind: Policy
metadata:
  name: aigw-access-control
  namespace: ai-gateway
spec:
  accessControl:
    allow:
      - 10.0.0.0/24

5. 결론

F5 AI Gateway는 다양한 보안 및 정책 제어 기능을 제공하며, NGINX Ingress Controller와의 통합을 통해 Kubernetes 환경에서도 유연하고 확장성 높은 구성으로 운영할 수 있습니다. 특히 mTLS, RateLimit, AccessControl 등의 정책은 별도의 추가 컴포넌트 없이 NGINX Ingress Controller에서 적용 가능하다는 점에서 관리 측면에서도 장점을 가집니다.

JWT 인증 기능처럼 일부 고급 기능은 NGINX Plus Ingress Controller에서만 제공되지만, 기본 NGINX Ingress Controller만으로도 대부분의 보안 정책을 구현할 수 있습니다. 이처럼 F5 AI Gateway는 Kubernetes에 배포되어 NGINX Ingress Controller와 통합 시 보안, 인증, 요청 제어가 중요한 LLM 애플리케이션 운영 환경에서 효과적으로 활용할 수 있는 솔루션입니다.

운영 중인 AI 서비스에 강력한 보안이 필요하신가요? NGINX STORE를 통해 문의하여 F5 AI Gateway with NGINX Integration 서비스를 통해 AI 서비스를 보호 하세요.

NGINX STORE를 통한 솔루션 도입 및 기술지원 무료 상담 신청

* indicates required