すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:ALB Ingressを使用してACKクラスターでカナリアリリースを実行する

最終更新日:Nov 14, 2024

サービスを更新する前に、カナリアリリースを使用して新しいサービスバージョンの安定性をテストできます。 Application Load Balancer (ALB) Ingressでは、カナリアアノテーションを使用して、ヘッダー、Cookie、および重みに基づいてカナリアリリースを実行できます。 異なるルールを使用するカナリアリリースは、ヘッダーベース> クッキーベース> 重みベースの順に有効になります。 ヘッダーベース、クッキーベース、および重みベースのルールを同時に設定する場合、優先度が最も高いルールが優先されます。

使用上の注意

  • ヘッダーベースとクッキーベースのルールは、同じIngressで重みベースのルールを設定することはできません。 2つの別々のIngressでそれらを設定するか、カスタムルーティングルールを使用する必要があります。

  • カナリアアノテーションを使用してカナリアリリースを実行する場合、ALB Ingressルーティングルールが有効になる順序は、Ingress名前空間または名前の辞書式順序によって異なります。 カナリアリリースルールが正しい順序で適用されるようにするには、alb.ingress.kubernetes.io/orderアノテーションを使用して順序を定義します。 alb.ingress.kubernetes.io/orderの有効な値は1 ~ 1000です。 デフォルト値は 10 です。 値が小さいほど、優先度が高くなります。 たとえば、Ingressの優先度を上げたい場合は、そのalb.ingress.kubernetes.io/order設定の値を減らすことができます。

  • カスタムルーティングルールを使用して、より複雑なルーティング条件に基づいてカナリアリリースを実行できます。 詳細については、「ALB Ingressのルーティングルールのカスタマイズ」をご参照ください。

ステップ1: アプリケーションの作成

  1. クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続します。.

  2. teaという名前のサービスを展開します。

    1. tea-deploy.yamlという名前のファイルを作成し、次の内容をファイルにコピーします。

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: tea
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: tea
        template:
          metadata:
            labels:
              app: tea
          spec:
            containers:
            - name: tea
              image: registry.cn-hangzhou.aliyuncs.com/acs-sample/old-nginx:latest
              ports:
              - containerPort: 80
    2. 次のコマンドを実行して、teaサービスをデプロイします。

      kubectl apply -f tea-deploy.yaml
  3. tea-svcという名前のサービスをデプロイします。

    1. tea-svc.yamlという名前のファイルを作成し、次のコンテンツをファイルにコピーします。

      apiVersion: v1
      kind: Service
      metadata:
        name: tea-svc
      spec:
        ports:
        - port: 80
          targetPort: 80
          protocol: TCP
        selector:
          app: tea
        type: NodePort
    2. 次のコマンドを実行して、tea-svcサービスをデプロイします。

      kubectl apply -f tea-svc.yaml
  4. tea-Ingressという名前のingressをデプロイします。

    1. tea-ingress.yamlという名前のファイルを作成し、次のコンテンツをファイルにコピーします。

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: tea-ingress
      spec:
        ingressClassName: alb
        rules:
         - host: demo.domain.ingress.top # Replace with your domain name and ensure that it can be resolved to the IP address of the load balancer where the Ingress controller resides. 
           http:
            paths:
            - path: /
              pathType: Prefix
              backend:
                service:
                  name: tea-svc
                  port:
                    number: 80
    2. 次のコマンドを実行してIngressをデプロイします。

      kubectl apply -f tea-ingress.yaml

ステップ2: 新しいサービスバージョンのカナリアリリースを実行する

