アリババの最も火の技術:k 8 sはIngress-nginxに基づいて階調の発表を実現します

5495 ワード

前言


Ingress-NginxはK 8 S ingressツールで、異なるシーンでの階調パブリケーションとテストを実現するためにIngress Annotationsの構成をサポートしています.Nginx Annotationsでは、次のいくつかのCanaryルールがサポートされています.

Nginx ingress annotations


古いバージョンとcanaryバージョンの2つのバージョンのサービスを導入したとします.
  • nginx.ingress.kubernetes.io/canary-by-header:Request Headerのトラフィック分割に基づいて、階調パブリケーションおよびA/Bテストに適しています.Request Headerがalwaysに設定されている場合、リクエストはCanaryバージョンに送信されます.Request Headerがneverに設定されている場合、要求はCanaryエントリに送信されません.
  • nginx.ingress.kubernetes.io/canary-by-header-value:Canary Ingressで指定したサービスにリクエストをルーティングするようIngressに通知するRequest Headerの値.Request Headerがこの値に設定されると、Canaryエントリにルーティングされます.この
  • nginx.ingress.kubernetes.io/canary-weight:サービスウェイトに基づくトラフィック分割は、青緑配置に適用され、ウェイト範囲0-100は、Canary Ingressで指定されたサービスにリクエストをパーセントでルーティングします.ウェイト0は、カナリアルールがCanaryエントリのサービスに要求を送信しないことを意味します.ウェイトが60の場合、60%のトラフィックがcanaryに移動することを意味します.重み100は、すべてのリクエストがCanaryエントリに送信されることを意味します.
  • nginx.ingress.kubernetes.io/canary-by-cookie:Cookieの流量分割に基づいて、階調発表とA/Bテストに適しています.IngressがCanary Ingressで指定したサービスにリクエストをルーティングすることをIngressに通知するクッキー.クッキー値がalwaysに設定されると、Canaryエントリにルーティングされます.クッキー値がneverに設定されている場合、要求はCanaryエントリに送信されません.

  • 導入サービス


    ここで私たちのサービスのdeploymentは展示されていません.サービスの構成は以下の通りです.
    #  
    apiVersion: v1
    kind: Service
    metadata: 
    name: hello-service
    labels: 
    app: hello-service
    spec:
    ports:
    - port: 80
    protocol: TCP
    selector: 
    app: hello-service
    # canary  
    apiVersion: v1
    kind: Service
    metadata:
    name: canary-hello-service
    labels:
    app: canary-hello-service
    spec:
    ports:
    - port: 80 
    protocol: TCP
    selector:
    app: canary-hello-service

    ウェイトによる転送


    ingressの構成は次のとおりです.
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata: 
    name: canary 
    annotations:  
    kubernetes.io/ingress.class: nginx   
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "30"
    spec: 
    rules: 
    - host: canary-service.abc.com
    http:  
    paths: 
    - backend:   
    serviceName: canary-hello-service  
    servicePort: 80

    テスト結果は次のとおりです.
    $ for i in $(seq 1 10); do curl http://canary-service.abc.com; echo '
    '; done hello world-version1 hello world-version1 hello world-version2 hello world-version2 hello world-version1 hello world-version1 hello world-version1 hello world-version1 hello world-version1 hello world-version1

    リクエストヘッダによる転送


    annotation構成は以下の通り(ingress残りは省略)
    annotations:  
    kubernetes.io/ingress.class: nginx 
    nginx.ingress.kubernetes.io/canary: "true" 
    nginx.ingress.kubernetes.io/canary-by-header: "test"

    テスト結果は次のとおりです.
    $ for i in $(seq 1 5); do curl http://canary-service.abc.com; echo '
    '; done hello world-version1 hello world-version1 hello world-version1 hello world-version1 hello world-version1 $ for i in $(seq 1 5); do curl -H 'test:always' http://canary-service.abc.com; echo '
    '; done hello world-version2 hello world-version2 hello world-version2 hello world-version2 hello world-version2

    特定のリクエストヘッダと値に基づいて転送


    annotationの構成は次のとおりです.
      kubernetes.io/ingress.class: nginx 
      nginx.ingress.kubernetes.io/canary: "true"  
    nginx.ingress.kubernetes.io/canary-by-header: "test"  
    nginx.ingress.kubernetes.io/canary-by-header-value: "abc"

    テスト結果は次のとおりです.
    $ for i in $(seq 1 5); do curl -H 'test:always' http://canary-service.abc.com; echo '
    '; done hello world-version1 hello world-version1 hello world-version1 hello world-version1 hello world-version1 $ for i in $(seq 1 5); do curl -H 'test:abc' http://canary-service.abc.com; echo '
    '; done hello world-version2 hello world-version2 hello world-version2 hello world-version2 hello world-version2

    クッキーによる転送


    cookieを使用してトラフィック管理を行うシーンは、ユーザのリクエストcookieに特殊なラベルが含まれているなど、A/B testに適しており、この部分のユーザのリクエストを特定のサービスに転送して処理することができる.annotationの構成は次のとおりです.
      kubernetes.io/ingress.class: nginx 
      nginx.ingress.kubernetes.io/canary: "true"  
    nginx.ingress.kubernetes.io/canary-by-cookie: "like_music"

    テスト結果は次のとおりです.
    $ for i in $(seq 1 5); do curl -b 'like_music=1' http://canary-service.abc.com; echo '
    '; done hello world-version1 hello world-version1 hello world-version1 hello world-version1 hello world-version1 $ for i in $(seq 1 5); do curl -b 'like_music=always' http://canary-service.abc.com; echo '
    '; done hello world-version2 hello world-version2 hello world-version2 hello world-version2 hello world-version2

    3つのannotationは次の順序で一致します.
    canary-by-header > canary-by-cookie > canary-weight

    まとめ


    以上のテスト結果から,トラフィックの転送は以下の2つに分類できる.
    1.重みによる
        nginx.ingress.kubernetes.io/canary: "true"   
    nginx.ingress.kubernetes.io/canary-weight: "30"  
    
    70%                   
      |------>  
    users --- 100% ---> Nginx Ingress ----|  30%   
      |------> canary  

    2.ユーザー別
    nginx.ingress.kubernetes.io/canary: "true" 
    nginx.ingress.kubernetes.io/canary-by-header: "test"    
    nginx.ingress.kubernetes.io/canary-by-header-value: "abc"   
    others 
      |----------->  
    users ------> Nginx Ingress ------| "test:abc" 
    |-----------> canary