Istio와 Amesh를 사용한 APISIX Service Mesh
June 16, 2023
Apache APISIX는 주로 북-남 트래픽을 처리하는 데 사용되며, 클라이언트 애플리케이션과 백엔드 서비스 사이의 경계에 위치합니다.
APISIX Ingress Controller를 사용하면 APISIX는 Kubernetes 클러스터 내에서 인그레스-이그레스 트래픽을 네이티브 구성으로 제어할 수도 있습니다.
하지만 조직이 마이크로서비스를 도입함에 따라, 이러한 마이크로서비스 간의 동-서 트래픽을 처리하는 새로운 과제가 생겼습니다.
Istio와 같은 서비스 메쉬는 마이크로서비스 개발자로부터 네트워킹 책임을 제거하고 추가적인 L4/L7 네트워킹 계층을 제공하여 이를 해결합니다.
새로운 Amesh 라이브러리와 Istio를 사용하면 Apache APISIX도 서비스 메쉬로 사용할 수 있습니다. 특히 Istio의 데이터 플레인으로 사용되어 모든 트래픽 관리 기능을 서비스 간 통신에 제공합니다.
이 글에서는 Amesh가 무엇인지, 어떻게 개발되었는지, 그리고 APISIX를 서비스 메쉬로 가져오는 데 어떻게 사용되는지 살펴보겠습니다.
Istio와 xDS 프로토콜
Istio는 가장 널리 사용되는 서비스 메쉬 중 하나입니다.
내부적으로 Istio는 사이드카 컨테이너에서 리버스 프록시로 Envoy를 사용합니다.
Istio는 Envoy의 xDS API를 사용하여 사이드카를 동적으로 구성하여 트래픽을 관리합니다.
xDS API는 정적 파일을 사용한 간단한 구성 대신 증분 변경으로 Envoy를 구성하는 방법입니다.
이 API는 처음에는 Envoy를 구성하기 위해 고안되었지만, 범용 데이터 플레인 API로 발전했습니다. 모든 데이터 플레인 프록시는 이 API를 구현할 수 있으며, 모든 컨트롤 플레인은 이 API를 사용하여 데이터 플레인 프록시와 작업할 수 있습니다.
Istio에서는 xDS API를 구현하는 모든 데이터 플레인으로 기본 Envoy 데이터 플레인을 대체할 수 있습니다. 따라서 Envoy를 APISIX로 대체하여 서비스 메쉬에서 트래픽 관리 기능을 얻을 수 있습니다.
하지만 APISIX는 기본적으로 xDS API를 지원하지 않습니다. 이때 Amesh가 등장합니다.
Amesh
Amesh는 Istio의 컨트롤 플레인에서 APISIX 구성으로 데이터를 변환하는 라이브러리입니다.
APISIX가 Istio의 데이터 플레인으로 Envoy를 대체합니다.
Istio는 xDS API를 통해 데이터 플레인과 통신합니다. Amesh는 이 API를 지원한 다음 APISIX 구성으로 변환합니다.
이는 APISIX와 APISIX Ingress 컨트롤러가 작동하는 방식과 유사합니다. Ingress 컨트롤러는 Ingress 또는 Gateway API를 사용하여 정의된 구성을 APISIX 형식으로 변환합니다.
xDS API는 Linkerd 및 Open Service Mesh와 같은 더 많은 서비스 메쉬에서 지원되므로, APISIX도 Amesh 라이브러리를 사용하여 이들과 함께 작동할 수 있습니다. Amesh는 아직 개발 초기 단계이며 현재 Istio v1.13.1과 함께 작동합니다.
Amesh + APISIX를 사용하면 Istio를 일반적으로 사용하는 것처럼 사용할 수 있습니다. Istio의 가상 서비스로 트래픽 규칙을 구성하면 APISIX가 이러한 규칙을 구현할 수 있습니다.
APISIX의 확장 기능은 80개 이상의 플러그인을 통해 제공됩니다. Istio와 함께 APISIX 플러그인을 사용하려면 Amesh 컨트롤 플레인 구성 요소인 Amesh 컨트롤러를 배포합니다.
Amesh 컨트롤러는 AmeshPluginConfig
CRD로 정의된 플러그인 구성을 가져와 APISIX 플러그인 구성으로 변환합니다.
이 모든 것은 사이드카 컨테이너 내에서 APISIX의 모든 기능을 활용할 수 있게 해줍니다.
APISIX + Istio 메쉬
이제 우리가 배운 모든 것을 실습해 보겠습니다.
Amesh 이미지를 빌드하고, Istio를 구성하여 APISIX 사이드카를 사용하도록 설정하고, Istio를 배포한 다음, 샘플 애플리케이션을 실행하여 모든 것을 테스트할 것입니다.
이미지 빌드
우리는 세 가지 이미지를 빌드할 것입니다:
- amesh-iptables: 모든 트래픽을 APISIX를 통해 전달하기 위해 일부 iptables 규칙을 설정하는 init 컨테이너를 생성하는 데 사용됩니다.
- amesh-sidecar: 사이드카 컨테이너를 생성하는 데 사용됩니다.
- amesh-controller: Amesh 컨트롤러 컨트롤 플레인 구성 요소를 생성하는 데 사용됩니다. 이 컨트롤러는 APISIX 플러그인을 구성하는 데 사용됩니다.
먼저 Amesh 저장소를 복제합니다:
git clone https://github.com/api7/Amesh.git
cd Amesh
이 이미지를 빌드하고 자신의 레지스트리로 푸시할 수 있습니다.
빌드를 실행하기 전에 환경 변수에 레지스트리 주소를 추가하세요:
export REGISTRY="docker.io/navendu"
make prepare-images
자신의 이미지를 빌드하지 않으려면 다음 이미지를 사용할 수 있습니다:
docker pull navendup/amesh-iptables:dev
docker pull navendup/amesh-sidecar:dev
docker pull navendup/amesh-controller:latest
Amesh 컨트롤러 배포 및 CRD 설치
Helm을 사용하여 Kubernetes 클러스터에 모든 것을 배포할 것입니다. 이 예제에서는 minikube를 사용합니다.
먼저 새로운 네임스페이스 istio-system
을 생성합니다:
kubectl create namespace istio-system
Amesh 컨트롤러를 배포하려면 다음을 실행합니다:
helm install amesh-controller -n istio-system \
./controller/charts/amesh-controller
또한 Amesh 컨트롤러와 함께 작업하기 위해 CRD를 설치해야 합니다:
kubectl apply -k controller/config/crd/
Istio + APISIX 구성 및 배포
서비스 메쉬를 배포하기 전에 몇 가지 환경 변수를 설정합니다:
export ISTIO_RELEASE=1.13.1
export REGISTRY="docker.io/navendup"
그런 다음 Helm을 사용하여 서비스 메쉬를 배포합니다:
helm install amesh \
--namespace istio-system \
--set pilot.image=istio/pilot:"$ISTIO_RELEASE" \
--set global.proxy.privileged=true \
--set global.proxy_init.image="$REGISTRY"/amesh-iptables:dev \
--set global.proxy.image="$REGISTRY"/amesh-sidecar:dev \
--set global.imagePullPolicy=IfNotPresent \
--set global.hub="docker.io/istio" \
--set global.tag="$ISTIO_RELEASE" \
./charts/amesh
이제 서비스 메쉬와 Amesh 컨트롤러가 배포되었습니다. 다음으로, 샘플 애플리케이션을 배포하여 서비스 메쉬를 테스트해 보겠습니다.
Bookinfo 배포
Istio의 Bookinfo 샘플 앱을 사용할 것입니다.
먼저 기본 네임스페이스에 레이블을 추가하여 네임스페이스 내의 모든 파드에 자동으로 사이드카를 주입하도록 합니다:
kubectl label ns default istio-injection=enabled
그런 다음 Bookinfo를 배포할 수 있습니다:
kubectl apply -f e2e/bookinfo/bookinfo.yaml
이렇게 하면 Bookinfo 애플리케이션이 시작되고 각 파드에는 APISIX 사이드카가 포함됩니다:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
details-v1-79f774bdb9-cbn87 2/2 Running 0 55s
productpage-v1-6b746f74dc-tntc8 2/2 Running 0 55s
ratings-v1-b6994bb9-r5j45 2/2 Running 0 55s
reviews-v1-545db77b95-n657s 2/2 Running 0 55s
reviews-v2-7bf8c9648f-zn97s 2/2 Running 0 55s
reviews-v3-84779c7bbc-wn8k2 2/2 Running 0 55s
메쉬 테스트
Bookinfo 애플리케이션에 접근하려면 인그레스 게이트웨이가 필요합니다.
이 인그레스 게이트웨이에 APISIX를 사용할 수 있지만, 이는 다른 시간에 다루겠습니다. 지금은 port-forward
를 사용하여 product-page
서비스에 접근할 수 있습니다:
kubectl port-forward productpage-v1-6b746f74dc-tntc8 9080:9080
이제 localhost:9080을 열면 샘플 애플리케이션을 볼 수 있습니다.
페이지를 새로고침할 때마다 리뷰 서비스의 다른 버전에서 리뷰를 가져옵니다(세 가지 버전을 배포했습니다).
이제 가상 서비스를 사용하여 모든 트래픽을 서비스의 v1 버전으로 라우팅하는 규칙을 적용해 보겠습니다.
이 규칙은 자명하며 다음과 같이 보일 것입니다:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: productpage
spec:
hosts:
- productpage
http:
- route:
- destination:
host: productpage
subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: ratings
spec:
hosts:
- ratings
http:
- route:
- destination:
host: ratings
subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: details
spec:
hosts:
- details
http:
- route:
- destination:
host: details
subset: v1
---
이 규칙을 클러스터에 적용하려면 다음을 실행합니다:
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.18/samples/bookinfo/networking/virtual-service-all-v1.yaml
이제 애플리케이션으로 돌아가서 새로고침하면 리뷰 서비스의 여러 버전을 순환하지 않고 v1 버전으로만 라우팅됩니다.
리뷰 섹션의 모양이 어떻게 바뀌었는지 주목하세요. 페이지를 새로고침해도 동일하게 유지됩니다.
요약하면, Istio에서 규칙을 구성하고 Istio는 Apache APISIX가 포함된 사이드카 컨테이너를 사용하여 이를 구현합니다. 깔끔하죠!
Amesh의 미래
Amesh는 실험적인 프로젝트이며 아직 초기 단계입니다.
프로젝트의 향후 버전은 가상 서비스를 통해 더 많은 기능을 지원하는 것을 목표로 합니다.
GitHub에서 프로젝트를 개선하거나 새 버전을 추적할 수 있습니다.