API7 Cloud와 Kubernetes 서비스 디스커버리 통합
Yong Qian
February 24, 2023
비용 절감, 적응성, 확장성, 신뢰성 — 클라우드 기술과 컨테이너화의 폭발적인 성장은 전통적인 모놀리식 아키텍처에 비해 많은 이점을 가져왔습니다. 이러한 이점들은 많은 기업 사용자들에게 사랑받고 있습니다.
그러나 아키텍처의 변화는 새로운 도전도 함께 가져옵니다. 예를 들어, 전통적으로 리버스 프록시를 위한 업스트림 포워딩 IP 목록은 종종 변경되지 않으며 정적 구성 파일에 직접 작성될 수 있었습니다. 클라우드와 컨테이너화 시대에는 각 업스트림 서비스의 IP 목록이 지속적으로 변경됩니다. 정적 구성 파일을 계속 사용한다면 구성 파일의 유지 관리가 악몽이 될 것입니다. 구성 파일 업데이트의 적시성은 트래픽 포워딩에 직접적인 영향을 미치기 때문에, 사용자는 구성 파일의 자동 업데이트를 처리하기 위해 추가 소프트웨어를 도입해야 하며, 이는 아키텍처의 복잡성을 크게 증가시킵니다.
이 과정을 단순화하기 위해, API7 Cloud는 서비스 디스커버리 기능을 제공합니다. 이 기능은 Kubernetes API 서버에 직접 연결하여 실시간 Endpoints 데이터를 가져오며, 사용자가 Kubernetes 클러스터에 배포된 애플리케이션을 편리하게 프록시할 수 있도록 도와줍니다.
API7 Cloud의 서비스 디스커버리
준비
먼저, cloud-cli를 통해 APISIX 인스턴스를 배포해야 합니다. API7 Cloud 문서를 참조하세요: 게이트웨이 인스턴스 배포.
이 예제에서는 문서에 제공된 Kubernetes 배포 가이드를 사용하여 apisix
네임스페이스 아래에 다양한 리소스를 생성할 것입니다. 이 네임스페이스를 미리 생성해야 합니다:
kubectl create namespace apisix
cloud-cli deploy kubernetes \
--name my-apisix \
--namespace apisix \
--apisix-image apache/apisix:2.15.0-centos
서비스 계정 생성
서비스 계정은 Kubernetes가 RBAC(역할 기반 접근 제어)를 구현하기 위한 핵심 리소스입니다. API7 Cloud는 업스트림 서비스의 인스턴스 목록을 얻기 위해 Endpoints 리소스의 list
및 watch
권한이 필요합니다.
해당 yaml 구성은 다음과 같습니다:
# rbac.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: apisix-k8s-sd-watcher
rules:
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: apisix-k8s-sd-watcher-binding
subjects:
- kind: ServiceAccount
name: apisix-k8s-sd-sa
namespace: apisix
roleRef:
kind: ClusterRole
name: apisix-k8s-sd-watcher
apiGroup: rbac.authorization.k8s.io
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: apisix-k8s-sd-sa
namespace: apisix
서비스 계정을 생성하고 토큰을 얻습니다:
kubectl apply -f rbac.yaml
SECRET_NAME=`kubectl get sa -n apisix apisix-k8s-sd-sa -ojsonpath='{.secrets[0].name}'`
kubectl get secrets $SECRET_NAME -n apisix -ojsonpath='{.data.token}' | base64 -d
API7 Cloud에서 서비스 레지스트리 생성
Control Plane -> Settings -> Service Registry로 이동하여, 이전 단계에서 얻은 토큰을 사용하여 API7 Cloud에서 Kubernetes 타입의 서비스 레지스트리를 생성합니다 (API Server 주소는 사용 사례에 따라 작성해야 합니다). 이 예제에서는 APISIX도 대상 Kubernetes 클러스터에 배포되어 있으므로, 사용하는 API 서버 주소는 kubernetes.default.svc.cluster.local
입니다:
Kubernetes에 서비스 배포
Kubernetes 서비스 디스커버리의 효과를 검증하기 위해, HTTPBin 서비스의 세 개의 복제본을 배포하고 해당 서비스를 생성했습니다.
kubectl create deployment httpbin --image=kennethreitz/httpbin:latest --replicas=3 -n apisix
kubectl create service clusterip httpbin --tcp=80:80 -n apisix
API7 Cloud에서 애플리케이션 및 API 생성
테스트 애플리케이션을 배포한 후, API7 Cloud의 API Management -> Applications 페이지로 이동하여 Create Application 버튼을 클릭하여 새로운 애플리케이션을 생성합니다. 기본 구성은 다음과 같습니다:
sd.httpbin.org
를Host
로 설정/
를Path prefix
로 설정
중요한 부분은 업스트림을 Kubernetes와 방금 생성한 레지스트리를 사용하여 서비스 디스커버리를 사용하도록 구성하는 것입니다. 정적 IP 목록 대신:
다음으로, 애플리케이션에서 /anything
API를 생성하여 프록시를 테스트합니다:
프록시 테스트
먼저 port-forward
를 통해 데이터 플레인의 HTTP 포트를 로컬 머신에 매핑합니다:
kubectl port-forward -n apisix svc/apisix-gateway 9080:80
curl을 사용하여 대상 서비스에 요청합니다:
curl http://127.0.0.1:9080/anything -H 'Host: sd.httpbin.org' -i
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 373
Connection: keep-alive
Date: Mon, 09 Jan 2023 08:33:44 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Server: APISIX