Slide 1

Slide 1 text

Policy Engine on Kubernetes VMware DevOps Meetup #8 (2021/03/24)

Slide 2

Slide 2 text

自己紹介 Name: ry (@URyo_0213) Skillset: - Storage - Ansible (Ansible Tower, AWX) - Python, django - Kubernetes Advertisement - Kubernetes Meetup Novice (月1回ペース) - Kubenews (毎週金曜日 22:00 ~ ) - Kubernetes Internal

Slide 3

Slide 3 text

まず初めに

Slide 4

Slide 4 text

PSP(Pod Security Policy) 適用されたPodの仕様を確認し、事前に適用された PSPに記載されているポリシーによって、 Podの作成を制御 するためのものです。 Deprecated in Kuberenets version 1.21 Remove the API completely in Kuberentes version 1.25 Kubernetes上でPolicyによる制御を何でやっていけばいいのだろうか。。。

Slide 5

Slide 5 text

Kubernetes上で 『Policyによる制御』 といえば?

Slide 6

Slide 6 text

OPA (Open Policy Agent) Admission Webhook機能を用いて、 ・Validating ・Mutating 等を行うことができるツール。 独自のRegoという言語を用いることで、 柔軟なPolicyの作成が可能。

Slide 7

Slide 7 text

Admission Control Authentication Authorization Mutating Admission Object Schema Admission Validating Admission Persisted to etcd webhook webhook webhook webhook

Slide 8

Slide 8 text

Validating / Mutating 1 Validating 作成するリソースが、 Policyと比較して許可していいものなのか、それとも拒否 すべきものなのかを判断する。 2 Mutating 作成するリソースに対して、 Parameterの追加や変更をかける。

Slide 9

Slide 9 text

Rego 前回のVMware DevOps Meetup #7 において、とても分かりやすい構文の解説などがありましたので参 照いただけると良いかと思います。 Open Policy Agent (OPA) 入門

Slide 10

Slide 10 text

Rego The Rego Playground を使って練習できます。

Slide 11

Slide 11 text

ここまで来たところで..... Regoかぁ... なんで新しい言語作るの?

Slide 12

Slide 12 text

OPAを少しでも簡単に使うために Styra DAS というOPAのPolicyをGUIから適用していくことができるツールがあります。 簡単な使い方や、実際にPolicyをによる判断を行う際に参照される Admissoin Reviewというリソースについて下 のBlogでご紹介しています。 Styra DASを使ってOPAをより簡単に

Slide 13

Slide 13 text

今日の本題

Slide 14

Slide 14 text

Kyverno OPA同様にAdmission Webhookを用いて Validating / Mutating 等のPolicyを適用するこ とができるツール。 KubernetesのManifestの様にPolicyを適用で きるので、学習コストが低い。

Slide 15

Slide 15 text

Policy Structure https://kyverno.io/docs/writing-policies/structure/

Slide 16

Slide 16 text

Match Policyを適用する対象を記載するものです。 dict型はAND, list型はOR 今回のケースでは、 kindが「Deployment」もしくは「Statefulset」 かつ labelに「app: critical」 とあるもの

Slide 17

Slide 17 text

Exclude Matchに記載したものの中で、例外を作る場合に使用します。 今回のケースでは、 対象はPod ただし、kube-system内のPodは除く

Slide 18

Slide 18 text

Policy (Validating) spec.rulesの下で設定 match: Policyを適用するリソースを指定 - Podを指定 validate: 検証内容、及び違反した際の messageを記述 - Resource limit及びrequestが設定されてない場合、 作成が許可されない

Slide 19

Slide 19 text

Policy (Validating) Pod用 manifest (Resource unit なし) Policy Check Pod用 manifest (Resource unit あり) Pod作成

Slide 20

Slide 20 text

Policy (Validating)

Slide 21

Slide 21 text

Policy (Validating)

Slide 22

Slide 22 text

Policy (Validating) Policyを追加したことで、作成が承認されました。

Slide 23

Slide 23 text

Policy (Mutating) ● RFC 6902 JSONPatch ● Strategic Merge Patch ● Mutate Overlay ● Mutate Rule Ordering (Cascading)

Slide 24

Slide 24 text

Policy (Mutating) ● RFC 6902 JSONPatch ● Strategic Merge Patch ● Mutate Overlay ● Mutate Rule Ordering (Cascading)

Slide 25

Slide 25 text

Policy (Mutating - overlay -) spec.rulesの下で設定 match: Policyを適用するリソースを指定 - Podを指定 mutate: 変更する項目を記載 - 特定のlabelをトリガーに、 VaultからSecretを取得するための annotation、及びService Accountを 追加

Slide 26

Slide 26 text

Policy (Mutating - overlay -) Policy Check Pod用 manifest (指定labelあり) Pod作成 (Secret Injected) Pod用 manifest Annotation Service Account 追加 Vault Pod用 manifest Vault InitContainer Vault Sidecar 追加 Annotation確認

Slide 27

Slide 27 text

Policy (Mutating - overlay -) Vault上に、情報を格納する # vault secrets enable -path=vmware kv-v2 # vault kv put vmware/devops/8 username="vmware-devops" password="waiwai" 作成したリソースに対する Policyを設定する # vault policy write vmware - <

Slide 28

Slide 28 text

Policy (Mutating - overlay -) kubernetes上のリソースとの紐づけをする。 # vault write auth/kubernetes/role/vmware \ bound_service_account_names=vmware \ bound_service_account_namespaces=default \ policies=vmware \ ttl=24h 上記のコマンドで指定した Service Accountを作成する。 # kubectl create sa vmware

Slide 29

Slide 29 text

Policy (Mutating - overlay -)

Slide 30

Slide 30 text

Policy (Mutating - overlay -)

Slide 31

Slide 31 text

Policy (Generating) match: Policyを適用するリソースを指定 - Namespaceを指定 - 4つのNamespaceを例外とする。 generate: 作成するリソースを指定 - NetworkPolicyを作成する。

Slide 32

Slide 32 text

Policy (Generating)

Slide 33

Slide 33 text

最後に

Slide 34

Slide 34 text

Summary Keyvernoでは、ManifestライクにPolicyの宣言を行うことのできる。 Kyvernoは、Regoのような特殊な言語がないため、学習コストが低区 始めやすい。 OPAにはないGeneratingという機能はとても有用。

Slide 35

Slide 35 text

OPA vs Kyverno 以下のBlogにて、さまざまな項目の比較を表形式で載せてくれているので参考にしていただければと思います。 Kubernetes Policy Comparison: OPA/Gatekeeper vs Kyverno

Slide 36

Slide 36 text

今回使用したPolicy Githubの方にあげていますので、ご参照ください。 kyverno-sample

Slide 37

Slide 37 text

Thank you