Ask and Knative

はじめに

クラウドコンピューティング技術の発展に伴い、クラウドリソースのデリバリーはますますシンプルになり、オンデマンドでの利用が可能になりました。オンデマンドでリソースを利用するモードでは、ユーザーはビジネスそのものに集中し、インフラへの関心を減らすことができます。そこで、サーバーレスという概念が誕生しました。Kubernetes は優れたエコシステムとクラウドベンダーに依存しない互換性を備え、現在クラウドネイティブ業界の標準となっています。Kubernetes は IaaS リソースデリバリーの標準をうまく抽象化していますが、Kubernetes 上でサーバーレスモードのアプリケーション管理を実現するには、まだ多くの作業が必要です。Knative は K8s をさらに簡素化し、アプリケーションのライフサイクル制御の複雑さを大幅に低減するとともに、自動伸縮やカナリアリリース機能を提供します。同時に、Alibaba Cloud のサーバーレス Kubernetes(ASK)が提供する極致のコンテナ化サーバーレスを基盤に、クラウドネイティブサーバーレスアプリケーションの完全なセットをお届けします。本記事では、以下の 4 つのパートに分けて解説します。

・ Knative が必要な理由

・ Knative の紹介

・ Knative と ASK の統合

・デモ例

Knative が必要な理由

ご存じのとおり、現在の K8s は事実上のクラウドネイティブオペレーティングシステムとなっています。Kubernetes は、Service、Ingress、Pod、Deployment などのデータ抽象化を通じてインフラ機能を公開しています。これらの機能は Kubernetes ネイティブ API を通じてユーザーに提供されます。一方で、Kubernetes は CNI や CRD などのインフラ機能アクセスのための標準インターフェースを提供しており、クラウドリソースを標準的な方法で Kubernetes のシステムに接続できます。現在の Kubernetes のポジションは、インフラとアプリケーションを結ぶ架け橋と言えます。クラウドネイティブユーザーは Kubernetes を用いてアプリケーションのデリバリーと管理を行います。そこにはカナリアリリース、スケーリング、およびリソースコストの最適化が含まれます。

しかし、Kubernetes を使用する過程で、以下のような課題が見えてきます。

・ K8s API を通じたサービスライフサイクル管理の実現は複雑である

・クラウド IaaS リソースの仕様は複雑で、各仕様は異なるシナリオに適用されるため、ユーザーがすべての仕様を独自に組み合わせるのは困難である

・リソース使用コストの削減において、伸縮性がますます重要になっている

では、コンテナ(K8s)技術をシンプルに利用するにはどうすればよいでしょうか。オンデマンドで利用し、コストを削減するにはどうすればよいでしょうか。その答えが Knative です。

Knative の紹介

Knative は、Google Cloud Next 2018 で発表された Kubernetes ベースのサーバーレスオーケストレーションエンジンです。Knative の重要な目標の一つは、クラウドネイティブでクロスプラットフォームなサーバーレスオーケストレーション標準を策定することです。Knative は、コンテナビルド(または関数)、ワークロード管理(伸縮性)、およびイベントモデルを統合することでサーバーレス標準を実現しています。現在の Knative コミュニティの主なコントリビューターは、Google、Pivotal、IBM、Red Hat です。さらに、CloudFoundry や OpenShift などの PaaS プロバイダーも Knative の構築に積極的に参加しています。

Knative コアモジュール

Knative のコアモジュールは、主にイベントドリブンフレームワークの Eventing と、デプロイワークロードの Serving で構成されます。

サーバーレスサービスエンジン - Serving

Knative Serving の中核となる強みは、シンプルで効率的なアプリケーションホスティングサービスであり、これがサーバーレスをサポートする基盤でもあります。サーバーレスフレームワークにはオンデマンドでのリソース割り当て能力が不可欠です。Knative は、アプリケーションへのリクエスト数に応じてピーク時にインスタンス数を自動拡張できます。リクエスト数が減少すると、自動的にインスタンス数を削減し、コストを自動的に節約します。Serving はさらにトラフィック管理機能と柔軟なカナリアリリース機能も提供します。トラフィック管理機能はパーセンテージに基づいてトラフィックを分割し、カナリアリリース機能はトラフィックの割合に基づいてカナリアリリースを実現します。

シンプルなシナリオ:トラフィックベースのカナリアリリース

シンプルなトラフィックベースのカナリアリリースを例に、K8s でどのように実装するかを見てみましょう。

