Kyvernoに関して、ユースケースを交えながらご説明させていただきました。 また、Red Hat Advanced Cluster Management for Kubernetesとの連携についてもご紹介させていただいてます。
#Kyverno #kyverno #OPA # jsPolicy #ポリシー制御 #RHACM
KyvernoとRed Hat ACM for Kubernetesを用いたマルチクラスターの一元的なポリシー制御2023/01/27OpenShift.Run 2023Ryotaro Uwatsu
View Slide
Copyright © Dell Inc. All Rights Reserved.2 of Y自己紹介Name: Ryotaro Uwatsu (@URyo_0213)Title: Solutions ArchitectCommunity:- Kubernetes Meetup Novice 運営- Kubenews- Cloud Native Days Tokyo
Copyright © Dell Inc. All Rights Reserved.3 of YTable of contents• Kyverno• Kyvernoにおけるポリシー制御• Red Hat Advanced Cluster Management for Kubernetes
Copyright © Dell Inc. All Rights Reserved.4 of YKyvernoとは
Copyright © Dell Inc. All Rights Reserved.5 of YKyvernoKyvernoはKubernetesクラスター内で、Dynamic AdmissionControllerとして実行されるポリシーエンジン。kube-apiserverからAdmission Webhookを受け取り、定義したポリシーに基づいて制御を実行します。Custom Resourceを用いて、Kubernetesのマニフェストベースでポリシーを適用できるため、学習コストがとても低い。バージョン: 1.8.0https://github.com/kyverno/kyverno
Copyright © Dell Inc. All Rights Reserved.6 of YDynamic Admission ControlAuthenticationAuthorizationMutatingAdmissionObjectSchemaAdmissionValidatingAdmissionPersist datato etcdWebhookWebhookWebhookWebhookKyverno
Copyright © Dell Inc. All Rights Reserved.7 of YKyvernoの利点1. 学習コストが低い他のOPAやjsPolicyなどでは、固有の言語を覚える必要がります。一方で、Kyvernoでは、Kubernetesのマニフェストをベースに記載することができます。OPA Gatekeeper (Rego)jsPolicy (JavaScript or TypeScript)Kyverno
Copyright © Dell Inc. All Rights Reserved.8 of YKyvernoの利点2. 豊富な機能他のツールでは実装されていない機能が、Kyvernoでは使うことができます。Name Validation Mutation GenerationImageVerificationMetric ExposedPolicyEngineOPA Gatekeeper Yes Yes NoYes(via extensions)YesjsPolicy Yes Yes No No NoKyverno Yes Yes Yes Yes Yes
Copyright © Dell Inc. All Rights Reserved.9 of YKyvernoの利点3. 開発が活発他ツールと比べ開発が活発であり、新機能の追加や改善のサイクルが早い。Name Star Fork Release Contributor CommitPolicyEngineOPA Gatekeeper 2.9k 21 9 174 1,174jsPolicy 249 637 73 9 124Kyverno 3.4k 489 158 197 5,312
Copyright © Dell Inc. All Rights Reserved.11 of YKyvernoにおけるポリシー制御
Copyright © Dell Inc. All Rights Reserved.12 of YKyvernoによるポリシーの適用Kyvernoを用いてポリシーを適用する際に用いるリソースは2つあります。1. Cluster Policy: クラスター全体にポリシーを適用する際に用いる。2. Policy: Namespace内に閉じたポリシーを適用する際に用いる。注意点としては、ポリシー間での順序性が存在しないため、複数のポリシーを組み合わせたルールの拡張しかできません。すなわちPolicy間での上書きができないので、Cluster Policyで厳しめのPolicyを設定しておいて、あるNamespaceにおいてはPolicyを用いて制限を緩めるということができません。
Copyright © Dell Inc. All Rights Reserved.13 of Yポリシー構造PolicyRulePreconditionsMatchExcludeValidate ResourcesMutate ResourcesGenerate ResourcesVerify Images対象の決定アクション
Copyright © Dell Inc. All Rights Reserved.14 of Yポリシー構造
Copyright © Dell Inc. All Rights Reserved.15 of Y詳しい記述方法についてCloud Native Days Tokyo 2022 にて、ポリシーの詳細な記述方法等について紹介しています。登壇資料は、Twitter(@Uryo_0213) の固定ツイートにもあります。https://event.cloudnativedays.jp/cndt2022/talks/1568
Copyright © Dell Inc. All Rights Reserved.16 of Y対象の決定Match(必須)ルールを適用するリソースを指定する。Exclude Preconditions以下の3つの表現を用いて、ポリシーを適用する対象を決めていきます。(オプショナル)Matchで指定したリソースに対し例外を指定する。(オプショナル)Match等による対象決定のフェーズに進むどうかかを判断する。
Copyright © Dell Inc. All Rights Reserved.17 of YValidate Resourcesユーザーまたはプロセスによって新しいリソースが作成される場合に、そのリソースを作成してよいか否かを判断するために用います。spec.rules[*].validateを用いて記述していくことになります。ルールに違反するリソースに対する挙動はspec.validationFailureActionによって制御することが可能です。• enforce– ルールに違反した場合、作成をブロックする。• audit– ルールに違反した場合に作成は許可する– ポリシーレポートに違反するリソースとして記録する。
Copyright © Dell Inc. All Rights Reserved.18 of YValidate Resourcesのユースケース①特定のラベルが設定されていないリソースの作成を拒否する。PodPodNamespace: app1
Copyright © Dell Inc. All Rights Reserved.19 of YValidate Resources ユースケース①CodeRepositoryManifestRepositoryPushCI ToolManifestwith labelCD ToolKubernetesNamespace: app1PodPod
Copyright © Dell Inc. All Rights Reserved.20 of YValidate Resources ユースケース①spec.rules[0].matchにおいてPodを指定し、spec.rules[0].validateにおいて、作成されるPodのmetadata.labelsに「managed-by: cicd-pipeline」があるのかを検証しています。validationFailureActionを「enforce」にすることで、作成を拒否します。
Copyright © Dell Inc. All Rights Reserved.21 of YValidate Resources ユースケース②必要なパラメータが設定されているのかを確認する。
Copyright © Dell Inc. All Rights Reserved.22 of YValidate Resources ユースケース②spec.rules[0].matchにおいてPodを指定し、spec.rules[0].validateにおいて、作成されるPodのspec.containers[*].resourcesにおいて、CPUとMemoryに対するlimitsとrequestsが設定されているのかを検証しています。validationFailureActionを「audit」にすることで、作成は拒否せず、Policy Reportに違反を記録します。(PolicyReport)
Copyright © Dell Inc. All Rights Reserved.23 of YMutate Resourcesルールに一致したリソースに対して、パラメータに変更を加える際に用います。spec.rules[*].mutateを用いて記述していくことになります。以下の項目を用いてルールを適用することができます。• RFC 6902 JSONPatch• Strategic Merge Patch• Foreach
Copyright © Dell Inc. All Rights Reserved.24 of YManifestRepositoryMutate Resources ユースケースGitOps等を実施していくうえで、シークレット情報の管理は複雑です。Secretは手動で適用するようにすると、運用上のミスに気づけません。DeploymentServicePVCCD Tool KubernetesSecret
Copyright © Dell Inc. All Rights Reserved.25 of YManifestRepositoryMutate Resources ユースケース変更をトレースできるように、Manifest Repository上で管理するようにすると、セキュリティの観点においてリスクになってしまいます。DeploymentServicePVCCD Tool KubernetesSecret
Copyright © Dell Inc. All Rights Reserved.26 of YManifestRepositoryMutate Resources ユースケース対策としてExternal Secretなどがありますが、これも結果的にSecretに関する情報をレポジトリに置いてしまっていたり、環境的な制約があったりします。DeploymentServicePVCCD Tool KubernetesExternalSecretSecret StoreExternalSecretSecret
Copyright © Dell Inc. All Rights Reserved.27 of YMutate Resources ユースケースHashicorp Vaultを用いることで、シークレット情報の一元管理ができ、Podにシークレット情報を容易に引き渡すことができます。以下のようにアノテーションを設定することで、Init Containerが挿入され、特定のディレクトリにシークレット情報を格納してくれます。この機能を利用して、Podにラベルを仕込んでおくだけで、シークレット情報に関係するものをレポジトリに載せることなく、Podに引き渡すことができます。
Copyright © Dell Inc. All Rights Reserved.28 of YMutate Resources ユースケース① 指定のラベル(例: osrun-vault-injection=“true“)を付与したマニフェストをプッシュする。ManifestRepositoryPodKuberneteslabel
Copyright © Dell Inc. All Rights Reserved.29 of YMutate Resources ユースケース② このレポジトリの更新をトリガーに、CDがPodの作成を開始する。ManifestRepositoryPodKubernetesCD ToollabelPodlabel
Copyright © Dell Inc. All Rights Reserved.30 of YMutate Resources ユースケース③ 付与したラベルを事前に設定しておいたPolicyが認識し、アノテーションを付与する。ManifestRepositoryPodKubernetesCD ToollabelPodlabelPodlabelKyvernoPolicyannotation
Copyright © Dell Inc. All Rights Reserved.31 of YMutate Resources ユースケース④ このアノテーションをトリガーに、VaultがPodにInit Containerを挿入する。ManifestRepositoryPodKubernetesCD ToollabelPodlabelPodlabelKyvernoPolicyannotationVaultPodlabelannotationInitContainer
Copyright © Dell Inc. All Rights Reserved.32 of YNamespaceapp1Mutate Resources ユースケース⑤ Init Containerが、アノテーションを基に、シークレット情報を格納する。ManifestRepositoryPodKubernetesCD ToollabelPodlabelPodlabelKyvernoPolicyannotationVaultPodlabelannotationInitContainerPodSecretfile
Copyright © Dell Inc. All Rights Reserved.33 of YMutate Resources ユースケースこのルールでは、osrun-vault-injection: “true”というラベルを持つPodが作成された際に、Vaultに登録をした特定のシークレットデータを、Pod内に指定のフォーマットで配置するためのアノテーションとサービスアカウントを付与しています。
Copyright © Dell Inc. All Rights Reserved.34 of YMutate Resources ユースケース$ vault secrets enable -path=secret kv-v2$ vault kv put secret/osrun/config username="static-user" password="static-password"$ vault policy write osrun - <path "secret/data/osrun/config" {capabilities = ["read"]}EOF$ vault write auth/kubernetes/role/osrun \bound_service_account_names=osrun \bound_service_account_namespaces=default \policies=osrun \ttl=24h
Copyright © Dell Inc. All Rights Reserved.35 of YMutate Resources ユースケースGUIからもシークレット情報を作成可能です。
Copyright © Dell Inc. All Rights Reserved.36 of YMutate Resources ユースケース$ kubectl apply –f strategicMerge.yaml$ kubectl create sa osrun -n default$ kubectl run osrun-app --image nginx:alpine -l osrun-vault-injection="true“$ kubectl exec -it osrun-app -- cat /vault/secrets/osrun-credentialsDefaulted container "osrun-app" out of: osrun-app, vault-agent, vault-agent-init (init)USERNAME=static-userPASSWORD=static-password
Copyright © Dell Inc. All Rights Reserved.37 of YGenerate Resources新しいリソースが作成された際、追加のリソースを作成する場合に用います。spec.rules[*].generateを用いて記述していくことになります。作成するリソースの情報を、以下の2つを用いて記述することができる。• data: 作成するリソースの情報を記述する• clone: 既に存在するリソースをクローンする
Copyright © Dell Inc. All Rights Reserved.38 of YGenerate Resources ユースケース (clone)Namespaceapp3Namespaceapp2Namespaceapp1imagePullSecret imagePullSecret imagePullSecretKubernetes
Copyright © Dell Inc. All Rights Reserved.39 of YGenerate Resources ユースケース (clone)Namespaceapp3Namespaceapp2Namespaceapp1imagePullSecret imagePullSecret imagePullSecretPolicyKubernetesNamespacecredentialLabelprivate-reg: “true”Labelprivate-reg: “true”Labelprivate-reg: “true”imagePullSecret
Copyright © Dell Inc. All Rights Reserved.40 of YGenerate Resources ユースケース (clone)spec.rules[*].generate下では、以下を記述します。• synchronize: ソースリソースとの同期– true:同期をし、更新や削除ができない– false: 同期はせず、生成されたリソースを直接更新または削除できる• apiVersion: 生成するリソースのapiVersion• kind: 生成するリソース• name: 生成するリソース名• namespace: リソースを生成するNamespace• clone: Namespace及びリソース名を記述
Copyright © Dell Inc. All Rights Reserved.41 of YVerify ImagesCosignを使用して、OCIレジストリに格納されているイメージの署名および証明を検証します。現状、ベータ機能であり、プロダクション環境での使用は推奨されていません。spec.rules[*].verifyImagesを用いて記述していくことになります。
Copyright © Dell Inc. All Rights Reserved.42 of YVerify Images ExampleimageReferencesにおいて、指定されているイメージがattestors下で指定されているキーを用いて署名がされているということを検証します。署名をされていないイメージ及び、指定したキーと対ではないキーによって署名されたイメージがこの検証によって拒否されることになります。
Copyright © Dell Inc. All Rights Reserved.43 of YRed Hat Advanced Cluster Managementfor Kubernetes
Copyright © Dell Inc. All Rights Reserved.44 of YRedhat Advanced Cluster Management for KubernetesRedhat Advanced Cluster Management for Kubernetes (以下、ACMという)では、 単一のコンソールで、クラスター管理や管理対象へのアプリケーションのデプロイ、ポリシー制御などをすることができます。
Copyright © Dell Inc. All Rights Reserved.45 of YCloudRedhat Advanced Cluster Management for KubernetesACMは、OpenShift上に構築されます。ACMを構築したクラスターをHub Cluster、管理されるクラスターをManaged Clusterと呼びます。Support Matrix for ver.2.6 (https://access.redhat.com/articles/6968787)OpenShift Container PlatformRedhat ACM for k8sOpenShift on vSphereOpenShift on AWS (ROSA)OpenShift on Azure (ARO)On PremiseManagedClusterHubCluster
Copyright © Dell Inc. All Rights Reserved.46 of Yマルチクラスターに対するポリシー制御各ステージごとにクラスターを作り、アプリケーションのネームスペースに、組織として定めたポリシーを設定していくような場合に、初期においてはあまり問題がありません。DevClusterStgClusterPrdClusterPolicy A Policy Aapp1 app1Policy Aapp1
Copyright © Dell Inc. All Rights Reserved.47 of Yマルチクラスターに対するポリシー制御アプリケーションやクラスターがスケールしていった場合、だんだんとこれらを管理していくことが難しくなっていきます。これに対し、CDツール等を使う場合、様々な考慮点が発生します。DevClusterStgClusterPrdClusterPolicy A Policy Aapp1 app1app2 app2Policy APolicy APolicy ADevCluster(HA)StgCluster(HA)PrdCluster(HA)Policy A Policy Aapp1 app1app2 app2Policy APolicy APolicy Aapp1 app1
Copyright © Dell Inc. All Rights Reserved.48 of YRedhat ACM for k8sPolicy Aマルチクラスターに対するポリシー制御ACMを用いると、ACM内でPolicyを管理することで、管理対象のクラスターにそのポリシーを伝播させることができます。DevClusterStgClusterPrdClusterPolicy A Policy Aapp1 app1app2 app2Policy APolicy APolicy ADevCluster(HA)StgCluster(HA)PrdCluster(HA)Policy A Policy Aapp1 app1app2 app2Policy APolicy APolicy Aapp1 app1
Copyright © Dell Inc. All Rights Reserved.49 of YGovernance on ACMACMでは、以下のようなリソースを用いてポリシーの制御を行います。Redhat ACM for k8sPlacementBindingPlacementRule Policy / PolicySetDevClusterPolicyapp1Policyapp1HubClusterStgClusterPrdCluster
Copyright © Dell Inc. All Rights Reserved.50 of YGovernance on ACMPolicyとKyvernoを連携させることが可能です。Redhat ACM for k8sPlacementBindingPlacementRule Policy / PolicySetDevClusterPolicyapp1Policyapp1KyvernoKyvernoKyverno※ Hub ClusterとManaged Clusterの双方にKyvernoをインストールする必要があります。HubClusterStgClusterPrdCluster
Copyright © Dell Inc. All Rights Reserved.51 of YACMで用いるカスタムリソース・Policyポリシーの定義を書くためのリソースです。オレンジ色で囲った箇所にKyvernoのポリシーを記載することで、KyvernoのポリシーをACMから管理することができます。Kyverno Policy
Copyright © Dell Inc. All Rights Reserved.52 of YACMで用いるカスタムリソース・PolicySetポリシーをグルーピングするためのリソースです。この例では、2つのポリシーをグルーピングしています。
Copyright © Dell Inc. All Rights Reserved.53 of YACMで用いるカスタムリソース・PlacementRuleポリシーの適用対象を決めるためのリソースです。この例では、managed-by-kyverno=“yes”というラベルを持つManaged Clusterが対象になります。
Copyright © Dell Inc. All Rights Reserved.54 of YACMで用いるカスタムリソース・PlacementBindingPolicyもしくはPolicySetとPlacementRuleを紐づけるためのリソース。この例では、指定したPlacementRuleとPolicyを紐づけています。Policy PolicySet
Copyright © Dell Inc. All Rights Reserved.55 of YGovernance on ACM (再掲)PolicyとKyvernoを連携させることが可能です。Redhat ACM for k8sPlacementBindingPlacementRule Policy / PolicySetDevClusterPolicyapp1Policyapp1KyvernoKyvernoKyverno※ Hub ClusterとManaged Clusterの双方にKyvernoをインストールする必要があります。HubClusterStgClusterPrdCluster
Copyright © Dell Inc. All Rights Reserved.56 of YGovernance on ACMACMの機能を用いて、配下のクラスターにアプリケーションをデプロイ可能です。Redhat ACM for k8sPlacementBindingPlacementRule Policy / PolicySetDevCluster StgClusterPrdClusterPolicyapp1Policyapp1KyvernoKyvernoKyvernoHubClusterSubscriptionChannelGitHelm
Copyright © Dell Inc. All Rights Reserved.57 of YGovernance on ACMACM管理下のCluster間で同一のツールを持たせたい場合、OpenShift GitOpsとの連携が便利です。Redhat ACM for k8sPlacementBindingPlacementRule Policy / PolicySetDevClusterPolicyapp1Policyapp1StgClusterPrdClusterHubClusterKyvernoKyvernoKyvernoOpenShiftGitOpsClusterSet
Copyright © Dell Inc. All Rights Reserved.58 of YOpenShift GitOpsによるKyvernoのデプロイArgoCDのApplicationSetリソースを用いることで、Cluster Decision Resource Generator という機能によって、どのClusterにデプロイするかを選定したうえで、template以下に記述したApplicationリソースをクラスター毎に払い出すということをしています。途中に出てくる {{name}} や {{server}} には、今回対象となるClusterの名前や、API URLが入ってきます。
Copyright © Dell Inc. All Rights Reserved.59 of YACM上でのリソースの確認
Copyright © Dell Inc. All Rights Reserved.60 of YACMにおけるマルチクラスターへのKyvernoポリシー適用手順(前提条件)Hub Cluster及びManaged ClusterにKyvernoをインストール(ステップ)1. 各クラスターにラベルを付与2. Policy作成 (及びPolicySet作成)3. PlacementRule作成4. PlacementBinding作成
Copyright © Dell Inc. All Rights Reserved.61 of YACMにおけるマルチクラスターへのKyvernoポリシー適用手順(前提条件)Hub Cluster及びManaged ClusterにKyvernoをインストール(ステップ)1. 各クラスターにラベルを付与2. Policy作成 (及びPolicySet作成)3. PlacementRule作成4. PlacementBinding作成
Copyright © Dell Inc. All Rights Reserved.62 of YACMにおけるマルチクラスターへのKyvernoポリシー適用手順(前提条件)Hub Cluster及びManaged ClusterにKyvernoをインストール(ステップ)1. 各クラスターにラベルを付与2. Policy作成 (及びPolicySet作成)3. PlacementRule作成4. PlacementBinding作成
Copyright © Dell Inc. All Rights Reserved.63 of YACM上でのポリシーの確認適用したポリシーは、ACM上から確認することができます。
Copyright © Dell Inc. All Rights Reserved.65 of Yセッションのまとめ• Kyvernoでは、Kubernetesのマニフェストベースでポリシーを記述することができます。• Kyvernoでは、ほかのポリシーエンジンにはない機能が実装されています。• ポリシーには、以下の4種類の”アクション”が用意されています。– Validate Resources– Mutate Resources– Generate Resources– Verify Images• マルチクラスターに対してポリシーを適用及び管理する際は、Red Hat ACM for Kubernetesを用いることで、運用コストを下げることができます。• Red Hat ACM for KubernetesとKyvernoを活用することで、マルチクラスターに対し、柔軟にポリシーを定義し適用することが可能です。