新しいServiceバージョンと新しいIngressをデプロイして、canaryという名前の新しいServiceバージョンにlocation: hzヘッダーを運ぶすべての要求をルーティングし、他の要求の50% を新しいServiceバージョンにルーティングします。 他の要求は、他のヘッダを搬送する要求と、搬送ヘッダを搬送しない要求とを含む。

  1. canaryという名前の新しいサービスバージョンを展開します。

    1. canary-deploy.yamlという名前のファイルを作成し、次の内容をファイルにコピーします。

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: canary
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: canary
        template:
          metadata:
            labels:
              app: canary
          spec:
            containers:
            - name: canary
              image: registry.cn-hangzhou.aliyuncs.com/acs-sample/new-nginx:latest
              ports:
              - containerPort: 80
    2. 次のコマンドを実行してカナリアサービスをデプロイします。

      kubectl apply -f canary-deploy.yaml
  2. canary-svcという名前のサービスをデプロイします。

    1. canary-svc.yamlという名前のファイルを作成し、次のコンテンツをファイルにコピーします。

      apiVersion: v1
      kind: Service
      metadata:
        name: canary-svc
      spec:
        ports:
        - port: 80
          targetPort: 80
          protocol: TCP
        selector:
          app: canary
        type: NodePort
    2. 次のコマンドを実行して、canary-svc Serviceをデプロイします。

      kubectl apply -f canary-svc.yaml
  3. ヘッダーに基づいてリクエストをルーティングするIngressをデプロイします。

    1. canary-header-ingress.yamlという名前のファイルを作成し、次のコンテンツをファイルにコピーします。

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        annotations:
          alb.ingress.kubernetes.io/canary: "true"
          alb.ingress.kubernetes.io/canary-by-header: "location"
          alb.ingress.kubernetes.io/canary-by-header-value: "hz"
        name: canary-header-ingress
        namespace: default
      spec:
        ingressClassName: alb
        rules:
          - host: demo.domain.ingress.top # Replace with your domain name and ensure that it can be resolved to the IP address of the load balancer where the Ingress controller resides. 
            http:
              paths:
                - backend:
                    service:
                      name: canary-svc
                      port:
                        number: 80
                  path: /
                  pathType: Prefix
      • カナリア注釈を有効にするには、alb.ingress.kubernetes.io/canarytrueに設定します。

      • alb.ingress.kubernetes.io/canary-by-headeralb.ingress.kubernetes.io/canary-by-header-valueを、一致させるヘッダーのキーと値に設定します。 この例では、ヘッダーのKVペアはlocation: hzに設定されています。 location: hzヘッダーを持つすべてのリクエストは、新しいサービスバージョンにルーティングされます。 他のヘッダーを持つリクエストは、ルールの優先順位に基づいて他のカナリアリリースルールと照合され、一致するルールに関連付けられたサービスバージョンにルーティングされます。

    2. 次のコマンドを実行して、ヘッダーに基づいてリクエストをルーティングするIngressをデプロイします。

      kubectl apply -f canary-header-ingress.yaml
  4. Ingressをデプロイして、重みに基づいてリクエストをルーティングします。

    1. canary-weight-ingress.yamlという名前のファイルを作成し、次のコンテンツをファイルにコピーします。

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        annotations:
          alb.ingress.kubernetes.io/canary: "true"
          alb.ingress.kubernetes.io/canary-weight: "50"
        name: canary-weight-ingress
        namespace: default
      spec:
        ingressClassName: alb
        rules:
          - host: demo.domain.ingress.top # Replace with your domain name and ensure that it can be resolved to the IP address of the load balancer where the Ingress controller resides. 
            http:
              paths:
                - backend:
                    service:
                      name: canary-svc
                      port:
                        number: 80
                  path: /
                  pathType: Prefix

      alb.ingress.kubernetes.io/canary-weight: 新しいサービスバージョンにルーティングされるトラフィックの割合を指定します。 この例では、値は50に設定されています。これは、トラフィックの50% が新しいサービスバージョンにルーティングされることを示します。

    2. 次のコマンドを実行して、Ingressをデプロイし、重みに基づいてリクエストをルーティングします。

      kubectl apply -f canary-weight-ingress.yaml
  5. カナリアリリースが成功したかどうかを確認します。

    1. 次のコマンドを実行して、ALBインスタンスのIPアドレスを照会します。

      kubectl get ing

      期待される出力:

      NAME                    CLASS   HOSTS                     ADDRESS                                              PORTS   AGE
      canary-header-ingress   alb     demo.domain.ingress.top   alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com   80      8m23s
      canary-weight-ingress   alb     demo.domain.ingress.top   alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com   80      8m16s
      tea-ingress             alb     demo.domain.ingress.top   alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com   80      7m5s
    2. 次のコマンドを複数回実行して、location: hzヘッダーをサービスに送信するリクエストを送信します。

      curl -H Host:demo.domain.ingress.top -H "location:hz" http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com

      期待される出力:

      new

      location: hzヘッダーを持つリクエストに対してnewが返されます。 location: hzヘッダーを持つリクエストは、新しいサービスバージョンにルーティングされます。

    3. 次のコマンドを複数回実行して、ヘッダーを含まないリクエストをサービスに送信します。

      curl -H Host:demo.domain.ingress.top  http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com

      newはヘッダーを持たないリクエストの50% に対して返され、oldはリクエストの残りの50% に対して返されます。 ヘッダーを持たないリクエストの50% は、新しいサービスバージョンにルーティングされます。

    4. 次のコマンドを複数回実行して、location: bjヘッダーを含むリクエストをサービスに送信します。

      curl -H Host:demo.domain.ingress.top -H "location:bj" http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com

      newは、location: bjヘッダを搬送する要求の50% に対して返され、oldは、要求の残りの50% に対して返される。 location: bjヘッダーを運ぶ要求の50% は、新しいサービスバージョンにルーティングされます。

    location: hzヘッダーを持つすべてのリクエストは、canaryという名前の新しいサービスバージョンにルーティングされます。 他のヘッダーを運び、ヘッダーを運ばない50% のリクエストのみが、新しいサービスバージョンにルーティングされます。 カナリアのリリースは成功しました。

