Amazon EKS で Nginx イングレスミラー機能を使用してトラフィックレプリケーションを実現する

ac4200741eb3c31c35941285a58b10d1.gif

場合によっては、トラフィックの分散とレプリケーションの目的で、Amazon EKS のトラフィックを他の EKS クラスターまたは Kubernetes クラスターにレプリケートする必要があります。一般的なシナリオをいくつか示します。

  1. 新しいバージョンをテストする:新しいバージョンのアプリケーションをデプロイする場合、実稼働環境のアプリケーションに影響を与えることなく、実稼働トラフィックをテスト環境の新しいバージョンのアプリケーションにコピーして、そのパフォーマンスと安定性をテストできます。

  2. 障害分析:データ分析またはトラブルシューティングが必要な場合、トラフィックをテスト環境にコピーして、より効果的なトラブルシューティング分析を行うことができます。この時点で、テスト環境で特定のツールを実行したり、実稼働環境に影響を与えずに問題のトラブルシューティングに役立つデバッグ情報を追加したりできます。

  3. 移行/容量計画:アプリケーションの移行または容量評価が必要な場合、ベンチマークとパフォーマンス分析のためにトラフィックをさまざまなターゲットに送信できます。この時点で、トラフィックをテスト環境に複製することでさまざまな負荷とトラフィックのパターンをシミュレートでき、テスト結果を分析して容量計画や移行の決定を行うことができます。

Nginx Ingress のミラー機能を使用すると、リクエストを他の環境にミラーリングすることができ、ミラー先のレスポンスは無視され、「テスト」バックエンドでリクエストのレスポンスを確認するのに非常に便利です。

7d31897aacd02644566e12b576ee5dd2.jpeg

この記事では、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

左にスワイプするとさらに表示されます

d0d0d2cf152ef7cafd27ce50f7649557.jpeg

その他の設定項目

デフォルトでは、リクエスト本文はミラー バックエンドに送信されますが、これは次のコマンドを適用することでオフにできます。

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

この記事の著者

3091ac38f7026f5fa0759f73a4287ee5.jpeg

チェン・ジアジュン

Amazon のクラウド テクノロジー ソリューション アーキテクトは、現在主にクラウド アーキテクチャの設計と技術コンサルティングで顧客を支援する責任を負い、コンテナ化やその他の技術的方向性について深い理解を持っています。

ad5b795df96e0ac69a0bc150bf9938e5.gif

6979a9ea2daf7c5ae7369a39974992f8.gif

聞いたので、下の 4 つのボタンをクリックしてください

バグに遭遇することはありません!

d2d577608db704945f063e9524c118fc.gif

おすすめ

転載: blog.csdn.net/u012365585/article/details/131566737