コンテンツにスキップ

トラフィック分割

トラフィック分割は、ブルー/グリーンデプロイメントカナリアデプロイメントに役立ちます。

リビジョンは、アプリケーションコードと構成の特定の時点のスナップショットです。Knativeサービスの構成を変更するたびに、新しいリビジョンが作成されます。トラフィックを分割する場合、KnativeはKnativeサービスの異なるリビジョン間でトラフィックを分割します。

新しいリビジョンの作成

TARGET=Worldの代わりに、Knativeサービスの環境変数TARGETを更新して、代わりに「Knative」を挨拶するようにします。

次のコマンドを実行して、Knativeサービスの更新バージョンをデプロイします。

kn service update hello \
--env TARGET=Knative

以前と同様に、knはCLIに役立つ情報を出力します。

期待される出力

Service 'hello' created to latest revision 'hello-00002' is available at URL:
http://hello.default.${LOADBALANCER_IP}.sslip.io
  1. 既存のhello.yamlファイルを編集して、次のようにします。
    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: hello
    spec:
      template:
        spec:
          containers:
            - image: ghcr.io/knative/helloworld-go:latest
              ports:
                - containerPort: 8080
              env:
                - name: TARGET
                  value: "Knative"
    
  2. 次のコマンドを実行して、Knativeサービスの更新バージョンをデプロイします。

    kubectl apply -f hello.yaml
    

    期待される出力

    service.serving.knative.dev/hello configured
    

既存のKnativeサービスを更新しているため、URLは変更されませんが、新しいリビジョンの名前はhello-00002です。

新しいリビジョンへのアクセス

変更を確認するには、ブラウザでKnativeサービスに再度アクセスするか、ターミナルでcurlを使用します。

echo "Accessing URL $(kn service describe hello -o url)"
curl "$(kn service describe hello -o url)"

期待される出力

Hello Knative!

既存のリビジョンの表示

Knative (kn) または kubectl CLIを使用して、既存のリビジョンのリストを表示できます。

次のコマンドを実行して、リビジョンのリストを表示します。

kn revisions list

期待される出力

NAME            SERVICE   TRAFFIC   TAGS   GENERATION   AGE   CONDITIONS   READY   REASON
hello-00002     hello     100%             2            30s   3 OK / 4     True
hello-00001     hello                      1            5m    3 OK / 4     True

次のコマンドを実行して、リビジョンのリストを表示します。

kubectl get revisions

期待される出力

NAME          CONFIG NAME   K8S SERVICE NAME   GENERATION   READY   REASON   ACTUAL REPLICAS   DESIRED REPLICAS
hello-00001   hello                            1            True             0                 0
hello-00002   hello                            2            True             0                 0

knコマンドを実行すると、関連する列はTRAFFICです。トラフィックの100%が最新のリビジョンであるhello-00002に送られていることがわかります。これは、GENERATIONが最も高い行にあります。リビジョンhello-00001には、トラフィックの0%が送られています。

Knativeサービスの新しいリビジョンを作成すると、Knativeはデフォルトでトラフィックの100%をこの最新リビジョンに送るように設定されます。各リビジョンが受信するトラフィック量を指定することで、このデフォルトの動作を変更できます。

リビジョン間のトラフィック分割

2つのリビジョン間でトラフィックを分割します。

次のコマンドを実行します。

kn service update hello \
--traffic hello-00001=50 \
--traffic @latest=50

  1. 既存のhello.yamlファイルの末尾にtrafficセクションを追加します。
    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: hello
    spec:
      template:
        spec:
          containers:
            - image: ghcr.io/knative/helloworld-go:latest
              ports:
                - containerPort: 8080
              env:
                - name: TARGET
                  value: "Knative"
      traffic:
      - latestRevision: true
        percent: 50
      - latestRevision: false
        percent: 50
        revisionName: hello-00001
    
  2. 次のコマンドを実行してYAMLを適用します。
    kubectl apply -f hello.yaml
    

情報

@latestは常に「最新」のリビジョンを指します。この場合、hello-00002です。

トラフィック分割の確認

トラフィック分割が正しく構成されていることを確認するには、次のコマンドを実行して再度リビジョンを一覧表示します。

kn revisions list

期待される出力

NAME            SERVICE   TRAFFIC   TAGS   GENERATION   AGE   CONDITIONS   READY   REASON
hello-00002     hello     50%              2            10m   3 OK / 4     True
hello-00001     hello     50%              1            36m   3 OK / 4     True

ブラウザでKnativeサービスに複数回アクセスして、各リビジョンによって提供される異なる出力を確認します。

同様に、ターミナルからサービスURLに複数回アクセスして、リビジョン間でトラフィックが分割されていることを確認できます。

echo "Accessing URL $(kn service describe hello -o url)"
curl "$(kn service describe hello -o url)"

期待される出力

Hello Knative!
Hello World!
Hello Knative!
Hello World!

私たちはサイトトラフィックを理解するためにアナリティクスとクッキーを使用します。当サイトの利用に関する情報はその目的のためにGoogleと共有されます。詳細