外部アクセスを提供するサービスを作成します。K8s では、以下のリソースを作成する必要があります。

・ Deployment:アプリケーションをデプロイするためのワークロード

・サービス:サービスアクセスとロードバランシング機能を提供

・ Ingress:外部へのドメイン名アクセス機能を提供

・ HPA:負荷(CPU、メモリ)に応じた自動伸縮を実現するために HPA を作成

初期段階では、V1 を通じてサービスを提供します。新バージョンのカナリアリリースが必要な場合は、対応する V2 リソースを作成し、Ingress を通じて V1 と V2 のトラフィックを直接分割します。図に示す通りです。

ご覧のように、K8s でのカナリアプロセスはトラフィックベースです。新バージョンに対応するリソースの作成や、カナリア完了後の旧バージョンのリソースクリーンアップを含め、これらのリソースをきめ細かく制御する必要があります。ユーザーにとっては依然として複雑です。では、Knative ではどのようにカナリアリリースを行うのでしょうか。

・ Knative サービスの作成

・ Knative サービスの更新

・バージョンのトラフィック比率の調整

ここでは Knative Service リソースのみを操作すれば済みます。新しい変更は、Knative Service の情報(イメージなど)を更新するだけで、新バージョンが自動的に作成されます。カナリア手順については、Knative Service で対応バージョンのトラフィック比率を調整するだけです。以下に示す通りです。

上記のカナリアリリースを確認したところで、Knative のアプリケーションモデルについてさらに解説します。

アプリケーションモデル

Knative は、サービスのデプロイ、サービスアクセス、およびカナリアリリースの要件を満たす最小限のアプリケーションモデル - Knative Service を提供します。次の式で理解できます:Knative Service = ワークロード + サービスアクセス + カナリアトラフィック + 自動伸縮。アプリケーションモデルは以下の通りです。

・ Service:サーバーレスアプリケーションモデルを抽象化し、サービスを通じてアプリケーションのライフサイクルを管理

・ configuration:アプリケーションが期待する設定情報を設定。サービスが更新されるたびに configuration も更新される

・ revision:configuration の各更新時にスナップショットを作成し、バージョン管理を行う

・ route:リクエストをリビジョンにルーティングし、異なるリビジョンに異なる割合のトラフィックを転送

豊富な柔軟戦略

サーバーレスフレームワークとして、その中核となる機能は自動伸縮です。Knative はさまざまな伸縮戦略を提供します。

・トラフィックリクエストに基づく自動拡張・縮小 - KPA

・ CPU とメモリに基づく自動スケーリング - HPA

・タイミングベース + HPA の自動スケーリング戦略をサポート

・イベントの正確な配信戦略を満たすイベントゲートウェイを提供

Knative と ASK の統合

まず ASK について学びましょう。一般的に、K8s を使用するには事前に IaaS リソースを準備してアプリケーションをデプロイする必要があり、これはサーバーレスの本来の理念に反します。その答えが ASK です。

ASK は Alibaba Cloud が提供するサーバーレス Kubernetes です。ユーザーはノードを購入することなく、ノードメンテナンスやクラスター容量計画なしで、コンテナアプリケーションを直接デプロイできます。ASK クラスターは完全な Kubernetes 互換性を提供し、Kubernetes の使用障壁を大幅に低減することで、ユーザーは基盤インフラの管理ではなくアプリケーションに集中できます。

・運用保守不要:すぐに使え、ノード管理、運用保守、セキュリティメンテナンスが不要

・極致の伸縮性:容量計画不要で、秒単位でスケールアウトし、30 秒で 500 Pod までスケールアウト

・低コスト:オンデマンドで Pod を作成し、スポット(プリエンプティブル)インスタンスとリザーブドインスタンスをサポート

・ K8s 互換:Deployment / StatefulSet / Job / Service / HPA / CRD などをサポート

・ Knative:トラフィックベースのアプリケーション自動伸縮とリザーブドインスタンスへの縮小

・ストレージマウント:クラウドディスク、NAS、OSS ストレージボリュームをサポート

・エラスティックワークロード:オンデマンドとスポットインスタンスの混合スケジューリングをサポート

・ ARMS / SLS などのクラウドプロダクトとの統合

Knative の運用保守の課題

ASK について理解したところで、Knative 自体が抱える現在の課題を見てみましょう。

