FIXER cloud.config Tech Blog
KubernetesネイティブなAPIゲートウェイ、Emissary-Ingressをローカルで動かす
2025年05月16日 17時00分更新
本記事はFIXERが提供する「cloud.config Tech Blog」に掲載された「Emissary-Ingress をローカルで動かしてみた」を再編集したものです。
はじめに
Emissary-Ingress とはトラフィックルーティングやロードバランシングなどの機能を提供する、Envoy Proxy ベースの Kubernetes ネイティブな API Gateway です。また、Emissary-Ingress は CNCF プロジェクトにて2021年4月13日にIncubating レベルのプロジェクトと認定されたプロジェクトです。
Emissary-Ingress was accepted to CNCF on April 13, 2021 at the Incubating maturity level.
本記事では、Emissary-Ingress quick start を参考に、Minikube を使用してローカル環境の Kubernetes クラスターに Emissary-Ingress をセットアップし、簡単なデモアプリケーションへのルーティングを設定する手順を試します。
想定されるインフラ構成は下図のとおりです。
前提条件
・Kubernetes クラスター v1.32.0
・Minikube v1.35.0
・kubectl v1.33.0
・Helm v3.17.3
・Emissary-Ingress の Helm Chart v8.12.2
・Emissary-Ingress の アプリケーション v3.12.2
1. Kubernetes クラスターの起動
Minikube を使用して下記のコマンドを実行し、Kubernetes クラスターを起動します。
今回は driver に docker を選択することにします。
$ minikube start --driver=docker
起動が完了したら、
$ kubectl config current-context
を実行して、接続先のクラスターが Minikube のクラスターとなっていることを確認します。
確認ができたら、別のウィンドウのシェルで下記のコマンドを実行します。
$ minikube tunnel
このコマンドを実行しないと以降の手順で Emissary-Ingress を起動しても下記の通り、EXTERNAL_IP が pending 状態で、公開 IP が割り当てられなくなってしまうので注意する必要があります。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
emissary-ingress LoadBalancer ${CLUSTER-IP} 80:30753/TCP,443:30383/TCP Xs
2. Emissary-Ingressのインストール
Helm を使用して Emissary-Ingress をインストールします。
# ローカルに Emissary-Ingress のリポジトリへの紐付けを追加する。
$ helm repo add datawire https://app.getambassador.io
$ helm repo update
# 名前空間の追加とCRDのインストール
$ kubectl create namespace emissary && kubectl apply -f https://app.getambassador.io/yaml/emissary/3.9.1/emissary-crds.yaml
$ kubectl wait --timeout=90s --for=condition=available deployment emissary-apiext -n emissary-system
# Emissary-Ingress のインストール
$ helm install emissary-ingress --namespace emissary datawire/emissary-ingress && kubectl -n emissary wait --for condition=available --timeout=90s deploy -lapp.kubernetes.io/instance=emissary-ingress
ここまで完了すると Emissary-Ingress の本体の起動と Emissary-Ingress が使用する CRD のインストールが完了します。
3. トラフィックルーティングの設定
Emissary-Ingress は、Kubernetes Custom Resource Definitions (CRDs)を使用して設定を行います。まず、HTTP通信を受け付けるための Listener リソースを作成します。
この Listener は、クラスター内のすべてのHost と関連付けられ、ポート 8080 で HTTP リクエストを受け付けるように設定されています。
kubectl apply 時に使用するマニフェストはHere Document を使用する意外に、マニフェストファイルとして設定を記述し、そのファイルを読み込むことで Listener を作成することも可能です。
4. デモアプリケーションのデプロイ
次に、「Quote」というデモサービスをデプロイします。
$ kubectl apply -f https://app.getambassador.io/yaml/v2-docs/3.9.1/quickstart/qotm.yaml
上記コマンドにて、サービスとデプロイメントがデフォルト名前空間に作成されます。
実際に、以下のコマンドで実行することでこれらの状態を確認することが可能です。
$ kubectl get services,deployments quote
5. Mapping リソースの作成
Emissary-Ingress に、/backend/ パスへのリクエストを Quote サービスにルーティングする Mapping リソースを作成します。
これで事前の準備が完了しました。
実際にローカル環境で Emissary-Ingress へアクセスをして動作確認をします。
6. サービスへのアクセス
以下のコマンドを実行して、ステータスコード 200 がレスポンスとして得ることができればローカルで Emissary-Ingress を動かしてみる作業は完了です。
# 実行コマンド
$ curl -i http://localhost/backend/
# レスポンス(返されるデータはリクエストごとに異なります)
HTTP/1.1 200 OK
content-type: application/json
date: Mon, 28 Apr 2025 15:16:47 GMT
content-length: 140
x-envoy-upstream-service-time: 25
server: envoy
{
"server": "mirthful-blackberry-4wk3ol8l",
"quote": "A small mercy is nothing at all?",
"time": "2025-04-28T15:16:47.205112Z"
}
まとめ
今回は Emissary-Ingress を Minikube を使用したローカル環境の Kubernetes クラスターにインストールし、簡単なルーティング設定を行いました。Emissary-Ingressには、非常に高度な Kubernetes ネイティブ API Gateway ソリューションを提供しています。
そのため、実際に本番環境で使用する場合には、以下を一例とした高度な機能の設定追加を検討することが可能です。
・TLS/SSL証明書の設定
・認証・認可の設定
・レート制限
・サーキットブレーカー
Emissary-Ingressは、これらの機能をサポートしており、マイクロサービスアーキテクチャにおけるエッジプロキシとして非常に優れた選択肢になると考えられました。
使用機会があれば、ぜひ本番環境 Emissary-Ingress を使用してみたいと思います。
参考リンク
・Ambassador 公式ドキュメント | Emissary-ingress
・Ambassador 公式ドキュメント | Emissary ingress quick start
・CNCF | Emissary-Ingress
・GitHub リポジトリ | emissary-ingress/emissary
・ArtifactHUB | emissary-ingress
中島 悠太/FIXER
2023年度新卒で入社。エンジニア1年生。
社内での担当はまだ未定。
社外では42Tokyoという場所でエンジニアとしてのスキルを研鑽しています。


この連載の記事
-
TECH
同世代エンジニアに刺激を受けた!JAWS-UG「若手エンジニア応援LT会」参加レポート -
TECH
AWS EC2でkubeadmを用いたKubernetesクラスターを作ってみたのでメモ -
TECH
CX視点で興味深かった「AWS Summit Japan 2024」のセッション -
TECH
IAMユーザーのアクセスキーを使わず「IAMロール」を使うべき理由 -
TECH
Amazon BedrockからWeb上のコンテンツを参照する新機能「Web Crawler」 -
TECH
Amazon SESでEメールの送信機能/受信機能を作る手順 -
TECH
Terraform:変数の値が未代入でもインタラクティブな入力を回避する方法 -
TECH
ノーコードで生成AI連携! SlackからAmazon Bedrockのエージェントに質問 -
TECH
AWS CDKでGuardDutyのRDS保護を有効化しよう(として詰みかけた話) -
TECH
AWSアカウントのサインインに「IAM Identity Center」をお勧めする理由 -
TECH
AWS CDKとGitHubを使ったIaC=インフラ構成管理の基本 - この連載の一覧へ