CodeBlanks Logo Icon CodeBlanks

Meydan okuma - OPA

Rego ile bir politika yazarsın.

Meydan okuma: latest yasağı

Bu meydan okumada latest etiketli ya da etiketsiz image'ları yasaklayan bir Gatekeeper politikası yazacaksın. Kural pod'lara uygulanacak; önce yalnızca uyaracak, ihlaller temizlenince reddedecek:

nginx           -> ihlal (etiket yok, latest sayılır)
nginx:latest    -> ihlal
nginx:1.27      -> uygun
ghcr.io/sirket/api@sha256:… -> uygun

Rego'da endswith ve contains yerleşik fonksiyonlarını kullanacaksın.

Uygulama Rego kuralları

Rego kodunu yaz: package k8slatestyasak; iki violation[{"msg": msg}] kuralı. İlki c := input.review.object.spec.containers[_], endswith(c.image, ":latest"), msg := sprintf("latest yasak: %v", [c.image]). İkincisi aynı c ile not contains(c.image, ":"), msg := sprintf("etiket yok: %v", [c.image]).

Başlangıç kodu

terminal
# buraya yaz

Örnek çözüm

terminal
package k8slatestyasak

violation[{"msg": msg}] {
  c := input.review.object.spec.containers[_]
  endswith(c.image, ":latest")
  msg := sprintf("latest yasak: %v", [c.image])
}

violation[{"msg": msg}] {
  c := input.review.object.spec.containers[_]
  not contains(c.image, ":")
  msg := sprintf("etiket yok: %v", [c.image])
}

Beklenen çıktı

$ opa eval -d latest.rego -i pod.json "data.k8slatestyasak.violation"
{"result": [{"expressions": [{"value": [{"msg": "etiket yok: nginx"}]}]}]}

Uygulama Önce uyar

Bir K8sLatestYasak Constraint YAML'ı yaz: constraints.gatekeeper.sh/v1beta1; adı latest-yasak; enforcementAction: warn; match.kinds altında apiGroups: [""], kinds: ["Pod"]; excludedNamespaces: ["kube-system"].

Başlangıç kodu

terminal
# buraya yaz

Örnek çözüm

terminal
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sLatestYasak
metadata:
  name: latest-yasak
spec:
  enforcementAction: warn
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    excludedNamespaces: ["kube-system"]

Beklenen çıktı

k8slatestyasak.constraints.gatekeeper.sh/latest-yasak created
$ kubectl run deneme --image=nginx
Warning: [latest-yasak] etiket yok: nginx
pod/deneme created

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Rego'da aynı adlı iki violation kuralı yazılırsa ne olur?

  • İkisi de tetiklenmelidir (VE)
  • İhlaller birleşir; herhangi biri tetiklenirse ihlal oluşur (VEYA) Doğru cevap
  • Derleme hatası
  • Yalnızca ikincisi çalışır

Açıklama: Kural içindeki satırlar VE, aynı adlı kurallar VEYA anlamına gelir.

2 Image'ın latest ile bitip bitmediğine bak.

Soru
  ____(c.image, ":latest")
Cevap
  endswith(c.image, ":latest")

Açıklama: endswith dizenin sonunu denetler.

3 Eşleştir.

Kavram Anlamı
endswith Sonu denetle
contains İçeriyor mu
warn Önce uyar
deny Sonra reddet

Uzman bölümündeki tüm dersler