|
OPAのGatekeeperとKyvernoは、CNCFの主要なポリシー管理プロジェクトです。それぞれに独自の利点があります。Gatekeeperについては既に学習しました。次はKyvernoの使い方を学びます。 KyvernoはNirmataが開発したオープンソースプロジェクトで、後にCNCFに寄贈されました。Gatekeeperと同様に、Kyvernoは検証と変更機能を備えたKubernetesポリシーエンジンですが、リソース生成機能とAPIオブジェクトクエリ機能も追加されています。Gatekeeperとは異なり、Kyvernoは元々Kubernetes向けに開発されました。Gatekeeperと比較すると、Kyvernoはオブジェクト生成機能以外にポリシー記述に専用の言語を必要としません。実装言語の観点から見ると、Kyvernoのモデルはよりシンプルです。GatekeeperのRego言語には、ある程度の学習曲線があります。 同様に、Kyverno は Kubernetes クラスター内で動的アドミッションコントローラーとして動作します。Kyverno は、kube-apiserver から認証およびアドミッション変更の Webhook HTTP コールバックを受信し、一致するポリシーを適用し、アドミッションポリシーを適用するかリクエストを拒否するかの結果を返します。Kyverno のポリシーは、リソースの種類、名前、タグセレクターを使用してリソースをマッチングでき、名前にはワイルドカードがサポートされています。 ポリシーの適用はKubernetesイベントを介してキャプチャされ、Kyvernoは既存のリソースのポリシー違反も報告します。次の図は、Kyvernoの全体的なアーキテクチャを示しています。 キヴェルノ建築 高可用性のKyvernoインストールは、複数のレプリカを実行することで実現できます。各レプリカには、異なる機能を実行する複数のコントローラーが配置されます。WebhookはKubernetes APIServerからのAdmissionReviewリクエストを処理し、そのMonitorコンポーネントは必要な設定を作成および管理します。PolicyControllerはポリシーリソースを監視し、設定されたスキャン間隔に基づいてバックグラウンドスキャンを開始します。GenerateControllerは生成されたリソースのライフサイクルを管理します。 対比Gatekeeper と Kyverno はどちらもポリシー管理プロジェクトなので、これら 2 つのプロジェクトの長所と短所を比較するのは当然です。 ゲートキーパーの利点
ゲートキーパーの欠点
Kyvernoの利点
Kyvernoの欠点
上記の比較から、Gatekeeperの最大の弱点は、ポリシーロジックの実装にRego言語に依存していることが分かります。この言語は他では利用できません。これにより参入障壁が大幅に高まりますが、プログラミング言語では非常に強力なロジックを実装できるため、メリットにもなり得ます。対照的に、Kyvernoの第一印象は技術要件の低さです。Kubernetes専用に構築されており、宣言的なアプローチでポリシーを表現し、Kubernetesオブジェクトの記述と調整方法にモデルを合わせています。これにより、ポリシーの記述が大幅に簡素化され、ポリシーエンジンの使用難易度が大幅に軽減されます。さらに、Kyvernoのコンパイルおよび生成機能により、単純なアドミッションコントローラーから真の自動化ツールへと変貌を遂げています。これら3つの機能と、最近追加されたAPIクエリ機能を組み合わせることで、KyvernoはGatekeeperではできないタスクを実行できます。このシンプルさと自動化機能、そして他のツールとの統合により、初心者と経験豊富なユーザー、そしてオペレーターの両方に計り知れない価値をもたらします。 もちろん、選択する特定のツールは、独自のニーズと制約に基づいて評価する必要がありますが、1 つ確かなことは、実稼働環境のすべてのユーザーは、クラスターのセキュリティを保護し、Kubernetes の管理を簡素化するために、ポリシー エンジンの使用を計画する必要があるということです。 インストール次のコマンドを実行すると、最新バージョンのリソース リストから Kyverno を直接インストールすることを選択できます。 ➜ kubectl create -f https://raw.githubusercontent.com/kyverno/kyverno/main/config/install.yaml あるいは、Helm を使用してワンクリック インストールを行うこともできます。 ➜ Helm リポジトリにkyverno を追加https://kyverno.github.io/kyverno/ インストール後、kyverno 名前空間が作成され、関連する CRD もいくつか含まれます。 ➜ kubectl ポッドを取得- n kyverno ご覧のとおり、インストール後にいくつかの validatingwebhookconfiguration オブジェクトと mutatingwebhookconfigurations オブジェクトが作成されました。 戦略とルールKyverno の使用は、基本的にポリシーとルールの適用です。Kyverno ポリシーはルールの集合です。各ルールは、match 宣言、exclude 宣言(オプション)、および validate、mutate、generate、verifyImages のいずれかの宣言で構成されます。各ルールには、validate、mutate、generate、verifyImages のいずれかのサブ宣言を 1 つだけ含めることができます。 キベルノ戦略 ポリシーは、クラスター全体のリソース (ClusterPolicy) または名前空間レベルのリソース (Policy) として定義できます。
戦略の定義ポリシーを記述することは、基本的に Policy または ClusterPolicy オブジェクトを定義することです。 リソースを確認する検証ルールは、私たちが使用する最も一般的で実用的なルールタイプです。ユーザーまたはプロセスが新しいリソースを作成すると、Kyvernoは検証ルールに従ってリソースの属性をチェックします。検証に合格した場合、リソースの作成は許可されます。検証に失敗した場合、作成はブロックされます。例えば、すべてのポッドにkyvernoタグを含めることを要求するポリシーを追加してみましょう。 # kyverno - require - label .yaml 上記のポリシー ファイルには、`validationFailureAction=[audit, enforce]` 属性が含まれています。
次は、`rules` 属性を使用して定義される一連のルールです。`match` は照合するリソースを指定するために使用され、`validate` は検証方法を指定します。ここでは、`kyverno: "?*"` のようなタグを定義して、そのようなタグキーが必須であることを示します。 上記の戦略オブジェクトを適用するだけです。 ➜ kubectl apply -f kyverno -require -label .yaml 次に、「kyverno」タグなしで Pod を追加してみましょう。 ➜ kubectl run busybox -- image = busybox : 1.28 .4 -- restart = Never -- sleep 1000000 ご覧の通り、kyvernoタグが必要です。同様に、イベントセクションでポリシーがどのように適用されているかを確認できます。 ➜ kubectl イベントを取得- A - w 作成する Pod に kyverno タグが付いている場合は、通常どおり作成できます。 ➜ kubectl run busybox -- image = busybox : 1.28 .4 -- labels kyverno = demo -- restart = Never -- sleep 1000000 validationFailureAction の値を audit に変更すると、kyverno タグが付いていない場合でも、作成する Pod は正常に作成されます。ただし、対応する違反レポートは PolicyReport オブジェクトで確認できます。 ➜ kubectl ポリシーレポートを取得する ポリシーに違反したリソース オブジェクトは、上記のレポート リソースから確認できます。 ルールを変えるルールを変更すると、ルールに一致するリソースを変更できます (たとえば、ルールによってリソースのメタデータと結合できるメタデータ フィールドが設定されている場合)。つまり、設定したルールに従って対応するリソースが変更されます。 たとえば、nginx イメージを含むすべてのポッドにタグ (kyverno=nginx) を追加する、次のようなポリシーを追加します。 # kyverno - 変異- ラベル.yaml 上記の戦略オブジェクトを適用するだけです。 ➜ kubectl apply -f kyverno -mutate -label .yaml ここで、nginx イメージを使用して Pod を直接作成します。 ➜ kubectl run --image = nginx nginx ご覧の通り、Podは正常に作成され、kyverno=nginxタグが含まれています。kyvernoタグのおかげで上記の検証戦略は成功し、Podを正常に作成できます。 リソースを生成する生成ルールは、名前空間の新しい RoleBinding や Secret の作成など、新しいリソースを作成したりソースを更新したりするときに追加のリソースを作成するために使用できます。 例えば、特定のシークレット(TLSキーやミラーリポジトリの認証情報など)を他の名前空間に同期する必要がある場合、これらのシークレットを手動でコピーするのは面倒です。Kyvernoを使用すれば、これらのシークレットを同期するための戦略を作成できます。例えば、`default`名前空間に`regcred`という名前のシークレットオブジェクトがあり、これを別の名前空間にコピーする必要がある場合、コピー元のシークレットが変更されると、コピー先のシークレットも更新されます。 # kyverno - 生成- シークレット.yaml まず、デフォルトの名前空間に Secret オブジェクトを準備します。 ➜ kubectl create secret docker - registry regcred -- docker - server = DOCKER_REGISTRY_SERVER -- docker - username = DOCKER_USER -- docker - password = DOCKER_PASSWORD -- docker - email = DOCKER_EMAIL 次に、上記の同期された秘密戦略を適用します。 ➜ kubectl apply -f kyverno -generate -secret .yaml 次に、新しい名前空間を作成しましょう。 ➜ kubectl ns テストを作成 ご覧のとおり、新しく作成された名前空間に新しい regcred Secret オブジェクトが作成されています。 Kyvernoのポリシーは公式サイト(https://kyverno.io/policies)でご覧いただけます。ポリシーは種類、カテゴリ、テーマなどで絞り込むことができます。Kyvernoは柔軟性、パワー、使いやすさのバランスが取れています。多くの学習時間を必要とせず、便利な機能を提供します。公式サイトには様々なシナリオに対応した豊富な例が掲載されているため、ぜひ活用してみてください。 |