Amazon EKS와 APISIX Ingress Controller가 복잡한 트래픽을 관리하기 위해 함께 작동하는 방법
API7.ai
February 7, 2021
배경
트래픽 관리자로서, 때로는 예상치 못한 상황에 대비하더라도 예상치 못한 일을 막기란 어렵습니다. 4방향 API 게이트웨이를 구축하는 것이 중요합니다! 오늘 **Amazon EKS + Ingress APISIX!**가 이를 어떻게 도울 수 있는지 알아보겠습니다.
소개
Kubernetes는 컨테이너화된 애플리케이션의 배포, 확장 및 관리를 자동화하기 위한 오픈 소스 시스템입니다. Amazon Elastic Kubernetes Service (Amazon EKS)는 관리형 Kubernetes 서비스로, Amazon Cloud Technologies에서 Kubernetes 작업을 쉽게 실행할 수 있도록 하며, 컨트롤 플레인이나 노드 설치 및 유지보수가 필요하지 않습니다.
Apache APISIX는 동적, 실시간, 고성능 API 게이트웨이입니다. 로드 밸런싱, 동적 업스트림, 그레이스케일 배포, 트래픽 분할, 인증 및 관찰 가능성과 같은 풍부한 트래픽 관리 기능을 제공합니다. Apache APISIX를 사용하여 전통적인 클라이언트와 서버 간의 남북 트래픽뿐만 아니라 서비스 간의 동서 트래픽도 처리할 수 있습니다.
Ingress APISIX는 Kubernetes의 진입 컨트롤러로 사용될 수 있으며, Apache APISIX의 최고의 기능을 Kubernetes에 도입합니다. 이는 잘 설계된 Controller 컴포넌트에 의해 구동되어 복잡한 트래픽 관리 요구를 충족하는 데 도움을 줄 수 있습니다.
Amazon Elastic Kubernetes Service에서 Ingress APISIX 구성 및 실행 방법
필수 조건
실행 준비를 하기 전에, Amazon CloudTech에서 사용 가능한 Amazon EKS 클러스터를 구성하세요.
자신의 환경에 kubectl 도구가 있어야 하며, 다음 명령을 실행하여 컨텍스트를 자신의 Amazon EKS 클러스터로 설정하세요:
aws eks update-kubeconfig --name --region
Kubernetes 클러스터가 준비되면, ingress-apisix라는 네임스페이스를 생성하세요. 여기에 사용될 모든 리소스가 생성될 것입니다.
kubectl create namespace ingress-apisix
Helm을 사용하여 Ingress APISIX의 모든 컴포넌트(Apache APISIX 및 apisix-ingress-controller)를 배포할 것이므로, 설치 가이드를 따라 Helm도 설치하세요. Apache APISIX 및 apisix-ingress-controller의 Helm 차트는 apache/apisix-helm-chart와 apache/apisix-ingress-controller에 위치해 있으며, 해당 차트를 얻기 위해 이러한 경로를 복제하세요.
Apache APISIX 설치
Apache APISIX는 apisix-ingress-controller의 프록시 플레인 역할을 하며, 미리 배포되어야 합니다.
cd /path/to/apisix-helm-chart
helm repo add bitnami https://charts.bitnami.com/bitnami
helm dependency update . /chart/apisix
helm install apisix . /chart/apisix \
--set gateway.type=LoadBalancer \
--set allow.ipList="{0.0.0.0/0}" \
--namespace ingress-apisix
kubectl get service --namespace ingress-apisix
위 명령은 두 개의 Kubernetes 서비스 리소스, 실제 트래픽을 처리하는 apisix-gateway와 모든 구성 변경을 처리하는 컨트롤 플레인 역할을 하는 apisix-admin을 생성합니다. 여기서 apisix-gateway를 LoadBalancer 유형의 서비스로 생성하여 Amazon Network Load Balancer의 도움으로 인터넷에 노출할 수 있습니다. 다음 명령으로 로드 밸런서의 호스트 이름을 찾을 수 있습니다:
kubectl get service apisix-gateway \
--namespace ingress-apisix \
-o jsonpath='{.status.loadBalancer.ingress[].hostname}'
또한 주의할 점: allow.ipList 필드는 자신의 Amazon EKS 클러스터의 EKS CIDR 범위에 맞게 조정되어야 하며, 이렇게 하면 apisix-ingress-controller가 Apache APISIX에 의해 라이선스될 수 있습니다(리소스 푸시를 위해).
추가 요구 사항이 있는 경우, 모든 구성 항목에 대한 자세한 정보는 value.yaml을 참조하세요.
apisix-ingress-controller 설치
Apache APISIX를 성공적으로 배포한 후, 이제 Controller 컴포넌트를 설치할 시간입니다.
cd /path/to/apisix-ingress-controller
# 기본 리소스 설치, 예: ServiceAccount.
helm install ingress-apisix-base -n ingress-apisix . /charts/base
# apisix-ingress-controller 설치
helm install ingress-apisix . /charts/ingress-apisix \
--set ingressController.image.tag=dev \
--set ingressController.config.apisix.baseURL=http://apisix-admin:9180/apisix/admin \
--set ingressController.config.apisix.adminKey={YOUR ADMIN KEY} \
--namespace ingress-apisix
ingress-apisix-base 차트는 apisix-ingress-controller를 위한 몇 가지 기본 종속성(예: ServiceAccount 및 전용 CRD)을 설치합니다.
ingress-apisix 차트는 Controller 자체의 설치를 안내하며, 원하는 릴리스로 이미지 태그를 변경할 수 있고, 위 명령에서 ingressController.config.apisix.adminKey의 값을 변경할 수 있습니다. 이러한 구성은 실제 시나리오에 따라 조정될 수 있으며(여기서 사용된 Admin 키가 Apache APISIX 배포에서 사용된 키와 동일한지 확인), 다른 요구 사항이 있는 경우 value.yaml을 참조하여 모든 구성 항목에 대해 더 알아볼 수 있습니다.
그런 다음 Amazon EKS 콘솔을 열고 클러스터를 선택한 후 Workloads 탭을 클릭하면 Apache APISIX를 위한 모든 Pod, etcd 및 apisix-ingress-controller가 준비된 것을 볼 수 있습니다.
테스트 시작
이 시점에서 Ingress APISIX의 모든 컴포넌트를 배포했으므로 모든 것이 제대로 작동하는지 확인하세요. 그런 다음 httpbin 서비스를 배포하고 Apache APISIX가 "local.httpbin.org" 호스트에 대한 모든 요청을 이 서비스로 라우팅하도록 요청할 것입니다.
이를 위해 먼저 httpbin 워크로드를 생성하고 노출해야 합니다.
kubectl run httpbin --image kennethreitz/httpbin --port 80
kubectl expose pod httpbin --port 80
Apache APISIX가 요청을 올바르게 라우팅하도록 하기 위해, ApisixRoute 리소스를 생성하여 이 프로세스를 구동해야 합니다.
# ar-httpbin.yaml
apiVersion: apisix.apache.org/v1
kind: ApisixRoute
metadata:
name: httpserver-route
spec:
rules:
- host: local.httpbin.org
http:
paths:
- backend:
serviceName: httpbin
servicePort: 80
path: /*
위의 ApisixRoute 리소스는 Apache APISIX가 "local.httpbin.org" 호스트 헤더를 가진 요청을 방금 생성한 httpbin 백엔드로 라우팅하도록 허용합니다.
그런 다음 이 설정을 적용하지만, 서비스와 ApisixRoute 리소스는 동일한 네임스페이스에 위치해야 하며, apisix-ingress-controller는 네임스페이스를 넘어갈 수 없습니다.
kubectl apply -f ar-httpbin.yaml
Apache APISIX 서비스에 도달할 수 있는 곳에서 간단한 curl 호출로 결과를 테스트하세요.
$ curl http://{apisix-gateway-ip}:{apisix-gateway-port}/headers -s -H 'Host: local.httpbin.org'
{
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"User-Agent": "curl/7.64.1",
"X-Amzn-Trace-Id": "Root=1-5ffc3273-2928e0844e19c9810d1bbd8a"
}
}
Serivce 유형이 ClusterIP인 경우, Amazon EKS 클러스터의 Pod에 로그인한 후 ClusterIP 또는 Service FQDN을 사용하여 Apache APISIX에 접근해야 합니다. 이미 노출된 경우(NodePort 또는 LoadBalancer로 노출된 경우), 도달 가능한 외부 엔드포인트에 직접 접근할 수 있습니다.
참고: 이 글은 aws WeChat 공개 웹사이트에서 재인쇄되었습니다.