・ゲートウェイ。ネイティブコミュニティは Istio ゲートウェイ機能を提供していますが、Istio コンポーネントは多数あり、ユーザーはこれらのコンポーネントに対してリソースと運用保守コストを負担する必要があります。(現在のコミュニティでは Istio がデカップリングされ、ユーザーはより軽量なゲートウェイを自ら選択できますが、リソースと運用保守コストは依然として必要です)

・ Knative 管理コンポーネント。現在、7 つの管理コンポーネントの運用保守が必要で、ユーザーは追加のリソースと運用保守コストを負担する必要があります

・コールドスタート問題。サーバーレスはアプリケーションのコールドスタート問題を避けて通れません。0 から 1 への起動時に、サービスの高速応答をどう保証するかを検討する必要があります

上記の課題に対し、ASK Knative では以下の機能を提供しています。

ゲートウェイと SLB の統合

Alibaba Cloud SLB を通じてゲートウェイ機能を提供します。

・コスト削減:10 以上のコンポーネントを削減し、運用保守コストと IaaS コストを大幅に低減

・安定性:SLB クラウドプロダクトによるサービスは、より安定していて信頼性が高く、使いやすい

管理コンポーネントのホスティング

Knative 管理コンポーネントをホスティングします。

・すぐに使える:ユーザーはサーバーレスフレームワークを直接使用でき、自らインストールする必要がない

・運用保守不要、低コスト:Knative コンポーネントと K8s クラスターが統合され、ユーザーは運用保守の負担を負わず、追加のリソースコストも不要

・高い管理性:すべてのコンポーネントがコントロールプレーンにデプロイされ、アップグレードとイテレーションが容易

リザーブドインスタンス

0 から 1 へのコールドスタート問題を解決します。

・コールドスタートフリー:予約済みインスタンスにより、0 から 1 への 30 秒のコールドスタート時間を排除

・コスト制御可能:バーストパフォーマンスインスタンスのコストは標準仕様インスタンスより 40% 低く、スポットインスタンスと組み合わせればさらにコストを削減可能

デモ例

・ ASK クラスターに Knative をインストール

・ helloworld アプリケーションのデプロイとアクセス

・予約済みインスタンス

ASK クラスターに Knative をインストール

現在、ASK クラスターの作成時に Knative をインストールすることがサポートされています。ASK クラスターの作成完了後、「アプリケーション > Knative」のコンポーネント管理タブをクリックして Knative をデプロイすることもできます。既存の ASK クラスターへの Knative デプロイ操作は以下の通りです。

1. コンテナサービス管理コンソールにログインします。

2. コンソールの左ナビゲーションバーで「クラスター」をクリックします。

3. クラスター一覧ページで、対象クラスター名または操作列の「詳細」をクリックします。

4. クラスター管理画面の左ナビゲーションバーで、「アプリケーション > Knative」を選択します。

5. Knative の「コンポーネント管理」タブをクリックして、Knative をデプロイします。

6. インストールする Knative コンポーネントを選択し、「デプロイ」をクリックします。

Knative のデプロイ完了後の結果は以下の通りです。

helloworld アプリケーションのデプロイとアクセス

1. コンテナサービス管理コンソールにログインします。

2. クラスター一覧ページで、対象クラスター名または操作列の「詳細」をクリックします。

3. クラスター管理画面の左ナビゲーションバーで、「アプリケーション > Knative」を選択します。

4. サービス管理タブの右上にある「サービスを作成」をクリックします。

5. クラスター、名前空間、サービス名を設定し、使用するイメージとイメージバージョンなどの設定情報を選択します。ここでは helloworld のサンプルイメージを使用します。

6. 「作成」をクリックします。作成後、サービス管理タブの一覧に新しく作成されたサービスが表示されます。サービス名をクリックすると、サービス詳細ページに入ります。内容は以下の通りです。

7. サービスアクセス。

ドメイン名をホストにバインドしてアクセスするか、以下のように curl コマンドで直接アクセスすることもできます。

予約済みインスタンス

予約済みインスタンスの準備が整うと、通常インスタンスはオフラインになります。

Related Articles

Explore More Special Offers

  1. Short Message Service(SMS) & Mail Service

    50,000 email package starts as low as USD 1.99, 120 short messages start at only USD 1.00

phone お問い合わせ
Hi, I'm Alibaba Cloud AI Assistant!
I can help with questions and solutions.