ステップ3: 古いサービスバージョンを廃止する

新しいサービスバージョンが一定期間、期待どおりに実行されたら、古いサービスバージョンを廃止し、新しいサービスバージョンのみを保持する必要があります。 これを行うには、古いサービスバージョンのIngressのサービスを新しいサービスバージョンに変更して、Ingressが新しいサービスバージョンにトラフィックをルーティングできるようにする必要があります。 次に、カナリアIngressを削除します。

  1. 次のコマンドを実行して、tea-ingress.yamlファイルを変更します。

    vim tea-ingress.yaml

    次のコマンドを実行して、tea-ingress.yamlファイルのサービスをtea-svcからcanary-svcに変更します

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: tea-ingress
    spec:
      ingressClassName: alb
      rules:
       - host: demo.domain.ingress.top # Replace with your domain name and ensure that it can be resolved to the IP address of the load balancer where the Ingress controller resides. 
         http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: canary-svc # Change tea-svc to canary-svc. 
                port:
                  number: 80
  2. 変更されたIngressを有効にするには、次のコマンドを実行します。

    kubectl apply -f tea-ingress.yaml
  3. 古いサービスバージョンが廃止されているかどうかを確認します。

    1. 次のコマンドを複数回実行して、location: hzヘッダーをサービスに送信するリクエストを送信します。

      curl -H Host:demo.domain.ingress.top -H "location:hz" http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com

      期待される出力:

      new

      location: hzヘッダーを持つリクエストに対してnewが返されます。 location: hzヘッダーを持つリクエストは、新しいサービスバージョンにルーティングされます。

    2. 次のコマンドを複数回実行して、ヘッダーを含まないリクエストをサービスに送信します。

      curl -H Host:demo.domain.ingress.top http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com

      期待される出力:

      new

      ヘッダーを持たないリクエストに対しては、newが返されます。 ヘッダーを持たないリクエストは、新しいサービスバージョンにルーティングされます。

    3. 次のコマンドを複数回実行して、location: bjヘッダーを含むリクエストをサービスに送信します。

      curl -H Host:demo.domain.ingress.top -H "location:bj" http://alb-ny3ute4r8yevni****.cn-chengdu.alb.aliyuncs.com

      期待される出力:

      new

      location: bjヘッダーを持つリクエストに対して、newが返されます。 location: bjヘッダーを持つリクエストは、新しいサービスバージョンにルーティングされます。

    location: hzヘッダーを運ぶリクエスト、他のヘッダーを運ぶリクエスト、およびヘッダーを運ばないリクエストはすべて、新しいサービスバージョンにルーティングされます。 古いサービスバージョンは非推奨です。

  4. 次のコマンドを実行して、canary-weight-ingressおよびcanary-header-ingressという名前のcanary ingressを削除します。

    kubectl delete ing canary-weight-ingress canary-header-ingress