クラスター間トラフィックミラーリングは、実稼働環境からステージング環境にトラフィックをミラーリングして、シミュレーションテストを実行したり、問題をトラブルシューティングしたりするプロセスです。 この方法を使用して、本番環境でビジネスを中断することなく、テストを実行し、トラブルシューティングを実行できます。 このトピックでは、NGINX Ingressコントローラーを使用して、Container Service for Kubernetes (ACK) クラスター間のトラフィックをミラーリングする方法について説明します。
前提条件
2つのACKクラスタが作成される。 詳細については、「ACK管理クラスターの作成」をご参照ください。
NGINX Ingressコントローラがインストールされ、そのバージョンはv1.2.1以降です。 詳細については、「NGINX Ingressコントローラーの管理」をご参照ください。
利用シナリオ
トラフィックミラーリングは、次のシナリオで使用できます。
生産作業負荷シミュレーション:
システムに重要な変更を加えたり、新機能をリリースする前に、ストレステストを実行してシステムの安定性を評価する必要があります。 ほとんどの場合、運用ワークロードはステージング環境でシミュレートされ、システムがリリースされる前に新しいシステムの安定性をテストします。 しかし、システムが正常なネットワークトラフィックと異常なネットワークトラフィックの両方を受信する可能性があるため、実際の負荷を推定することは困難です。 この問題を解決するには、本番環境に配置されているアプリケーションからのネットワークトラフィックをステージング環境にミラーリングします。 次に、ステージング環境で運用ワークロードをシミュレートできます。
トラブルシューティング
運用環境にデプロイされたシステムでパフォーマンスのボトルネックが発生し、原因を特定できない場合は、システムのネットワークトラフィックをステージング環境にミラーリングできます。 これにより、ステージング環境のエラーをトラブルシューティングできます。
この例では、K8s Product clusterという名前のACKクラスタが本番環境にあり、K8s Stage Clusterという名前のACKクラスタがステージング環境にあります。
準備
K8s製品クラスターからK8sステージクラスターのアプリケーションに100% 本番トラフィックをミラーリングするには、example.com
向けのすべてのリクエストをレプリケートし、example1.com
にリダイレクトします。
手順1: ステージング環境でのアプリケーションのデプロイ
K8s Stage Clusterでmy-nginx.yamlという名前のファイルを作成し、次の内容をファイルに追加します。
説明ミラーリングされたトラフィックを受信するには、K8sステージクラスターにアプリケーションをデプロイするだけです。 クラスターの構成を変更しないでください。
apiVersion: apps/v1 kind: 配置 メタデータ: 名前: nginx-deployment spec: replicas: 1 セレクタ: matchLabels: アプリ:nginx テンプレート: metadata: labels: アプリ:nginx 仕様: containers: -画像: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 imagePullPolicy: Always name: nginx ポート: - containerPort: 80 protocol: TCP restartPolicy: 常に --- apiVersion: v1 種類: サービス メタデータ: 名前: nginx-service spec: ポート: - port: 80 protocol: TCP targetPort: 80 セレクタ: アプリ:nginx タイプ: NodePort --- apiVersion: networking.k8s.io/v1 kind: Ingress メタデータ: 名前: nginx-ingress spec: rules: -ホスト: example1.com http: paths: - path: / backend: service: 名前: nginx-service port: number: 80 pathType: ImplementationSpecific
次のコマンドを実行して、my-nginxアプリケーションをデプロイします。
kubectl apply -f my-nginx.yaml
次のコマンドを実行して、Ingress設定を表示します。
kubectl get ing nginx-ingress
期待される出力:
名ホストアドレスポート年齢 nginx-ingres s example1.com 47。**。53 80 8m
次のコマンドを実行して、アプリケーションのドメイン名にアクセスし、ドメイン名解決設定をテストします。
カール http://example1.com
手順2: 本番環境でのトラフィックミラーリングの設定
アプリケーションがK8s製品クラスターにデプロイされた後、トラフィックミラーリングアノテーションをIngressに追加する必要があります。
K8s製品クラスターにmy-nginx.yamlという名前のファイルを作成し、次の内容をファイルに追加します。
apiVersion: apps/v1 kind: 配置 メタデータ: 名前: nginx-deployment spec: replicas: 1 セレクタ: matchLabels: アプリ:nginx テンプレート: metadata: labels: アプリ:nginx 仕様: containers: -画像: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 imagePullPolicy: Always name: nginx ポート: - containerPort: 80 protocol: TCP restartPolicy: 常に --- apiVersion: v1 種類: サービス メタデータ: 名前: nginx-service spec: ポート: - port: 80 protocol: TCP targetPort: 80 セレクタ: アプリ:nginx タイプ: NodePort
次のコマンドを実行して、my-nginxアプリケーションをデプロイします。
kubectl apply -f my-nginx.yaml
my-ingress.yamlという名前のファイルを作成し、次のIngress設定をファイルに追加します。
nginx.ingress.kubernetes.io/mirror-target
を追加し、ステップ3でK8sステージクラスターのADDRESS
に値を設定します。 このアノテーションは、HTTPとHTTPSにのみ適用されます。 詳細については、「ingress-nginx_mirror」をご参照ください。nginx.ingress.kubernetes.io/mirror-host
を追加し、手順3でK8sステージクラスターのHOSTS
に値を設定します。
apiVersion: networking.k8s.io/v1 kind: Ingress メタデータ: name: nginx-ingress アノテーション: nginx.ingress.kubernetes.io/mirror-target: "http:// 47.**.**.53$request_uri"# ミラーリングされたトラフィックの宛先アドレスを指定します。 nginx.ingress.kubernetes.io/mirror-request-body: "off"# リクエストボディは送信先に送信されません。 リクエスト本文を宛先に送信するには、このアノテーションを削除します。 nginx.ingress.kubernetes.io/mirror-host: "example1.com"# ミラーリングされたトラフィックのHostヘッダーを設定します。 仕様: rules: -host: example.com http: paths: - path: / backend: service: 名前: nginx-service port: number: 80 pathType: ImplementationSpecific
次のコマンドを実行して、Ingressをデプロイします。
kubectl apply -f my-ingress.yaml
次のコマンドを実行して、Ingress設定を表示します。
kubectl get ing nginx-ingress
期待される出力:
名ホストアドレスポート年齢 nginx-ingres s example.com 39.**.**.54 80 1m
次のコマンドを実行して、アプリケーションのドメイン名にアクセスできるかどうかを確認します。
カール http://example.com
設定の確認
K8s製品クラスターのドメイン名example.com
にアクセスします。 次のコマンドを実行すると、ドメイン名宛てのリクエストがレプリケートされることが出力に示されます。 複製されたリクエストは、K8s Stage Clusterのアプリケーションにリダイレクトされます。
kubectl -n kube-system logs -- tail=0 -f nginx-ingress-controller-674c96ffbc-9mc 8n