Knative アプリケーションモデル (Knative サービスとも呼ばれます) は、Kubernetes 上でのサービスデプロイと管理を簡素化します。ワークロードのライフサイクルを管理するために使用できます。
はじめに
Knative サービスは、ユーザーが直接操作するリソースオブジェクトです。 Knative サービスには以下が含まれます。
構成: コンテナイメージ、環境変数、リソース制限など、ワークロードの構成を定義します。変更ごとに (イメージバージョンの更新や環境変数の調整など) 新しいリビジョンがトリガーされます。
リビジョン: 構成の更新ごとにスナップショットが作成されます。スナップショットはリビジョンであり、対応する構成状態を保持します。 Knative は、マルチバージョン アプリケーション管理にリビジョンを使用します。
ルート: 複数のリビジョンにトラフィックを分散するためのルーティングルールを構成します。カナリアリリースのために、異なるリビジョンに転送されるトラフィックの割合を構成できます。
タグ: 特定のリビジョンに一意のタグを割り当てると、Knative はそのリビジョンに独立したエンドポイントを自動的に生成します。これは、カナリア検証に使用できます。
基本的に、Knative サービスは、自動スケーリング、マルチバージョン管理、トラフィック コントロールなどの高度な機能を備えた Kubernetes リソース (Deployment、Service、および Ingress) を抽象化します。
YAML の例
次の YAML テンプレートは、単純な Knative サービスの例を示しています。
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: helloworld-go
spec:
template:
spec:
containers:
- image: registry-vpc.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:73fbdd56
env:
- name: TARGET
value: "Knative"機能
Knative サービスリソースオブジェクトを操作することにより、次の機能をより簡単な方法で実装できます。
リクエストベースの自動スケーリング
従来の CPU/メモリベースのスケーリングは、実際のビジネス負荷を反映していないことがよくあります。 Web サービスの場合、同時リクエスト (コンカレンシー) または 1 秒あたりのレコード数 (RPS) によるスケーリングは、パフォーマンスと直接相関しています。
Knative Serving は、コンテナのコンカレンシーや RPS などのメトリックを収集するために、各ポッドに queue-proxy コンテナを挿入します。オートスケーラーは、これらのメトリックを定期的にフェッチし、そのアルゴリズムに基づいてデプロイメント内のポッドの数を自動的に調整し、リクエストベースの自動スケーリングを実現します。実装フローは次のとおりです。
ユーザーがリクエストを開始し、HTTP Router がリクエストを Knative の Serverless Service (SKS) に転送します。
SKS は Kubernetes サービスリソースの Knative による抽象化であり、バックエンドのさまざまなエンドポイントにリクエストをルーティングできます。
SKS は、アプリケーションで実行されているインスタンスの数に基づいてルーティングの決定を行います。
サーブモード: 現在実行中のインスタンスがアプリケーションに存在する場合、リクエストはそれらに直接転送されます。
プロキシモード: 現在のアプリケーションのインスタンス数が 0 にスケールされている場合、トラフィックはアクティベーターにルーティングされます。アクティベーターは、リクエストプロキシバッファーとして機能します。
アクティベーターはリクエストを受信し、コンカレンシーメトリックを記録し、オートスケーラーにメトリックを送信します。
オートスケーラーは、事前設定されたしきい値に基づいてスケーリングが必要かどうかを判断し、必要に応じて API サーバーにスケールアウトリクエストを送信します。
オートスケーラーからのリクエストに基づいて、API サーバーはデプロイメントを更新し、新しいポッドを作成します。
アクティベーターは、新しいポッドの準備ができたことを検出すると、リクエストをそれらに転送します。
操作の詳細については、「トラフィックの変動に耐えるための自動スケーリングを有効にする」をご参照ください。
自動スケール to ゼロ
Knative を使用すると、トラフィックがない期間にポッドをゼロに自動スケーリングし、リクエストが到着するとすぐにスケールアップできます。 Knative は、2 つのアクセスモードを定義しています。プロキシモードとサーブモードです。オートスケーラーは、モードの切り替えを担当します。
リクエスト数がゼロの場合、オートスケーラーはサーブモードからプロキシモードに切り替えます。
リクエストを受信すると、オートスケーラーはポッドの数をスケールアウトするための通知を受信します。新しいポッドの準備ができると、オートスケーラーはリクエストをそれらに転送し、プロキシモードからサーブモードに切り替えます。
構成の詳細については、「トラフィックの変動に耐えるための自動スケーリングを有効にする」をご参照ください。
マルチバージョン管理とカナリアリリース
構成が更新されるたびに、一意で不変のリビジョンが生成されます。ルートは、リクエストを特定のリビジョンに転送し、構成可能な割合でトラフィックをそれらのリビジョンに分散します。リビジョンにより、トラフィックに基づいたロールバックやカナリアリリースなどのバージョン管理機能が可能になります。たとえば、リビジョン V1 を作成した後、サービスの構成オブジェクトを更新してリビジョン V2 を作成します。リビジョン V1 とリビジョン V2 のルートトラフィック分割を構成すると (V1:70% / V2:30% など)、トラフィックは指定された比率に基づいて分散されます。
操作の詳細については、「トラフィック分割に基づいてカナリアリリースを実行する」をご参照ください。