APISIX Ingress가 커스텀 플러그인을 어떻게 지원하는가

API7.ai

October 11, 2022

Products

Ingress 및 Ingress Controller

Ingress는 Kubernetes의 API 객체 중 하나입니다. 이는 클러스터 내 서비스에 대한 외부 접근을 관리하며, 일반적으로 HTTP/HTTPS를 다룹니다.

클라이언트는 Ingress 규칙을 따라 클라이언트 요청을 Kubernetes 클러스터 서비스나 특정 Pod로 라우팅할 수 있습니다.

k8s_cluster.png

다음은 Ingress 리소스의 예시입니다:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: apisix-gateway
spec:
  rules:
    - host: apisix.apache.org
      http:
        paths:
          - backend:
              service:
                name: apisix-gateway
                port:
                  number: 80
            path: /
            pathType: Exact

위 예시는 다음과 같은 내용을 포함합니다:

  • metadata.name: Ingress 리소스의 이름
  • spec.rules[].host: 외부 접근에 사용되는 도메인
  • spec.rules[].http.paths[].backend: 클러스터 내 서비스의 관련 정보를 설명
  • spec.rules[].http.paths[].path: 클러스터 내 서비스에 외부 접근 시 사용되는 경로를 설명
  • spec.rules[].http.paths[].pathType: 클러스터 내 서비스에 대한 외부 접근을 관리하는 경로 유형을 설명

위 예시를 통해 Ingress 리소스의 사양이 상대적으로 단순하다는 것을 알 수 있습니다.

Ingress는 Kubernetes의 리소스 정의로, 스스로 트래픽을 처리할 수 없습니다. 따라서 Ingress 리소스를 효과적으로 사용하려면 이러한 Ingress 리소스를 처리할 컨트롤러를 사용해야 하며, 이를 Ingress 컨트롤러라고 합니다.

Ingress 컨트롤러는 Kubernetes 클러스터 내의 리소스 변경을 지속적으로 감시하고, Ingress 리소스 규칙을 데이터 계층의 프록시 규칙으로 변환하여 데이터 계층이 트래픽을 처리할 수 있도록 합니다.

실제 프로덕션 환경에서는 다양한 종류의 클라이언트 요청이 있습니다. 예를 들어, Ingress 리소스는 인증이나 URI 재작성과 같은 일반적인 기능을 직접적으로 설명할 수 없습니다. 그렇다면 이러한 요구사항을 어떻게 충족할 수 있을까요?

Ingress-NGINX는 어떻게 확장 기능을 지원하나요?

먼저, Kubernetes 생태계에서 Ingress-NGINX 컨트롤러의 예시를 통해 확장 기능을 사용하는 방법을 설명하겠습니다.

Ingress-NGINX에서는 Annotation을 사용하여 Ingress 리소스에 필요한 확장 기능을 설명할 수 있습니다. 예를 들어:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/enable-cors: "true"
    nginx.ingress.kubernetes.io/cors-allow-origin: https://foo.com,https://bar.com
    nginx.ingress.kubernetes.io/cors-allow-headers: x-foo-1,x-foo-2
    nginx.ingress.kubernetes.io/cors-allow-methods: GET,POST,PUT
  name: nginx-ingress
spec:
  rules:
    - host: kubernetes.github.io
      http:
        paths:
          - path: /ingress
            pathType: Exact
            backend:
              service:
                name: nginx
                port:
                  number: 80

위 설정은 CORS를 활성화합니다.

Ingress 리소스에 Annotation을 추가하는 것은 상대적으로 간단하지만, Ingress-NGINX 컨트롤러가 이러한 Annotation을 완전히 지원해야 한다는 점에 주의해야 합니다. 그렇지 않으면 설정이 적용되지 않습니다. Ingress-NGINX 컨트롤러의 개발되지 않은 기능을 사용하려면 일부 커스텀 개발이 필요합니다.

다음 섹션에서는 이러한 요구사항을 충족하기 위해 Apache APISIX Ingress 컨트롤러를 사용하는 방법을 설명합니다.

APISIX Ingress에서 플러그인 사용하기

Apache APISIX Ingress는 트래픽 처리 및 특정 시나리오에 대한 다양한 요구사항을 충족하기 위해 플러그인을 활용합니다. 현재 80개 이상의 즉시 사용 가능한 플러그인이 있으며, 사용자는 새로운 기능을 지원하기 위해 커스텀 플러그인을 개발할 수 있습니다.

apisix.PNG

커스텀 플러그인을 개발하는 여러 방법이 있습니다:

  • 사용자는 Lua를 사용하여 플러그인을 개발할 수 있으며, 이러한 플러그인은 APISIX 내부에서 실행될 수 있습니다.
  • 사용자는 다른 프로그래밍 언어를 사용하여 플러그인을 개발할 수도 있습니다. 이 메커니즘은 "플러그인 러너"라고 하며, 이 메커니즘으로 개발된 플러그인은 "외부 플러그인"이라고 합니다.

플러그인 개발에 대한 공식 문서를 참조하세요:

