標準の NGINX Ingress Controller は、複雑なトラフィックルーティング、Dubbo や QUIC などの複数のアプリケーション層プロトコル、またはレイヤー 7 のトラフィックバランシングをサポートしていません。MSE Ingress は、Alibaba Cloud Microservices Engine (MSE) のクラウドネイティブゲートウェイ上に構築された Ingress の実装です。NGINX Ingress および NGINX Ingress アノテーションと互換性があり、以下の機能によってこれらのギャップを解消します。
プロトコルサポート:HTTP/HTTPS に加えて、Dubbo、QUIC、その他のアプリケーション層プロトコルを処理します。
トラフィックガバナンス:複数のサービスバージョンに対するカナリアリリースと、柔軟なトラフィックルーティングルールを提供します。
セキュリティ保護:ゲートウェイレベルで組み込みのセキュリティ機能が含まれています。
高可用性:フルマネージドのマルチレプリカゲートウェイとして実行されます。
このトピックでは、MSE Ingress を設定して、外部トラフィックを Container Service for Kubernetes (ACK) クラスター内のアプリケーションにルーティングする方法について説明します。MSE Ingress とその仕組みの詳細については、「MSE Ingress の管理」をご参照ください。
前提条件
開始する前に、以下を確認してください。
MSE は有効化されています。MSE を有効化するには、MSE コンソールに移動します。
MSE Ingress Controller コンポーネントが ACK クラスターにインストールされていること。以下のいずれかの方法でインストールできます。
クラスター作成時: [コンポーネント設定] ステップで、[Ingress] に [MSE Ingress] を選択します
既存のクラスターの場合: [アドオン] ページでコンポーネントをインストールします。詳細については、「アドオンページで MSE Ingress コントローラー コンポーネントをインストールする」をご参照ください。
クラスターが Kubernetes v1.16 以降を実行していること。クラスターの作成については、「ACK マネージドクラスターの作成」または「ACK 専用クラスターの作成 (提供終了)」をご参照ください。既存のクラスターをアップグレードするには、「ACK クラスターの Kubernetes バージョンの更新」をご参照ください。
MSE Ingress Controller コンポーネントに権限が付与されていること。詳細については、「MSE Ingress Controller への権限付与」をご参照ください。
kubectl クライアントが ACK クラスターに接続されていること。詳細については、「クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。
ステップ 1:MSE クラウドネイティブゲートウェイの作成
MseIngressConfig は、MSE Ingress Controller によって提供されるカスタムリソース定義 (CRD) です。MSE クラウドネイティブゲートウェイのライフサイクルとグローバル設定を管理します。
1 つの MseIngressConfig は 1 つのクラウドネイティブゲートウェイにマッピングされます。複数のゲートウェイが必要な場合は、複数の MseIngressConfig を作成してください。MseIngressConfig を削除すると、再利用シナリオを除き、マッピングされたクラウドネイティブゲートウェイも削除されます。
次のコマンドを実行して、3 つのレプリカを持つ mse-ingress という名前のゲートウェイを作成します。各レプリカは 2 vCPU と 4 GB のメモリを使用します。
cat << EOF | kubectl apply -f -
apiVersion: mse.alibabacloud.com/v1alpha1
kind: MseIngressConfig
metadata:
name: test
spec:
name: mse-ingress # クラウドネイティブゲートウェイの名前
common:
instance:
spec: 2c4g # レプリカあたりの仕様 (デフォルト: 4c8g)。2 vCPU、4 GB メモリを意味します
replicas: 3 # ゲートウェイのレプリカ数 (デフォルト: 3)
EOFオプションの設定を省略すると、システムはデフォルト値を適用します。
vSwitch:MSE Ingress Controller によってスケジュールされた Kubernetes ノードの vSwitch を自動的に選択します。vSwitch は 1 つだけ設定されます。本番環境では、手動で 2 つの vSwitch を設定してください。
SLB:
slb.s2.small仕様のインターネット向け Server Load Balancer (SLB) インスタンスを自動的に作成します。セキュリティグループ:基本セキュリティグループを自動的に作成します。
spec のパラメーターを次の表に示します。
パラメーター | 必須 | デフォルト | 説明 |
| いいえ | - | クラウドネイティブゲートウェイの名前。 |
| いいえ |
| レプリカあたりの仕様。例えば、 |
| いいえ | 3 | ゲートウェイのレプリカ数。 |
完全なパラメーターリファレンスについては、「MseIngressConfig の設定」をご参照ください。
ステップ 2:IngressClass リソースの作成
IngressClass リソースは、どの Ingress コントローラーが一連の Ingress リソースを処理するかを宣言します。IngressClass をステップ 1 で作成した MseIngressConfig に関連付けることで、クラウドネイティブゲートウェイが一致する Ingress ルールを処理するようになります。
シナリオに応じて、次のいずれかの方法を選択してください。
方法 1:Kubernetes IngressClass リソースの使用 (推奨)
この方法は、MSE Ingress にアクセスする新しいサービスに使用します。クラスターの Kubernetes バージョンに基づいて、次のいずれかのコマンドを実行します。
Kubernetes バージョンが v1.19 より前のクラスター
cat << EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1beta1
kind: IngressClass
metadata:
name: mse
spec:
controller: mse.alibabacloud.com/ingress
parameters:
apiGroup: mse.alibabacloud.com # MseIngressConfig の API グループ
kind: MseIngressConfig # リソースの種類
name: test # ステップ 1 で作成した MseIngressConfig の名前
EOFKubernetes v1.19 以降を実行するクラスター
cat << EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: mse
spec:
controller: mse.alibabacloud.com/ingress
parameters:
apiGroup: mse.alibabacloud.com # MseIngressConfig の API グループ
kind: MseIngressConfig # リソースの種類
name: test # ステップ 1 で作成した MseIngressConfig の名前
EOF方法 2:MseIngressConfig リソースの使用 (移行用)
この方法は、NGINX Ingress から MSE Ingress に移行する場合、または IngressClass リソースを作成できないシナリオで使用します。移行中、NGINX Ingress と MSE Ingress の両方が同じ IngressClass リソースをリッスンする必要があります。この方法では、IngressClass を MseIngressConfig 内で直接設定できるため、IngressClass 名の競合を回避できます。
ステップ 1 で作成した MseIngressConfig に ingressClass フィールドを追加します。
apiVersion: mse.alibabacloud.com/v1alpha1
kind: MseIngressConfig
metadata:
name: test
spec:
name: mse-ingress
common:
instance:
spec: 2c4g
replicas: 3
ingress:
local:
ingressClass: mse # リッスンする IngressClass 名ingress.local.ingressClass の値を次の表に示します。
値 | 動作 |
未設定 | ゲートウェイはどの Ingress リソースもリッスンしません。 |
| ゲートウェイは |
| ゲートウェイはすべての Ingress リソースをリッスンします。 |
| ゲートウェイは |
その他の値 | ゲートウェイは指定された IngressClass に関連付けられた Ingress リソースをリッスンします。 |
Kubernetes IngressClass リソース (方法 1) とこのパラメーターの両方が設定されている場合、Kubernetes IngressClass リソースが優先されます。
ゲートウェイのステータスの確認
次のコマンドを実行して、MseIngressConfig のステータスを確認します。
kubectl get MseIngressConfig test期待される出力:
NAME STATUS AGE
test Listening 3m15sListening ステータスは、クラウドネイティブゲートウェイが実行中であり、mse IngressClass に関連付けられた Ingress リソースを監視していることを示します。
ステータスは次の順序で遷移します。
| ステータス | 説明 |
|---|---|
| Pending | ゲートウェイは作成中です。このプロセスには約 3 分かかります。 |
| Running | ゲートウェイが作成され、実行中です。 |
| Listening | ゲートウェイは実行中であり、クラスター内の Ingress リソースをリッスンしています。 |
| Failed | ゲートウェイは無効です。kubectl describe MseIngressConfig test を実行し、Status の Message フィールドを確認して原因を特定してください。 |
ステップ 3:アプリケーションへのトラフィックのルーティング
サンプルのバックエンドサービスのデプロイ
次のコマンドを実行して、go-httpbin サービスをデプロイします。
cat << EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: go-httpbin
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: go-httpbin
template:
metadata:
labels:
app: go-httpbin
version: v1
spec:
containers:
- image: specialyang/go-httpbin:v3
args:
- "--port=8090" # アプリケーションがリッスンするポート 8090
- "--version=v1" # バージョン v1 を報告
imagePullPolicy: Always
name: go-httpbin
ports:
- containerPort: 8090
---
apiVersion: v1
kind: Service
metadata:
name: go-httpbin
namespace: default
spec:
ports:
- port: 80 # Ingress に公開されるサービスポート
targetPort: 8090 # コンテナーポート 8090 に転送
protocol: TCP
selector:
app: go-httpbin
EOFIngress リソースの作成
次のいずれかのコマンドを実行して Ingress リソースを作成します。この Ingress は example.com/version へのリクエストを go-httpbin サービスにルーティングします。
Kubernetes バージョンが v1.19 より前のクラスター
cat << EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress
namespace: default
spec:
ingressClassName: mse # MSE IngressClass に関連付け
rules:
- host: example.com
http:
paths:
- path: /version
backend:
serviceName: go-httpbin
servicePort: 80
EOFKubernetes v1.19 以降を実行するクラスター
cat << EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress
namespace: default
spec:
ingressClassName: mse # MSE IngressClass に関連付け
rules:
- host: example.com
http:
paths:
- backend:
service:
name: go-httpbin
port:
number: 80
path: /version
pathType: Prefix
EOF結果の確認
Ingress に割り当てられたアドレスを取得します。期待される出力:
kubectl get ingress ingressNAME CLASS HOSTS ADDRESS PORTS AGE ingress mse example.com 114.55.XX.XX 80 12mIngress アドレスを使用してテストリクエストを送信します。期待される出力:
version:v1のレスポンスは、トラフィックが MSE Ingress を経由してgo-httpbinバックエンドサービスにルーティングされたことを示します。curl -H "host: example.com" <ADDRESS>/versionversion:v1
ADDRESS フィールドが空の場合、クラウドネイティブゲートウェイがまだプロビジョニング中の可能性があります。数分待ってから kubectl get ingress ingress を再度実行してください。問題が解決しない場合は、kubectl describe MseIngressConfig test で MseIngressConfig のステータスを確認してください。
リソースのクリーンアップ
このチュートリアルで作成したサンプルリソースを削除するには、次のコマンドを実行します。
kubectl delete ingress ingress
kubectl delete service go-httpbin
kubectl delete deployment go-httpbinMseIngressConfig を削除すると、関連付けられた MSE クラウドネイティブゲートウェイも削除されます。ゲートウェイが不要になった場合にのみ削除してください。
kubectl delete MseIngressConfig test次のステップ
MseIngressConfig を設定する:ゲートウェイの vSwitch、SLB インスタンス、セキュリティグループをカスタマイズします。
MSE Ingress の管理 -- カナリアリリースやトラフィック分割などの高度なトラフィックガバナンス機能について学習します。
MSE Ingress コントローラーへの権限付与 — MSE Ingress コントローラー向けに詳細なアクセスの制御を設定します。