Amazon EKSとAPISIX Ingress Controllerが連携して複雑なトラフィックを管理する仕組み
API7.ai
February 7, 2021
背景
トラフィックマネージャーとして、予期せぬ事態に備えていても、予期せぬ事態を止めるのは難しいものです。四方向の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
Ingress APISIXのすべてのコンポーネント(Apache APISIXとapisix-ingress-controller)をデプロイするためにHelmを使用しますので、インストールガイドに従って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
上記のコマンドは、実際のトラフィックを処理するapisix-gateway
と、すべての設定変更を処理するコントロールプレーンとして機能するapisix-admin
という2つのKubernetes Serviceリソースを作成します。ここでは、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" } }
ServiceタイプがClusterIPの場合、Amazon EKSクラスター内のPodにログインし、ClusterIPまたはService FQDNを使用してApache APISIXにアクセスする必要があります。すでに公開されている場合(NodePortまたはLoadBalancerとして公開されている場合)、到達可能な外部エンドポイントに直接アクセスできます。
注:この記事はawsのWeChat公式サイトから転載されています。