【Kubernetes】Gateway API と HTTPRoute を使った実践ルーティング入門
Kubernetesでの次世代インジェス(Ingress)として注目されている「Gateway API」。従来のIngressよりも柔軟で、かつ拡張性が高いルーティング制御が可能になります。
今回は、KillercodaのPlayground環境をベースに、Gateway と HTTPRoute を使って「/desktop」と「/mobile」のパスに応じてトラフィックを別々のサービス(Pod)に振り分けるハンズオンを解説します。
💡 前提条件 本記事では
alias k="kubectl"を設定した状態でコマンドを記載しています。エイリアスを設定していない方は、適宜kをkubectlに読み替えて実行してください。
記事の目次
Step 1: デプロイメント(Deployment)の作成
まずは、ルーティング先となる2つのアプリケーション(desktop用とmobile用)のDeploymentを作成します。
1.desktop用 Deploymentの作成
以下の内容を desctop-deploy.yaml という名前で保存します。
vi desctop-deploy.yamlapiVersion: apps/v1
kind: Deployment
metadata:
name: desktop-app
spec:
replicas: 1
selector:
matchLabels:
app: desktop
template:
metadata:
labels:
app: desktop
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
command: ["/bin/sh", "-c"]
args:
- |
echo "hello desktop" > /usr/share/nginx/html/index.html;
nginx -g 'daemon off;'保存したら、マニフェストを適用します。
k apply -f desctop-deploy.yaml
2. mobile用 Deploymentの作成
続いて、以下の内容を mobile-deploy.yaml という名前で保存します。
vi mobile-deploy.yamlapiVersion: apps/v1
kind: Deployment
metadata:
name: mobile-app
spec:
replicas: 1
selector:
matchLabels:
app: mobile
template:
metadata:
labels:
app: mobile
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
command: ["/bin/sh", "-c"]
args:
- |
echo "hello mobile" > /usr/share/nginx/html/index.html;
nginx -g 'daemon off;'マニフェストを適用します。
k apply -f mobile-deploy.yaml
3. 作成の確認
Deploymentが正常に作成されたか確認しましょう。
k get deploy
Step 2: サービス(Service)の作成
次に、作成した各Deploymentをクラスター内部から呼び出せるように、Service(SVC)を作成します。ここでは kubectl expose コマンドを使って手軽に作成します。
desktop-appのSVCを作成
k expose deploy desktop-app --port=80 --name=desktop-svcmobile-appのSVCを作成
k expose deploy mobile-app --port=80 --name=mobile-svc
動作確認(curlで検証)
確認用の使い捨てPod(tmp)を起動し、内部から各Serviceにアクセスできるか確認します。
k run tmp --image=nginx:alpine --restart=Never --rm -it -- shPod内のシェルに入ったら、以下の curl コマンドを実行してみてください。
# 確認用コマンド
curl desktop-svc
curl mobile-svc
Step 3: Gatewayのインストールと作成
Gateway APIを利用するためには、環境に GatewayClass(CRD) と Gateway Controller が必要です。
通常、標準環境には含まれていないため、以下の手順でインストールを行います。(※すでにインストール済みの方はスキップして構いません)
まずは、現状の確認コマンドを入力してみます。
kubectl get gatewayclass
この段階でエラーになる、もしくはリソースが存在しない場合は、以下の手順を進めてください。
1. GatewayClass(CRD)のインストール
Gateway API 公式ドキュメントに準拠し、標準のインストールマニフェストを適用します。
kubectl apply --server-side -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.4.1/standard-install.yaml
適応後、再度確認します。
kubectl get gatewayclass
これでCRDが認識されるようになります。
2. Gateway Controller(NGINX Gateway Fabric)のインストール
CRDを登録しただけでは動作しないため、次にコントローラーを導入します。今回は NGINX Gateway Fabricを Helm 経由でインストールします。
helm install ngf oci://ghcr.io/nginx/charts/nginx-gateway-fabric --create-namespace -n nginx-gateway
インストール完了後、GatewayClass がコントローラーによって認識されているか確認します。
kubectl get gatewayclass3. Gatewayリソースの作成
準備が整ったので、いよいよ Gateway を作成していきます。
vi gateway.yamlapiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: sample-gateway
spec:
gatewayClassName: nginx
listeners:
- name: http
protocol: HTTP
port: 30080
hostname: test.gatewayマニフェストを適用します。
k apply -f gateway.yaml
適用後、状態を確認します。
k get gateway
Step 4: HTTPRouteを作成して振り分け(ルーティング)設定を行う
最後に、パス(/desktop と /mobile)に応じてトラフィックをそれぞれのServiceへ振り分けるための HTTPRoute リソースを作成します。
vi httproute.yamlapiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: sample-httproute
spec:
parentRefs:
- name: sample-gateway
hostnames:
- test.gateway
rules:
- matches:
- path:
type: PathPrefix
value: /desktop
backendRefs:
- name: desktop-svc
port: 80
- matches:
- path:
type: PathPrefix
value: /mobile
backendRefs:
- name: mobile-svc
port: 80マニフェストを適用します。
k apply -f httproute.yaml最終確認
正常にルーティングが設定されたか確認を行います。
k get httproute
設定した test.gateway:30080/desktop や test.gateway:30080/mobile に対し外部またはテスト用環境からリクエストを送信することで、Gateway APIを介したキレイなパスベースルーティングが確認できるはずです。
まとめ
従来のIngressと異なり、Gateway(インフラ設定)と HTTPRoute(ルーティング設定)が分離されたことで、エンジニア間の役割分担や管理がとてもスマートに行えるのがGateway APIの強みです。
ぜひ今回のハンズオンを参考に、実際の運用の現場でも試してみてください!
- タグ:
- kubernetes