Kyverno - Kubernetes 原生策略管理引擎

Kyverno[1] 是一個(gè)為 Kubernetes 打造的策略管理引擎:
策略作為 Kubernetes 資源 validate、mutate 或者生成任何資源 使用標(biāo)簽選擇器和通配符匹配資源 在不同的命名空間中生成和同步默認(rèn)值 攔截或報(bào)告違規(guī)行為 使用 kubectl 進(jìn)行測(cè)試
注意:你的 Kubernetes 集群版本必須高于 v1.14,它增加了 webhook 超時(shí)。
直接使用下面的命令即可安裝 Kyverno:
kubectl?create?-f?[https://raw.githubusercontent.com/kyverno/kyverno/master/definitions/release/install.yaml](https://raw.githubusercontent.com/kyverno/kyverno/master/definitions/release/install.yaml?"https://raw.githubusercontent.com/kyverno/kyverno/master/definitions/release/install.yaml")
當(dāng)然我們也可以使用 Helm Chart 來快速安裝 kyverno。
然后添加下面的策略,它包含一個(gè)驗(yàn)證規(guī)則,要求所有的 pod 都有一個(gè) app.kubernetes.io/name 標(biāo)簽,Kyverno 支持不同的規(guī)則類型來 validate、mutate 和生成配置,策略屬性 validationFailureAction 被設(shè)置為強(qiáng)制執(zhí)行,以阻止不合規(guī)的 API 請(qǐng)求(使用默認(rèn)值 audit 會(huì)報(bào)告違規(guī)行為,但不會(huì)阻止請(qǐng)求)。
apiVersion:?kyverno.io/v1
kind:?ClusterPolicy
metadata:
??name:?require-labels
spec:
??validationFailureAction:?enforce
??rules:
??-?name:?check-for-labels
????match:
??????resources:
????????kinds:
????????-?Pod
????validate:
??????message:?"label?`app.kubernetes.io/name`?is?required"
??????pattern:
????????metadata:
??????????labels:
????????????app.kubernetes.io/name:?"?*"
創(chuàng)建了上面的策略資源后,我們可以嘗試創(chuàng)建一個(gè)不帶有上面指定標(biāo)簽的應(yīng)用:
kubectl?create?deployment?nginx?--image=nginx
我們會(huì)看到如下所示的一些錯(cuò)誤提示信息:
Error?from?server:?admission?webhook?"nirmata.kyverno.resource.validating-webhook"?denied?the?request:
resource?Deployment/default/nginx?was?blocked?due?to?the?following?policies
require-labels:
??autogen-check-for-labels:?'Validation?error:?label?`app.kubernetes.io/name`?is?required;
????Validation?rule?autogen-check-for-labels?failed?at?path?/spec/template/metadata/labels/app.kubernetes.io/name/'
如果我們創(chuàng)建一個(gè)帶有所需要標(biāo)簽的 Pod,則可以正常創(chuàng)建,比如下面的資源清單:
kind:?"Pod"
apiVersion:?"v1"
metadata:
??name:?nginx
??labels:
????app.kubernetes.io/name:?nginx
spec:
??containers:
??-?name:?"nginx"
????image:?"nginx:latest"
因?yàn)檫@個(gè) Pod 符合我們定義的策略規(guī)則,所以不會(huì)被攔截。
可以通過刪除所有的集群策略來進(jìn)行清理:
kubectl?delete?cpol?--all
接下來我們可以通過查看策略示例[2]來學(xué)習(xí)如何編寫策略規(guī)則[3],此外我們還可以使用 Kyverno CLI[4] 工具來測(cè)試定義的策略。
當(dāng)然在 Kubernetes 社區(qū)中還有很多類似的策略管理引擎可以作為 Kyverno 的替代品:
Open Policy Agent:開放策略代理(OPA)[5]是一個(gè)通用的策略引擎,可以作為 Kubernetes 準(zhǔn)入控制器使用,它支持大量的使用案例,策略使用一種自定義查詢語言 Rego[6] 來編寫。 K-rail:k-rail[7] 為安全和多租戶提供了一些現(xiàn)成的策略,這些策略是用 Golang 編寫的,Kyverno 的一些示例策略就是受到了 k-rail 策略的啟發(fā)。 Polaris:Polaris[8] 驗(yàn)證配置的最佳實(shí)踐,它包括健康、網(wǎng)絡(luò)、安全等多個(gè)檢查,檢查可以分配一個(gè) severity(嚴(yán)重性),Dashboard 會(huì)報(bào)告一個(gè)總體分?jǐn)?shù)。
關(guān)注微信公眾帳號(hào),后臺(tái)回復(fù)
kyverno獲取 kyverno 介紹 PPT。
參考資料
Kyverno: https://kyverno.io/
[2]策略示例: https://github.com/kyverno/kyverno/blob/master/samples/README.md
[3]編寫策略規(guī)則: https://github.com/kyverno/kyverno/blob/master/documentation/writing-policies.md
[4]Kyverno CLI: https://github.com/kyverno/kyverno/blob/master/documentation/kyverno-cli.md
[5]開放策略代理(OPA): https://www.openpolicyagent.org/
[6]Rego: https://www.openpolicyagent.org/docs/latest/how-do-i-write-policies#what-is-rego
[7]k-rail: https://github.com/cruise-automation/k-rail/
[8]Polaris: https://github.com/reactiveops/polaris
K8S進(jìn)階訓(xùn)練營(yíng),點(diǎn)擊下方圖片了解詳情

