API7 Cloud 与 Kubernetes 服务发现集成

Yong Qian

February 24, 2023

Products

コスト削減、適応性、スケーラビリティ、信頼性 — クラウド技術とコンテナ化の爆発的な普及により、従来のモノリシックアーキテクチャに比べて多くの利点がもたらされました。これらの利点により、多くの企業ユーザーに支持されています。

しかし、アーキテクチャの変化に伴い、新たな課題も生じています。例えば、従来、リバースプロキシのアップストリーム転送IPリストは変更されることが少なく、静的な設定ファイルに直接記述することができました。クラウドとコンテナ化の時代では、各アップストリームサービスのIPリストが常に変化します。静的な設定ファイルを引き続き使用する場合、設定ファイルのメンテナンスは悪夢となります。設定ファイルの更新のタイムリーさがトラフィック転送に直接影響するため、ユーザーは設定ファイルの自動更新を処理するために追加のソフトウェアを導入せざるを得ず、アーキテクチャの複雑さが大幅に増加します。

このプロセスを簡素化するため、API7 Cloudサービスディスカバリ機能を提供し、Kubernetes API Serverに直接接続してリアルタイムのEndpointsデータを取得し、ユーザーがKubernetesクラスタにデプロイされたアプリケーションを簡単にプロキシできるようにします。

API7 Cloudのサービスディスカバリ

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です:

API7 Cloudでサービスレジストリを作成

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

httpbinサービスの作成

API7 CloudでアプリケーションとAPIを作成

テストアプリケーションをデプロイした後、API7 CloudのAPI Management -> Applicationsページに移動し、Create Applicationボタンをクリックして新しいアプリケーションを作成します。基本的な設定は以下の通りです:

  • Hostとしてsd.httpbin.org
  • Path prefixとして/

重要な部分は、アップストリームをKubernetesと先ほど作成したレジストリを使用してサービスディスカバリを行うように設定し、静的なIPリストを使用しないようにすることです:

静的IPリストの代わりにサービスディスカバリ

次に、アプリケーション内に/anything APIを作成し、プロキシのテストを行います:

/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
Tags: