新聞中心
云原生開(kāi)源 Kyverno 是來(lái)自 Nirmata 的開(kāi)源項(xiàng)目,后來(lái)也捐贈(zèng)給了 CNCF。和 Gatekeeper一樣,Kyverno 也是一個(gè)具有驗(yàn)證和變異能力的 Kubernetes 策略引擎,但是它還有生成資源的功能,還加入了 API 對(duì)象查詢(xún)的能力。

金東ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書(shū)銷(xiāo)售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話(huà)聯(lián)系或者加微信:18982081108(備注:SSL證書(shū)合作)期待與您的合作!
OPA 的 Gatekeeper 以及 Kyverno 是 CNCF 的兩個(gè)頭部策略管理項(xiàng)目,兩個(gè)產(chǎn)品各有千秋,前面我們已經(jīng)學(xué)習(xí)了 Gatekeeper,接下來(lái)我們就來(lái)了解下如何使用 Kyverno。
Kyverno 是來(lái)自 Nirmata 的開(kāi)源項(xiàng)目,后來(lái)也捐贈(zèng)給了 CNCF。和 Gatekeeper一樣,Kyverno 也是一個(gè)具有驗(yàn)證和變異能力的 Kubernetes 策略引擎,但是它還有生成資源的功能,還加入了 API 對(duì)象查詢(xún)的能力。與 Gatekeeper 不同,Kyverno 原本就是為 Kubernetes 編寫(xiě)的。和 Gatekeeper 相比,Kyverno 除了對(duì)象生成功能之外,還無(wú)需專(zhuān)用語(yǔ)言即可編寫(xiě)策略,從實(shí)現(xiàn)語(yǔ)言的角度上來(lái)看,Kyverno 的模型更為簡(jiǎn)潔。畢竟 Gatekeeper 的 Rego 語(yǔ)言有一定的門(mén)檻。
同樣 Kyverno 在 Kubernetes 集群中也是作為動(dòng)態(tài)準(zhǔn)入控制器運(yùn)行的。Kyverno 從 kube-apiserver 接收驗(yàn)證和修改準(zhǔn)入 webhook HTTP 回調(diào),并應(yīng)用匹配策略返回執(zhí)行準(zhǔn)入策略或拒絕請(qǐng)求的結(jié)果。Kyverno 策略可以使用資源 Kind、name 和標(biāo)簽選擇器匹配資源,而且名稱(chēng)中支持通配符。
策略執(zhí)行是通過(guò) Kubernetes events 來(lái)捕獲的,Kyverno 還報(bào)告現(xiàn)有資源的策略違規(guī)行為。下圖顯示了 Kyverno 的整體架構(gòu):
Kyverno架構(gòu)
Kyverno 的高可用安裝可以通過(guò)運(yùn)行多個(gè)副本來(lái)完成,并且 Kyverno 的每個(gè)副本將具有多個(gè)執(zhí)行不同功能的控制器。Webhook 處理來(lái)自 Kubernetes APIServer 的 AdmissionReview 請(qǐng)求,其 Monitor 組件創(chuàng)建和管理所需的配置。PolicyController watch 策略資源并根據(jù)配置的掃描間隔啟動(dòng)后臺(tái)掃描,GenerateController 管理生成資源的生命周期。
對(duì)比
由于 Gatekeeper 與 Kyverno 都是策略管理的項(xiàng)目,所以自然我們要對(duì)這兩個(gè)項(xiàng)目的優(yōu)劣勢(shì)做一個(gè)對(duì)比。
Gatekeeper 的優(yōu)勢(shì)
- 能夠表達(dá)非常復(fù)雜的策略。
- 社區(qū)更為成熟。
- 支持多副本模式,更好的可用性和伸縮性。
Gatekeeper 的劣勢(shì)
- 需要編程語(yǔ)言支持,該語(yǔ)言的學(xué)習(xí)曲線(xiàn)較為陡峭,可能會(huì)產(chǎn)生大量技術(shù)債,并延長(zhǎng)交付時(shí)間。
- 沒(méi)有生成能力,意味著它的主要應(yīng)用場(chǎng)景就在驗(yàn)證方面。
- 策略復(fù)雜冗長(zhǎng),需要多個(gè)對(duì)象協(xié)同實(shí)現(xiàn)。
Kyverno 的優(yōu)勢(shì)
- Kubernetes 風(fēng)格的策略表達(dá)方式,非常易于編寫(xiě)。
- 成熟的變異能力。
- 獨(dú)特的生成和同步能力,擴(kuò)展了應(yīng)用場(chǎng)景。
- 快速交付,場(chǎng)景豐富。
Kyverno 的劣勢(shì)
- 受到語(yǔ)言能力的限制,難以實(shí)現(xiàn)復(fù)雜策略。
- 較為年輕,社區(qū)接受度不高。
- API 對(duì)象查詢(xún)能力還很初級(jí)。
從上面對(duì)比可以看出來(lái) Gatekeeper 最大的弱點(diǎn)是它需要 Rego 這門(mén)語(yǔ)言來(lái)實(shí)現(xiàn)策略邏輯,而這種語(yǔ)言在其他地方都無(wú)法使用,這也大大增加了門(mén)檻,當(dāng)然同樣這也是一種優(yōu)勢(shì),因?yàn)榫幊陶Z(yǔ)言可以實(shí)現(xiàn)非常強(qiáng)大的邏輯。相比 Gatekeeper 來(lái)說(shuō),Kyverno 的第一印象就是沒(méi)有那么復(fù)雜的技術(shù)需求,因?yàn)樗菍?zhuān)門(mén)為 Kubernetes 構(gòu)建的,并且用聲明式的方法來(lái)表達(dá)策略,所以它的模型與 Kubernetes 對(duì)象的描述和協(xié)調(diào)方式是相同的,這種模式導(dǎo)致策略的編寫(xiě)方式得到了極大的簡(jiǎn)化,全面降低了策略引擎的使用難度。此外 Kyverno 的編譯和生成能力,使它從一個(gè)簡(jiǎn)單的準(zhǔn)入控制器轉(zhuǎn)變?yōu)橐粋€(gè)真正的自動(dòng)化工具。通過(guò)結(jié)合這三種能力,再加上最近增加的 API 查詢(xún)能力,Kyverno 能夠執(zhí)行 Gatekeeper 所不能執(zhí)行的任務(wù)。這種簡(jiǎn)單性加上它的自動(dòng)化能力和對(duì)其他工具的整合,為新用戶(hù)以及有經(jīng)驗(yàn)的用戶(hù)和操作者帶來(lái)了巨大的價(jià)值。
當(dāng)然具體選擇哪一個(gè)工具,還是應(yīng)該根據(jù)自己的需求和限制條件進(jìn)行評(píng)估,但是有一點(diǎn)是所有生產(chǎn)環(huán)境的用戶(hù)都應(yīng)該計(jì)劃使用策略引擎來(lái)保護(hù)集群的安全并簡(jiǎn)化 Kubernetes 管理。
安裝
你可以選擇直接從最新版本的資源清單安裝 Kyverno,直接執(zhí)行下面的命令即可:
kubectl create -f https://raw.githubusercontent.com/kyverno/kyverno/main/config/install.yaml
此外同樣可以使用 Helm 來(lái)進(jìn)行一鍵安裝:
helm repo add kyverno https://kyverno.github.io/kyverno/
helm repo update
# Install the Kyverno Helm chart into a new namespace called "kyverno"
helm install kyverno kyverno/kyverno -n kyverno --create-namespace
安裝完成會(huì)創(chuàng)建一個(gè) kyverno 命名空間,同樣也包含一些相關(guān)的 CRD:
kubectl get pods -n kyverno
NAME READY STATUS RESTARTS AGE
kyverno-69bdfcfc7c-dbtlt 1/1 Running 0 29m
kubectl get validatingwebhookconfiguration
NAME WEBHOOKS AGE
kyverno-policy-validating-webhook-cfg 1 14m
kyverno-resource-validating-webhook-cfg 2 14m
kubectl get mutatingwebhookconfigurations
NAME WEBHOOKS AGE
kyverno-policy-mutating-webhook-cfg 1 14m
kyverno-resource-mutating-webhook-cfg 2 14m
kyverno-verify-mutating-webhook-cfg 1 14m
kubectl get crd |grep kyverno
clusterpolicies.kyverno.io 2022-03-29T07:21:22Z
clusterreportchangerequests.kyverno.io 2022-03-29T07:21:22Z
generaterequests.kyverno.io 2022-03-29T07:21:22Z
policies.kyverno.io 2022-03-29T07:21:22Z
reportchangerequests.kyverno.io 2022-03-29T07:21:23Z
可以看出安裝完成后創(chuàng)建了幾個(gè) validatingwebhookconfiguration 與 mutatingwebhookconfigurations 對(duì)象。
策略與規(guī)則
使用 Kyverno 其實(shí)就是對(duì)策略和規(guī)則的應(yīng)用,Kyverno 策略是規(guī)則的集合,每個(gè)規(guī)則都包含一個(gè) match 聲明、一個(gè)可選的 exclude 聲明以及 validate、mutate、generate 或 verifyImages 聲明之一組成,每個(gè)規(guī)則只能包含一個(gè) validate、mutate、generate 或 verifyImages 子聲明。
Kyverno策略
策略可以定義為集群范圍的資源(ClusterPolicy)或命名空間級(jí)別資源(Policy)。
- Policy 將僅適用于定義它們的 namespace 內(nèi)的資源。
- ClusterPolicy 應(yīng)用于匹配跨所有 namespace 的資源。
策略定義
編寫(xiě)策略其實(shí)就是定義 Policy 或者 ClusterPolicy 對(duì)象。
驗(yàn)證資源
驗(yàn)證規(guī)則基本上是我們使用最常見(jiàn)和最實(shí)用的規(guī)則類(lèi)型,當(dāng)用戶(hù)或進(jìn)程創(chuàng)建新資源時(shí),Kyverno 將根據(jù)驗(yàn)證規(guī)則檢查該資源的屬性,如果驗(yàn)證通過(guò),則允許創(chuàng)建資源。如果驗(yàn)證失敗,則創(chuàng)建被阻止。比如現(xiàn)在我們添加一個(gè)策略,要求所有的 pod 都包含一個(gè) kyverno 的標(biāo)簽:
# kyverno-require-label.yaml
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: require-label
spec:
validationFailureAction: enforce
rules:
- name: check-for-labels
match:
resources:
kinds:
- Pod
validate:
message: "label 'kyverno' is required"
pattern:
metadata:
labels:
kyverno: "?*"
上面策略文件中添加了一個(gè) validationFailureAction=[audit, enforce] 屬性:
- 當(dāng)處于 audit 模式下 ,每當(dāng)創(chuàng)建違反規(guī)則集的一個(gè)或多個(gè)規(guī)則的資源時(shí),會(huì)允許 admission review 請(qǐng)求,并將結(jié)果添加到報(bào)告中。
- 當(dāng)處于 enforce 模式下 ,資源在創(chuàng)建時(shí)立即被阻止,報(bào)告中不會(huì)有。
然后就是下面使用 rules 屬性定義的規(guī)則集合,match 用于表示匹配的資源資源,validate 表示驗(yàn)證方式,這里我們定義 kyverno: "?*" 這樣的標(biāo)簽表示必須有這樣的一個(gè)標(biāo)簽 key。
直接應(yīng)用上面的策略對(duì)象即可:
kubectl apply -f kyverno-require-label.yaml
clusterpolicy.kyverno.io/require-label created
kubectl get clusterpolicy
NAME BACKGROUND ACTION READY
require-label true enforce true
現(xiàn)在我們添加一個(gè)不帶標(biāo)簽 kyverno 的 Pod:
kubectl run busybox --image=busybox:1.28.4 --restart=Never -- sleep 1000000
Error from server: admission webhook "validate.kyverno.svc-fail" denied the request:
resource Pod/default/busybox was blocked due to the following policies
require-label:
check-for-labels: 'validation error: label ''kyverno'' is required. Rule check-for-labels
failed at path /metadata/labels/kyverno/'
可以看到提示,需要一個(gè) kyverno 標(biāo)簽,同樣我們也可以通過(guò)查看 Events 事件來(lái)了解策略應(yīng)用情況:
kubectl get events -A -w
......
metallb-system 9m25s Warning PolicyViolation daemonset/speaker policy 'require-label' (Validation) rule 'autogen-check-for-labels' failed. validation error: label 'kyverno' is required. Rule autogen-check-for-labels failed at path /spec/template/metadata/labels/kyverno/
default 0s Warning PolicyViolation clusterpolicy/require-label
如果創(chuàng)建的 Pod 帶有 kyverno 標(biāo)簽則可以正常創(chuàng)建:
kubectl run busybox --image=busybox:1.28.4 --labels kyverno=demo --restart=Never -- sleep 1000000
pod/busybox created
如果將 validationFailureAction 的值更改為 audit,則即使我們創(chuàng)建的 Pod 不帶有 kyverno 標(biāo)簽,也可以創(chuàng)建成功,但是我們可以在 PolicyReport 對(duì)象中看到對(duì)應(yīng)的違規(guī)報(bào)告:
kubectl get policyreports
NAME PASS FAIL WARN ERROR SKIP AGE
polr-ns-default 0 2 0 0 0 20m
kubectl describe policyreports |grep "Result: \+fail" -B10
UID: 90d1dfc7-0e42-4133-8a65-4bbf559533a2
Results:
Message: validation error: label 'kyverno' is required. Rule autogen-check-for-labels failed at path /spec/template/metadata/labels/kyverno/
Policy: require-label
Resources:
API Version: apps/v1
Kind: Deployment
Name: minio
Namespace: default
UID: 86ccd8fc-07f6-47a4-a9ed-b9dec665dff3
Result: fail
--
Nanos: 0
Seconds: 1648541980
Message: validation error: label 'kyverno' is required. Rule check-for-labels failed at path /metadata/labels/kyverno/
Policy: require-label
Resources:
API Version: v1
Kind: Pod
Name: busybox
Namespace: default
UID: 7e593177-4366-462b-81cf-1057657ae099
Result: fail
從上面的報(bào)告資源中可以看到違反策略的資源對(duì)象。
變更規(guī)則
變更規(guī)則可以用于修改匹配到規(guī)則的資源(比如規(guī)則設(shè)置了 metadata 字段可以和資源的 metadata 進(jìn)行合并),就是根據(jù)我們?cè)O(shè)置的規(guī)則來(lái)修改對(duì)應(yīng)的資源。
比如現(xiàn)在我們添加如下所示一個(gè)策略,給所有包含 nginx 鏡像 的 pod 都加上一個(gè)標(biāo)簽(kyverno=nginx):
# kyverno-mutate-label.yaml
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: nginx-label
spec:
rules:
- name: nginx-label
match:
resources:
kinds:
- Pod
mutate:
patchStrategicMerge:
metadata:
labels:
kyverno: nginx
spec:
(containers):
- (image): "*nginx*" # 容器鏡像包含 nginx 即可
直接應(yīng)用上面這個(gè)策略對(duì)象即可:
kubectl apply -f kyverno-mutate-label.yaml
clusterpolicy.kyverno.io/nginx-label created
kubectl get clusterpolicy
NAME BACKGROUND ACTION READY
nginx-label true audit true
require-label true enforce true
現(xiàn)在我們使用 nginx 鏡像直接創(chuàng)建一個(gè) Pod:
kubectl run --image=nginx nginx
pod/nginx created
kubectl get pod nginx --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx 1/1 Running 0 29s kyverno=nginx,run=nginx
可以看到 Pod 創(chuàng)建成功后包含了一個(gè) kyverno=nginx 標(biāo)簽,由于有 kyverno 標(biāo)簽,所以上面的驗(yàn)證策略也是通過(guò)的,可以正常創(chuàng)建。
生成資源
生成規(guī)則可用于在創(chuàng)建新資源或更新源時(shí)創(chuàng)建其他資源,例如為命名空間創(chuàng)建新 RoleBindings 或 Secret 等。
比如現(xiàn)在我們一個(gè)需求是將某個(gè) Secret 同步到其他命名空間中去(比如 TLS 密鑰、鏡像倉(cāng)庫(kù)認(rèn)證信息),手動(dòng)復(fù)制這些 Secret 比較麻煩,則我們可以使用 Kyverno 來(lái)創(chuàng)建一個(gè)策略幫助我們同步這些 Secret。比如在 default 命名空間中有一個(gè)名為 regcred 的 Secret 對(duì)象,需要復(fù)制到另外的命名空間,如果源 Secret 發(fā)生更改,它還將向復(fù)制的 Secret 同步更新。
# kyverno-generate-secret.yaml
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: sync-secrets
spec:
rules:
- name: sync-image-pull-secret
match:
resources:
kinds:
- Namespace
generate: # 生成的資源對(duì)象
kind: Secret
name: regcred
namespace: "{{request.object.metadata.name}}" # 獲取目標(biāo)命名空間
synchronize: true
clone:
namespace: default
name: regcred
先在 default 命名空間中準(zhǔn)備我們的 Secret 對(duì)象:
kubectl create secret docker-registry regcred --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
secret/regcred created
然后應(yīng)用上面的同步 Secret 策略:
kubectl apply -f kyverno-generate-secret.yaml
clusterpolicy.kyverno.io/sync-secrets created
kubectl get clusterpolicy
NAME BACKGROUND ACTION READY
nginx-label true audit true
require-label true enforce true
sync-secrets true audit true
現(xiàn)在我們創(chuàng)建一個(gè)新的命名空間:
kubectl create ns test
namespace/test created
kubectl get secret -n test
NAME TYPE DATA AGE
default-token-7b7cv kubernetes.io/service-account-token 3 7s
regcred kubernetes.io/dockerconfigjson 1 6s
可以看到在新建的命名空間中多了一個(gè) regcred 的 Secret 對(duì)象。
更多的 Kyverno 策略可以直接查看官方網(wǎng)站:https://kyverno.io/policies,可以在該網(wǎng)站上面根據(jù)策略類(lèi)型、分類(lèi)、主題等進(jìn)行篩選。Kyverno 在靈活、強(qiáng)大和易用之間取得了一個(gè)很好的平衡,不需要太多學(xué)習(xí)時(shí)間,就能夠提供相當(dāng)方便的功能,官網(wǎng)提供了大量的針對(duì)各種場(chǎng)景的樣例,非常值得使用。
文章題目:使用Kyverno進(jìn)行Kubernetes策略管理
網(wǎng)站URL:http://m.fisionsoft.com.cn/article/cdgghjd.html


咨詢(xún)
建站咨詢(xún)
