Kubernetes は、組み込み機能を拡張する方法を提供します。最も一般的に使用されるのは、おそらくカスタム リソース タイプとカスタム コントローラーです。さらに、Kubernetes には、API を拡張し、特定の Kubernetes リソースの基本的な動作を変更するために使用できる、アドミッション Webhook などの非常に興味深い機能がいくつかあります。 アドミッション コントローラーは、オブジェクトが永続化される前に Kubernetes API サーバーへのリクエストをインターセプトし、認証と承認後にリクエストを通過させるコード スニペットです。アドミッション コントローラは、検証、変更、またはその両方を行うことができます。変更コントローラーは処理するリソース オブジェクトを変更できますが、検証コントローラーは変更できません。どのフェーズでもいずれかのコントローラーがリクエストを拒否した場合、リクエスト全体が直ちに拒否され、エンド ユーザーにエラーが返されます。 つまり、Kubernetes API リクエストをインターセプトし、カスタム ロジックに基づいてリクエストを変更または拒否できる特別なコントローラーが存在するということです。 Kubernetes には、実装するコントローラーのリストがあります: https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#what-does-each-admission-controller-do。もちろん、独自のコントローラーを作成することもできます。これらのコントローラーはより強力に聞こえますが、kube-apiserver にコンパイルする必要があり、apiserver が起動したときにのみ起動できます。 kube-apiserver 起動パラメータを直接使用して、サポートされている組み込みコントローラーを表示することもできます。 kube - apiserver --ヘルプ| grep有効化-入場-プラグイン 上記のコントローラーの制限により、API サーバーと結合する代わりに動的な概念を使用する必要があります。 Admission Webhook は、動的な構成方法を通じてこの制限を解決します。 アドミッションウェブフックとは何ですか?Kubernetes apiserver には、MutatingAdmissionWebhook と ValidatingAdmissionWebhook という 2 つの特別なアドミッション コントローラーが含まれています。これら 2 つのコントローラは、外部 HTTP コールバック サービスにアドミッション要求を送信し、アドミッション応答を受信します。両方のアドミッション コントローラーが有効になっている場合、Kubernetes 管理者はクラスター内にアドミッション Webhook を作成して構成できます。 全体的な手順は次のとおりです。
これら 2 種類のアドミッション Webhook の違いは非常に明確です。検証 Webhook はリクエストを拒否できますが、アドミッション リクエストで取得されたオブジェクトを変更することはできません。一方、変更 Webhook は、アドミッション レスポンスを返す前にパッチを作成することでオブジェクトを変更できます。 Webhook がリクエストを拒否した場合、エンドユーザーにエラーが返されます。 人気のサービス メッシュ アプリケーション istio は、変更可能な Webhook を通じて Envoy サイドカー コンテナーを Pod に自動的に挿入します: https://istio.io/latest/docs/setup/additional-setup/sidecar-injection/。 入場Webhookの作成と設定以上、Admission Webhookの理論的な知識を紹介しました。次に、実際の Kubernetes クラスターでテストします。 Webhook Web サーバーを作成し、クラスターにデプロイしてから、Webhook 構成を作成して動作するかどうかを確認します。 まず、API サーバーで MutatingAdmissionWebhook および ValidatingAdmissionWebhook コントローラーが有効になっていることを確認します。 --enable-admission-plugins パラメータを使用して設定します。現在の v1.25+ バージョンには、デフォルトの有効化が組み込まれています。有効になっていない場合は、これら 2 つのパラメータを追加して、apiserver を再起動します。 次に、次のコマンドを実行して、クラスターでアドミッション登録 API が有効になっているかどうかを確認します。 ☸ ➜ kubectl api -バージョン| grep入場 これらの前提条件を満たしたら、Admission Webhook サーバーを作成できます。これは、実際には、サービス内の APIServer によって送信された AdmissionReview リクエストを処理する Web サーバーを開発することです。形式は次のとおりです。 { 次に、AdmissionReview オブジェクトを構築して返します。 { 応答を決定するフィールドは .response.uid と .response.allowed です。前者はリクエストを一意に識別し、後者はリクエストが通過したかどうかを示します。ステータス フィールドは主にエラー プロンプトに使用されます。 Kubernetes e2e テスト https://github.com/kubernetes/kubernetes/blob/release-1.25/test/images/agnhost/webhook/main.go のサンプル実装コードを直接参照できます。 Webhookの作成これまでの前提条件が整ったので、2 つの異なる HTTP エンドポイント (validate と mutate) をリッスンして、検証および変更 Webhook 検証を実行する Webhook の例を実装してみましょう。 この Webhook の完全なコードは Github で入手できます: https://github.com/cnych/admission-webhook-example (train4 ブランチ)。この Webhook は、Deployment を使用してクラスターにデプロイされた、TLS 認証を備えたシンプルな HTTP サービスです。 コードの主なロジックは、main.go と webhook.go の 2 つのファイルにあります。 main.go ファイルには HTTP サービスを作成するコードが含まれており、webhook.go には 2 つの webhook、検証、および変更のロジックが含まれています。コードの大部分は比較的単純です。まず、main.go ファイルを見て、標準の golang パッケージを使用して HTTP サービスを開始する方法と、コマンドライン フラグから TLS 構成証明書を読み取る方法を確認します。 フラグ。 StringVar ( &パラメータ. certFile , "tlsCertFile" , "/etc/webhook/certs/cert.pem" , "HTTPS の x509 証明書を含むファイル。" ) 次に重要なのは、mutate 関数と validating 関数に渡された HTTP リクエストを処理するために使用される serve 関数です。この関数は、リクエストから AdmissionReview オブジェクトを逆シリアル化し、いくつかの基本的なコンテンツ検証を実行し、URL パスに基づいて適切な mutate 関数と validate 関数を呼び出して、AdmissionReview オブジェクトをシリアル化します。 // Webhook サーバーの Serve メソッド 主な承認ロジックは、検証関数と変更関数です。検証関数は、リソース オブジェクトを検証する必要があるかどうかを確認します。kube-system 名前空間内のリソースは検証されません。リソースが検証されていないことを明示的に宣言する場合は、リソース オブジェクトに admission-webhook-example.qikqiak.com/validate=false アノテーションを追加して宣言できます。検証が必要な場合、サービスまたはデプロイメント リソースは、リソース タイプの種類とタグを対応する項目と比較した上で、リクエストから逆シリアル化されます。一部のラベル タグが欠落している場合、応答の Allowed は false に設定されます。検証が失敗した場合、失敗の理由が応答に書き込まれ、エンドユーザーがリソースを作成しようとしたときに失敗メッセージが表示されます。検証関数は次のように実装されます。 // デプロイメントとサービスを検証する 検証が必要かどうかを判断する方法は次のとおりです。名前空間を通じて無視することも、注釈設定を通じて構成することもできます。 関数validationRequired ( ignoredList []文字列、メタデータ* metav1.ObjectMeta ) bool { mutate 関数のコードは非常に似ていますが、タグを比較して応答に Allowed を設定するのではなく、不足しているタグをリソースに追加し、not_available をタグの値に設定するパッチが作成されます。 // メインの変異プロセス 建てる実際、コードを Docker イメージにパッケージ化しているので、直接使用できます。イメージ リポジトリのアドレスは cnych/admission-webhook-example:v4 です。もちろん、コードの一部を変更する場合は、プロジェクトを再構築する必要があります。このプロジェクトは go 言語で開発されており、パッケージ管理ツールが go mod に変更されているため、事前にビルド環境に go 環境がインストールされていることを確認する必要があります。もちろん、docker イメージにパッケージ化する必要があるため、docker も不可欠です。 プロジェクトを入手: ☸ ➜ mkdir admission - webhook && cd admission - webhook コードのルート ディレクトリの下にビルド スクリプトがあることがわかります。独自の Docker イメージのユーザー名を指定して、直接ビルドするだけです。 ☸ ➜ DOCKER_USER = cnychをエクスポートします 展開するapiserver に Admission Webhook を登録します。 apiserver はどのようにしてサービスの存在を認識し、インターフェースを呼び出すのでしょうか?これには、ValidatingWebhookConfiguration オブジェクトと MutatingWebhookConfiguration オブジェクトの使用が必要です。このリソース オブジェクトを作成することにより、apiserver は ValidatingAdmissionWebhook コントローラー モジュールに webhook を登録します。このオブジェクトを作成するときに注意すべき点がいくつかあります。
ここでは、以下に示すように ValidatingWebhookConfiguration オブジェクトを作成します。 apiバージョン: admissionregistration 。 k8s 。 io / v1 このオブジェクトでは、検証 Webhook を登録し、clientConfig.service を通じて Webhook のアドレスを指定します。通常は、caBundle のコンテンツも指定する必要がありますが、cert-manager を使用して CA コンテンツを自動的に挿入できるように、ここで cert-manager.io/inject-ca-from: default/admission-example-tls-secret アノテーションを設定します。さらに、namespaceSelector も構成して、admission-webhook-example: enabled ラベルを持つ名前空間にのみ Webhook が適用されるように指定します。 したがって、ここでも cert-manager をデプロイする必要があります。 ☸ ➜ kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.10.1/cert-manager.yaml インストールが完了すると、次の Pod が cert-manager 名前空間で実行されます。 ☸ ➜ kubectl get pods - n cert - manager cert-manager には、CA バンドルを Mutating に挿入する CA インジェクターと呼ばれるコンポーネントがあります。 WebhookConfigurationを検証しています。 Mutating | でキー certmanager.k8s.io/inject-ca-from を持つアノテーションを使用する必要があります。 ValidatingWebhookConfiguration オブジェクト。アノテーションの値は、<certificate-namespace>/<certificate-name> の形式で既存の証明書 CR インスタンスを指す必要があります。 ここでは、以下に示すように、自己署名発行者のみを必要とする証明書オブジェクトを作成します。 apiバージョン: cert-manager.io/v1 ここでの Certificate オブジェクトの名前は上記の注釈に対応する必要があり、その後、発行された最終証明書を admission-webhook-example-certs という名前の Secret オブジェクトに書き込むことに注意してください。 次に、Webhook サーバーをデプロイします。展開は非常に簡単で、サービスの TLS 構成を構成するだけで済みます。コード ルート ディレクトリの下のデプロイメント フォルダーの下にある deploy.yaml ファイルで証明書に関する構成宣言を確認すると、コマンド ライン パラメーターから読み取られた証明書と秘密キー ファイルがシークレット オブジェクトを介してマウントされていることがわかります。 引数: admission-webhook-example-certs オブジェクトは、上記の Cert-manager によって作成された Certificate オブジェクトによって自動的に生成されます。シークレット オブジェクトが正常に作成されると、デプロイメント オブジェクトとサービス オブジェクトを直接作成できます。 ☸ ➜ kubectl apply -fデプロイメント/ rbac .yaml 次に、デフォルトの名前空間に次のタグを追加します。 ☸ ➜ kubectlラベル名前空間デフォルトアドミッション- webhook -例=有効 最後に、上記の validatingwebhookconfigurations オブジェクトを作成できます。正常に作成されると、リクエストをインターセプトして webhook サービスを呼び出します。 ☸ ➜ kubectl でWebhook構成を検証する テストそれでは、デプロイメント リソースを作成して、それが効果的かどうかを確認しましょう。コード リポジトリには sleep.yaml リソース マニフェスト ファイルがあります。直接作成することもできます: ☸ ➜ kubectl apply -fデプロイメント/スリープ.yaml 通常、必要なラベルが何も作成されていないため、作成時に上記のエラー メッセージが表示されます。その後、sleep-with-labels.yaml の別のリソース リストをデプロイします。 ☸ ➜ kubectl apply -fデプロイメント/ sleep -with - labels .yaml 展開が正常であることがわかります。次に、上記のデプロイメントを削除し、別の sleep-no-validation.yaml リソース マニフェストをデプロイします。このマニフェストには必要なラベルが存在しませんが、admission-webhook-example.qikqiak.com/validate=false アノテーションが設定されているため、正常に作成できます。 ☸ ➜ kubectlデプロイメントスリープを削除する ミューテーティングWebhookをデプロイする同じ方法で、MutatingWebhookConfiguration オブジェクトを作成できます。まず、変更の干渉を防ぐために上記の検証 Webhook を削除し、新しい構成をデプロイします。 mutating webhook の構成は、validating webhook と基本的に同じですが、webook サーバーのパスは /mutate です。 apiバージョン: admissionregistration 。 k8s 。 io / v1 これで、スリープ アプリケーションを再度デプロイし、ラベルが正しく追加されたかどうかを確認できます。 ☸ ➜ kubectlでmutatingwebhook 設定を取得します 最後に、検証 Webhook を再作成して一緒にテストしてみましょう。ここで、もう一度睡眠アプリを作成してみます。通常は正常に作成できます。 アドミッション制御は 2 つのフェーズで実行されます。最初のフェーズでは、変更アドミッション コントローラが実行され、2 番目のフェーズでは、検証アドミッション コントローラが実行されます。 したがって、変更 Webhook は最初のフェーズで不足しているラベルを追加し、ラベルがすでに存在し、その値が not_available で設定されているため、検証 Webhook は 2 番目のフェーズでデプロイメントを拒否しません。 ☸ ➜ kubectl apply -fデプロイメント/ validatingwebhook .yaml しかし、このような関連要件がある場合、アドミッション コントローラー用の Webhook を個別に開発するのは非常に面倒で柔軟性に欠けます。この問題を解決するには、Kyverno、Gatekeeper など、Kubernetes が提供するポリシー管理エンジンを使用して、コードを記述せずに要件を満たすことができます。公式の Kubernetes v1.26 バージョンでは、ポリシー管理のサポートも追加されました。 |
<<: クラウドコンピューティングが企業を変革し、モバイル化する方法
>>: オラクル、2023年のクラウドコンピューティングに関する5つの予測を発表
COVID-19 パンデミックは、銀行業界が長年にわたって議論されてきた大きな問題、つまりクラウド ...
2月20日、アリババクラウドリサーチセンターは「2019年デジタルトレンドレポート」を発表しました。...
今はモバイルの時代です。パソコン、携帯電話、タブレット、スマートテレビ、車など、さまざまなモバイル端...
多くの郡レベルのウェブサイトを分析した結果、ほとんどの郡にはまだ市場の可能性が残っていることがわかり...
インド企業であるhostnamasteは、2017年にドメイン名を登録しました。同社は主にホスティン...
考えてみてください。WeChat のパブリック アカウントは、実際には雑誌、テレビ番組、有名ブランド...
Pacificrack は、まったく新しい「サイト クラスター VPS」を導入しました。これは、デフ...
セキュリティ問題に関する小さな提案でさえ、クラウド コンピューティング プロジェクトを台無しにし、ク...
SEO は長年にわたって発展してきました。検索エンジンのアルゴリズムが継続的に改善されるにつれて、多...
1. Weiboの主要アカウントが消滅。これはWeiboの急成長期の極端な例です。彼らはWeib...
もう一度Hostodoを紹介させてください。その理由は、QuadraNetのロサンゼルスデータセンタ...
昨日、多くのSEO担当者の強い要望により、SEO業界最強のSEOフォーラムBSGの管理者がWeibo...
過去 10 年間で、クラウド コンピューティングは、インターネット ベースのコンピューティングの一種...
racknerd からの最新ニュース: (1) DC-02 のこれまでの VPS プロモーションはす...
2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています驚異的な国...