場合によっては、トラフィックの分散とレプリケーションの目的で、Amazon EKS のトラフィックを他の EKS クラスターまたは Kubernetes クラスターにレプリケートする必要があります。一般的なシナリオをいくつか示します。
新しいバージョンをテストする:新しいバージョンのアプリケーションをデプロイする場合、実稼働環境のアプリケーションに影響を与えることなく、実稼働トラフィックをテスト環境の新しいバージョンのアプリケーションにコピーして、そのパフォーマンスと安定性をテストできます。
障害分析:データ分析またはトラブルシューティングが必要な場合、トラフィックをテスト環境にコピーして、より効果的なトラブルシューティング分析を行うことができます。この時点で、テスト環境で特定のツールを実行したり、実稼働環境に影響を与えずに問題のトラブルシューティングに役立つデバッグ情報を追加したりできます。
移行/容量計画:アプリケーションの移行または容量評価が必要な場合、ベンチマークとパフォーマンス分析のためにトラフィックをさまざまなターゲットに送信できます。この時点で、トラフィックをテスト環境に複製することでさまざまな負荷とトラフィックのパターンをシミュレートでき、テスト結果を分析して容量計画や移行の決定を行うことができます。
Nginx Ingress のミラー機能を使用すると、リクエストを他の環境にミラーリングすることができ、ミラー先のレスポンスは無視され、「テスト」バックエンドでリクエストのレスポンスを確認するのに非常に便利です。
この記事では、Nginx ミラーの効果を実証するために 2 つの EKS クラスターをデプロイします。EKS-Source-Cluster はソース クラスターとして使用され、EKS-Destination-Cluster はターゲット クラスターとして使用されます。両方のクラスターは nginx-ingress と nginx-ingress をデプロイします。テスト用の httpbin アプリケーション。
前提条件
この記事で使用する環境情報は次のとおりであり、バージョンごとに構成が異なります。
アマゾンEKS:1.25
Nginx-ingress:v1.7.0
Amazon ロードバランサー コントローラー: v2.5.1
Amazon Load Balancer Controller を 2 つの EKS クラスターにデプロイするには、次のリンクを参照してください。
https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/aws-load-balancer-controller.html
2 つの EKS クラスターに Nginx-ingress をデプロイします。
ソリューションの導入手順
helm upgrade --install ingress-nginx ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx --create-namespace
左にスワイプするとさらに表示されます
ターゲット クラスター EKS-Destination-Cluster の nginx-ingress の external-ip を確認し、記録します。
$ kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 172.20.246.159 a3fa8caf2f1ee4427852c0c9dc1d4249-1800757104.us-east-1.elb.amazonaws.com 80:30606/TCP,443:31247/TCP 29m
ingress-nginx-controller-admission ClusterIP 172.20.129.253 <none>
左にスワイプするとさらに表示されます
httpbin アプリケーションを 2 つの EKS クラスターにデプロイします。
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpbin
spec:
selector:
matchLabels:
app: httpbin
replicas: 1
template:
metadata:
labels:
app: httpbin
spec:
containers:
- name: httpbin
image: kennethreitz/httpbin
ports:
- containerPort: 80
左にスワイプするとさらに表示されます
httpbin-svc を 2 つの EKS クラスターにデプロイします。
apiVersion: v1
kind: Service
metadata:
name: httpbin-svc
spec:
selector:
app: httpbin
type: ClusterIP
ports:
- name: http
port: 80
targetPort: 80
左にスワイプするとさらに表示されます
Amazon EKS で
Ingress リソースをデプロイする
ミラーソース-ingress.yamlを作成します。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: httpbin-source-ingress
annotations:
# 指定使用nginx-ingress
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
# mirror-target填入EKS-Destination-Cluster的nginx-ingress external-ip域名
nginx.ingress.kubernetes.io/mirror-target: https://a3fa8caf2f1ee4427852c0c9dc1d4249-1800757104.us-east-1.elb.amazonaws.com/$request_uri
spec:
rules:
# host填入EKS-Source-Cluster的nginx-ingress external-ip域名
- host: a1008e8ef462544b9ba6fb7e68352f7d-92988604.us-east-1.elb.amazonaws.com
http:
paths:
- path: /httpbin
pathType: Prefix
backend:
service:
name: httpbin-svc
port:
name: http
左にスワイプするとさらに表示されます
ソースクラスター EKS-Source-Cluster に httpbin-source-ingress を作成します。
kubectl apply -f mirror-source-ingress.yaml
$ kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
httpbin-ingress <none> a1008e8ef462544b9ba6fb7e68352f7d-92988604.us-east-1.elb.amazonaws.com 80 10s
左にスワイプするとさらに表示されます
ミラー宛先-ingress.yaml を作成します。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: httpbin-destination-ingress
annotations:
# 指定使用nginx-ingress
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
# host填入EKS-Destination-Cluster的nginx-ingress external-ip域名
- host: a3fa8caf2f1ee4427852c0c9dc1d4249-1800757104.us-east-1.elb.amazonaws.com
http:
paths:
- path: /httpbin
pathType: Prefix
backend:
service:
name: httpbin-svc
port:
name: http
左にスワイプするとさらに表示されます
ターゲットクラスター EKS-Destination-Cluster に httpbin-destination-ingress を作成します。
kubectl apply -f mirror-source-ingress.yaml
$ kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
httpbin-source-ingress <none> a1008e8ef462544b9ba6fb7e68352f7d-92988604.us-east-1.elb.amazonaws.com 80 5s
左にスワイプするとさらに表示されます
注: nginx.ingress.kubernetes.io/mirror-target: https://a3fa8caf2f1ee4427852c0c9dc1d4249-1800757104.us-east-1.elb.amazonaws.com/$request_uri
このイングレスに対するすべてのリクエストは次の宛先に転送できます。
a3fa8caf2f1ee4427852c0c9dc1d4249-1800757104.us-east-1.elb.amazonaws.com。
ミラー効果を検証する
httpbin-source-ingress にアクセスします。
curl http://a1008e8ef462544b9ba6fb7e68352f7d-92988604.us-east-1.elb.amazonaws.com/httpbin
左にスワイプするとさらに表示されます
EKS-Destination-Cluster で 、 nginx-ingress がミラーからリクエストを受信したかどうかを確認します。
kubectl logs --tail=0 -f ingress-nginx-controller-6b8bfd7f69-8jb7d -n ingress-nginx
左にスワイプするとさらに表示されます
その他の設定項目
デフォルトでは、リクエスト本文はミラー バックエンドに送信されますが、これは次のコマンドを適用することでオフにできます。
nginx.ingress.kubernetes.io/mirror-request-body: "off"
左にスワイプするとさらに表示されます
デフォルトでは、ミラー リクエストのヘッダー Host は、ミラー ターゲット アノテーションの URI のホスト部分と同じに設定されます。これは、ミラー ホスト アノテーションを介してオーバーライドできます。
nginx.ingress.kubernetes.io/mirror-host: "test.env.com"
左にスワイプするとさらに表示されます
要約する
Nginx イングレスミラー機能を使用して Amazon EKS クラスターにトラフィックレプリケーションを実装すると、パフォーマンステスト、トラブルシューティング、機能開発をより効果的に実行できます。本番環境に影響を与えることなく、ミラー環境で実際のトラフィックを継続的に受信して分析できます。この記事では、EKS クラスターにこの機能を実装するための詳細な手順を説明し、開発に役立つことを期待しています。
参考リンク
https://kubernetes.github.io/ingress-nginx/deploy/
https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/aws-load-balancer-controller.html
https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#mirror
この記事の著者
チェン・ジアジュン
Amazon のクラウド テクノロジー ソリューション アーキテクトは、現在主にクラウド アーキテクチャの設計と技術コンサルティングで顧客を支援する責任を負い、コンテナ化やその他の技術的方向性について深い理解を持っています。
聞いたので、下の 4 つのボタンをクリックしてください
バグに遭遇することはありません!