APISIX Ingress에서 Lua를 사용하여 플러그인을 개발하는 세 가지 방법을 소개하겠습니다.

순수 CRD 모드

APISIX Ingress 컨트롤러는 자체 설계한 CRD 사양을 지원하며, 라우팅 규칙에서 직접 플러그인을 활성화할 수 있습니다(내부 플러그인이든 커스텀 플러그인이든). 예를 들어:

apiVersion: apisix.apache.org/v2beta3
kind: ApisixRoute
metadata:
  name: httpbin-route
spec:
  http:
    - name: rule1
      match:
        hosts:
          - apisix.apache.org
        paths:
          - /apisix-ingress
      backends:
        - serviceName: apisix-gateway
          servicePort: 80
      plugins:
        - name: cors
          enable: true
          config:
            allow_origins: http://foo.bar.org
            allow_methods: "GET,POST"
            max_age: 3600
            expose_headers: x-foo,x-baz
            allow_headers: x-from-ingress
            allow_credential: true

사용자는 위 설정을 사용하여 라우팅 규칙을 생성할 수 있으며, 이 라우트에서 CORS 플러그인이 활성화됩니다.

이 방법은 APISIX Ingress에서 가장 기본적으로 지원되며, APISIX와 잘 어울립니다. 또한 사용자가 새로운 커스텀 플러그인을 추가할 때 APISIX Ingress를 재개발할 필요가 없으므로 사용자가 직접 사용할 수 있습니다.

CRD + Ingress Annotations 모드

CRD + Ingress Annotations를 사용하여 APISIX Ingress의 기능을 확장할 수도 있습니다. 예를 들어:

apiVersion: apisix.apache.org/v2
kind: ApisixPluginConfig
metadata:
  name: cors-plugin
spec:
  plugins:
    - name: cors
      enable: true
      config:
        allow_origins: http://foo.bar.org
        allow_methods: "GET,POST"
        max_age: 3600
        expose_headers: x-foo,x-baz
        allow_headers: x-from-ingress
        allow_credential: true
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: apisix
    k8s.apisix.apache.org/plugin-config-name: cors-plugin
  name: apisix-ingress
spec:
  rules:
    - host: apisix.apache.org
      http:
        paths:
          - path: /apisix-ingress
            pathType: Exact
            backend:
              service:
                name: apisix-gateway
                port:
                  number: 80

위 설정을 사용하여 cors-plugin이라는 플러그인 설정을 독립적으로 생성하고, Ingress 리소스의 k8s.apisix.apache.org/plugin-config-name: cors-plugin을 사용하여 이를 참조할 수 있습니다. 실제 효과는 첫 번째 설정과 거의 동일하며, 둘 다 해당 라우트에 대해 CORS 플러그인을 활성화합니다.

이 모드에서는 플러그인 설정을 독립적인 리소스로 간주할 수 있으며, 여러 Ingress 리소스가 이를 공유할 수도 있습니다. 마찬가지로, 커스텀 개발이 필요하지 않습니다.

Ingress Annotations 모드

Ingress 리소스의 제한된 의미론으로 인해, 일반적으로 annotations를 사용하여 리소스 객체에 추가 정보를 추가합니다. 이는 Ingress 기능을 확장하는 가장 일반적인 방법입니다. 예를 들어:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: apisix
    k8s.apisix.apache.org/enable-cors: "true"
    k8s.apisix.apache.org/cors-allow-origin: https://foo.com,https://bar.com
    k8s.apisix.apache.org/cors-allow-headers: x-foo-1,x-foo-2
    k8s.apisix.apache.org/cors-allow-methods: GET,POST,PUT
  name: apisix-ingress
spec:
  rules:
    - host: apisix.apache.org
      http:
        paths:
          - path: /apisix-ingress
            pathType: Exact
            backend:
              service:
                name: apisix-gateway
                port:
                  number: 80

위 설정은 Ingress 리소스에 CORS와 관련된 추가 정보를 추가합니다. APISIX Ingress 컨트롤러는 이 정보를 인식하고 데이터 계층의 설정으로 변환하여 Ingress 리소스의 기능을 확장할 수 있습니다.

그러나 이 모드에서는 APISIX Ingress 컨트롤러가 이러한 Annotations를 처리할 수 있어야 합니다. 그렇지 않으면 일부 커스텀 개발이 필요합니다.

커스텀 개발을 수행해야 하는 경우 다음 문서를 참조하세요:

결론

이 글은 주로 Ingress 리소스와 관련된 사양 및 Ingress 리소스의 기능을 확장하는 방법을 소개했습니다. 예를 들어, Ingress-NGINX에서는 일반적으로 Annotations를 사용하여 기능을 확장할 수 있습니다. 그러나 Apache APISIX Ingress에서는 고급 요구사항과 더 많은 시나리오를 충족하기 위해 세 가지 모드의 설정을 제공합니다. 또한 대부분의 경우 사용자는 커스텀 플러그인에 대해 커스텀 개발을 할 필요가 없습니다.

Tags: