DigitalOceanKubernetesでAmbassadorを使用してAPIゲートウェイを作成する方法
著者は、 Write for DOnations プログラムの一環として、 Free and Open SourceFundを選択して寄付を受け取りました。
序章
Ambassador は、クラウドネイティブアプリケーション用のAPIゲートウェイであり、異種サービス間でトラフィックをルーティングし、分散型ワークフローを維持します。 単一のエントリポイントとして機能し、サービスディスカバリ、構成管理、ルーティングルール、レート制限などのタスクをサポートします。 それはあなたのサービスに大きな柔軟性と設定の容易さを提供します。
Envoy は、クラウドネイティブアプリケーション向けに設計されたオープンソースのサービスプロキシです。 Kubernetesでは、Ambassadorを使用してEnvoy構成をインストールおよび管理できます。 Ambassadorは、ダウンタイムなしの構成変更と、認証、サービスディスカバリ、サービスメッシュなどの他の機能との統合をサポートします。
このチュートリアルでは、Helmを使用してKubernetesクラスターにAmbassador API Gatewayをセットアップし、ルーティングルールに基づいて着信トラフィックをさまざまなサービスにルーティングするように構成します。 ホスト名または関連するサービスへのパスに基づいてトラフィックをルーティングするように、これらのルールを構成します。
前提条件
このガイドを開始する前に、次のものが必要です。
-
kubectlが構成されたDigitalOceanKubernetesクラスター。 DigitalOceanでKubernetesクラスタを作成するには、Kubernetesクイックスタートをご覧ください。
-
ローカルマシンにインストールされているHelmパッケージマネージャーと、クラスターにインストールされているTiller。 HelmPackageManagerを使用してKubernetesクラスターにソフトウェアをインストールする方法のステップ1と2を完了します
-
少なくとも2つのAレコードが構成された完全に登録されたドメイン名。 このチュートリアルでは、全体を通して
svc1.your-domain
、svc2.your-domain
、およびsvc3.your-domain
を使用します。 DNSクイックスタートに従って、DigitalOceanにレコードを設定できます。
ステップ1—アンバサダーのインストール
このセクションでは、KubernetesクラスターにAmbassadorをインストールします。 Ambassadorは、Helmチャートを使用するか、YAML構成ファイルをkubectl
コマンドに渡すことでインストールできます。
注:DigitalOceanKubernetesではデフォルトでRBACが有効になっているため、インストールにYAML構成ファイルを使用する場合は、RBACが有効な構成ファイルを使用する必要があります。 Ambassadorのドキュメントで、YAMLを介したAmabassadorのKubernetesへのデプロイの詳細を確認できます。
このチュートリアルでは、 Helm チャートを使用して、Ambassadorをクラスターにインストールします。 前提条件を満たしたら、Helmをクラスターにインストールします。
まず、次のコマンドを実行して、Helm経由でAmbassadorをインストールします。
- helm upgrade --install --wait ambassador stable/ambassador
次のような出力が表示されます。
OutputRelease "ambassador" does not exist. Installing it now.
NAME: ambassador
LAST DEPLOYED: Tue Jun 18 02:15:00 2019
NAMESPACE: default
STATUS: DEPLOYED
RESOURCES:
==> v1/Deployment
NAME READY UP-TO-DATE AVAILABLE AGE
ambassador 3/3 3 3 2m39s
==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
ambassador-7d55c468cb-4gpq9 1/1 Running 0 2m38s
ambassador-7d55c468cb-jr9zr 1/1 Running 0 2m38s
ambassador-7d55c468cb-zhm7l 1/1 Running 0 2m38s
==> v1/Service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ambassador LoadBalancer 10.245.183.114 139.59.52.164 80:30001/TCP,443:31557/TCP 2m40s
ambassador-admins ClusterIP 10.245.46.43 <none> 8877/TCP 2m41s
==> v1/ServiceAccount
NAME SECRETS AGE
ambassador 1 2m43s
==> v1beta1/ClusterRole
NAME AGE
ambassador 2m41s
==> v1beta1/ClusterRoleBinding
NAME AGE
ambassador 2m41s
==> v1beta1/CustomResourceDefinition
NAME AGE
authservices.getambassador.io 2m42s
consulresolvers.getambassador.io 2m41s
kubernetesendpointresolvers.getambassador.io 2m42s
kubernetesserviceresolvers.getambassador.io 2m43s
mappings.getambassador.io 2m41s
modules.getambassador.io 2m41s
ratelimitservices.getambassador.io 2m42s
tcpmappings.getambassador.io 2m41s
tlscontexts.getambassador.io 2m42s
tracingservices.getambassador.io 2m43s
. . .
これにより、Kubernetesクラスターノードが接続されたAmbassadorデプロイメント、サービス、およびロードバランサーが作成されます。 ドメインのAレコードにマップするには、ロードバランサーのIPが必要です。
アンバサダーロードバランサーのIPアドレスを取得するには、次のコマンドを実行します。
- kubectl get svc --namespace default ambassador
次のような出力が表示されます。
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ambassador LoadBalancer your_cluster_IP your-IP-address 80:30001/TCP,443:31557/TCP 8m4s
この手順で外部IPyour-IP-address
をメモし、ドメインを(ドメインプロバイダー経由で)svc1.your-domain
、svc2.your-domain
、およびsvc3.your-domain
をマップしてこのIPアドレスを指すようにします。 。
SSLターミネーションの構成方法に記載されている手順を使用して、DigitalOceanロードバランサーでHTTPSを有効にできます。 ロードバランサーを介してTLSターミネーションを構成することをお勧めします。 TLSターミネーションを設定する別の方法は、AmbassadorのTLSサポートを使用することです。
Helmを使用してKubernetesクラスターにAmbassadorをインストールしました。これにより、デフォルトの名前空間に3つのレプリカを持つAmbassadorデプロイメントが作成されました。 これにより、すべてのトラフィックをAPIGatewayにルーティングするためのパブリックIPを備えたロードバランサーも作成されました。 次に、このAPIゲートウェイのテストに使用する3つの異なるサービスのKubernetesデプロイを作成します。
ステップ2—Webサーバー展開のセットアップ
このセクションでは、3つの異なるWebサーバーコンテナーを実行するための3つのデプロイメントを作成します。 3つの異なるウェブサーバーコンテナのKubernetesデプロイの定義を使用してYAMLファイルを作成し、kubectl
を使用してデプロイします。
好みのテキストエディタを開いて、NginxWebサーバーの最初のデプロイメントを作成します。
- nano svc1-deploy.yaml
ファイルに次のyaml構成を入力します。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: svc1
spec:
replicas: 1
selector:
matchLabels:
app: nginx
name: svc1
strategy:
type: RollingUpdate
template:
metadata:
labels:
app: nginx
name: svc1
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- name: http
containerPort: 80
ここでは、[X118X]