API7 Cloud 与 Kubernetes 服务发现集成
Yong Qian
February 24, 2023
コスト削減、適応性、スケーラビリティ、信頼性 — クラウド技術とコンテナ化の爆発的な普及により、従来のモノリシックアーキテクチャに比べて多くの利点がもたらされました。これらの利点により、多くの企業ユーザーに支持されています。
しかし、アーキテクチャの変化に伴い、新たな課題も生じています。例えば、従来、リバースプロキシのアップストリーム転送IPリストは変更されることが少なく、静的な設定ファイルに直接記述することができました。クラウドとコンテナ化の時代では、各アップストリームサービスのIPリストが常に変化します。静的な設定ファイルを引き続き使用する場合、設定ファイルのメンテナンスは悪夢となります。設定ファイルの更新のタイムリーさがトラフィック転送に直接影響するため、ユーザーは設定ファイルの自動更新を処理するために追加のソフトウェアを導入せざるを得ず、アーキテクチャの複雑さが大幅に増加します。
このプロセスを簡素化するため、API7 Cloudはサービスディスカバリ機能を提供し、Kubernetes API Serverに直接接続してリアルタイムの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サービスの3つのレプリカをデプロイし、対応するServiceを作成しました。
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ボタンをクリックして新しいアプリケーションを作成します。基本的な設定は以下の通りです:
Host
としてsd.httpbin.org
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