kubectl create -f https://github.com/kyverno/kyverno/releases/download/v1.10.3/install.yaml
Validation
Doğrulama politikaları, Kubernetes kaynaklarını yaratma veya güncelleme sırasında uygulanır. Bu politikalar, kaynakların belirli kurallara ve standartlara uygun olup olmadığını kontrol eder. Eğer bir kaynak, belirli bir doğrulama politikasına uymazsa, bu kaynağın oluşturulması veya güncellenmesi reddedilir.
Örnek: Pod’ların sadece belirli imaj depolarından imaj çekmesini zorunlu kılmak için bir doğrulama politikası oluşturabilirsiniz.
apiVersion: kyverno.io/v1
kind: Policy
metadata:
name: restrict-image-sources
spec:
validationFailureAction: Enforce
rules:
- name: check-image-source
match:
resources:
kinds:
- Pod
validate:
message: "Images must be pulled from your-allowed-registry.com"
pattern:
spec:
containers:
- image: "your-allowed-registry.com/*"
Politika Açıklaması:
kind: ClusterPolicy: Bu politika birClusterPolicytüründedir, yani tüm cluster’da uygulanır.name: restrict-image-sources: Politikanın adı.validationFailureAction: enforce: Bu politika zorlayıcı (enforcing) modda çalışır, yani kurala uymayan Pod’lar reddedilir.match.resources.kinds: - Pod: Bu politika sadecePodtüründeki kaynaklara uygulanır.validate.message: Kurala uymayan kaynaklar için gösterilecek hata mesajı.pattern.spec.containers.image: Pod tanımında bulunan her bir container’ınimagealanı için beklenen patern. Bu örnekte,your-allowed-registry.com/ile başlayan imaj adlarına izin verilir.
- Örnek-2: her oluşturulan podta
teamanahtarını içeren bir etiket olmasını bekler.
kubectl create -f- << EOF
apiVersion: kyverno.io/v1
kind: Policy
metadata:
name: require-labels
spec:
validationFailureAction: Enforce
rules:
- name: check-team
match:
any:
- resources:
kinds:
- Pod
validate:
message: "label 'team' is required"
pattern:
metadata:
labels:
team: "?*"
EOF
- Test ```bash kubectl create deployment nginx –image=nginx
kubectl run nginx –image nginx –labels team=backend
kubectl get policyreport
* deny unkown repositories
```yaml
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: allowed-repo
spec:
validationFailureAction: Enforce
rules:
- name: check-registries
match:
resources:
kinds:
- Pod
validate:
message: "Registry not allowed"
pattern:
spec:
containers:
- image: "docker.io/* | quay.io/*"
- deny privileged pods
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: disallow-privileged-containers
spec:
validationFailureAction: Enforce
background: false
rules:
- name: prevent-privileged-containers
match:
resources:
kinds:
- Pod
validate:
message: "Privileged containers are not allowed"
pattern:
spec:
containers:
- =(securityContext):
=(privileged): false
Mutation
Mutasyon politikaları, kaynakların yaratılma veya güncelleme sırasında dinamik olarak değiştirilmesini sağlar. Bu politikalar, kaynak tanımlarına otomatik olarak alanlar ekler, mevcut alanları değiştirir veya alanları kaldırır.
Kyverno’da mutate bölümü, Kubernetes kaynaklarını dinamik olarak değiştirmek için kullanılır. Bu, kaynak tanımlarına otomatik olarak alanlar eklemek, mevcut alanları değiştirmek veya alanları kaldırmak için kullanılır. Mutasyon için iki temel yöntem vardır: patchStrategicMerge ve overlay.
1. patchStrategicMerge:
patchStrategicMerge yöntemi, bir kaynak tanımına spesifik alanları eklemek veya değiştirmek için kullanılır. Bu yöntemle, belirli alanlara yapılan değişiklikler tanımlandığı gibi uygulanır.
Örnek:
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: add-security-context
spec:
rules:
- name: patch-security-context
match:
resources:
kinds:
- Pod
mutate:
patchStrategicMerge:
spec:
securityContext:
runAsNonRoot: true
runAsUser: 1000
Bu örnekte, Pod’lara securityContext eklenir ve runAsNonRoot: true ve runAsUser: 1000 olarak ayarlanır.
2. overlay:
overlay yöntemi, bir kaynak üzerine daha geniş ve kapsamlı değişiklikler yapmak için kullanılır. overlay daha kompleks ve detaylı mutasyonlar için uygundur ve patchStrategicMerge ile benzer şekilde çalışır ancak daha fazla seçenek sunar.
Örnek:
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: add-labels-and-annotations
spec:
rules:
- name: patch-labels-annotations
match:
resources:
kinds:
- Pod
mutate:
overlay:
metadata:
labels:
my-label: my-label-value
annotations:
my-annotation: my-annotation-value
Bu örnekte, Pod’lara my-label: my-label-value etiketi ve my-annotation: my-annotation-value notu eklenir.
Farklar:
patchStrategicMergedaha basit ve spesifik alan değişiklikleri için uygundur.overlaydaha kapsamlı ve detaylı mutasyonlar yapmak için kullanılır ve daha fazla esneklik sunar.
Her iki yöntem de benzer amaçlar için kullanılabilir, ve hangi yöntemin kullanılacağı spesifik kullanım durumunuza ve ihtiyacınıza bağlıdır. Genellikle, daha basit ve spesifik mutasyonlar için patchStrategicMerge, daha kapsamlı ve detaylı mutasyonlar için overlay kullanılır.
Pod tanımlarına otomatik olarak bir güvenlik politikası eklemek için kullanabileceğiniz bir Kyverno mutasyon politikası örneği bulunmaktadır. Bu örnekte, her Pod’a otomatik olarak bir securityContext eklenmektedir.
apiVersion: kyverno.io/v1
kind: Policy
metadata:
name: add-security-context
spec:
rules:
- name: add-securityContext
match:
resources:
kinds:
- Pod
mutate:
overlay:
spec:
securityContext:
runAsNonRoot: true
runAsUser: 1000
Politika Açıklaması:
kind: ClusterPolicy: Bu politika birClusterPolicytüründedir, yani tüm cluster’da uygulanır.name: add-security-context: Politikanın adı.match.resources.kinds: - Pod: Bu politika sadecePodtüründeki kaynaklara uygulanır.mutate.overlay.spec.securityContext: Mutasyon işlemi sırasında Pod’a ekleneceksecurityContexttanımlanmıştır. Bu örnekte, her Pod’unrunAsNonRoot: trueverunAsUser: 1000olarak ayarlanacak birsecurityContextalması sağlanmaktadır.
Burada team: bravo şeklinde anahtar-değerli bir etiket eklenmektedir.
kubectl create -f- << EOF
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: add-labels
spec:
rules:
- name: add-team
match:
any:
- resources:
kinds:
- Pod
mutate:
patchStrategicMerge:
metadata:
labels:
+(team): bravo
EOF
kubectl run redis --image redis
kubectl get pod redis --show-labels
kubectl run newredis --image redis -l team=alpha
kubectl get pod myredis --show-labels
Generation
Üretim politikaları, diğer Kubernetes kaynaklarının yaratılmasına veya silinmesine yanıt olarak otomatik olarak kaynaklar üretir. Bu, belirli bir kaynağın yaratılmasına veya silinmesine yanıt olarak başka kaynakların da dinamik olarak yönetilmesini sağlar.
Örnek: Her yeni Namespace için otomatik olarak bir Role veya RoleBinding oluşturmak üzere bir üretim politikası kullanabilirsiniz.
Örnek Politika:
Aşağıda bir Validation politika örneği bulunmaktadır:
kubectl -n default create secret docker-registry regcred \
--docker-server=myinternalreg.corp.com \
--docker-username=john.doe \
--docker-password=Passw0rd123! \
--docker-email=john.doe@corp.com
kubectl create -f- << EOF
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: sync-secrets
spec:
rules:
- name: sync-image-pull-secret
match:
any:
- resources:
kinds:
- Namespace
generate:
apiVersion: v1
kind: Secret
name: regcred
namespace: ""
synchronize: true
clone:
namespace: default
name: regcred
EOF
kubectl create ns mytestns
kubectl -n mytestns get secret
kubectl delete clusterpolicy sync-secrets
- Her yeni Namespace için otomatik olarak bir Role veya RoleBinding oluşturmak üzere bir üretim politikası kullanabilirsiniz.
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: generate-role-and-rolebinding
spec:
rules:
- name: create-default-role
match:
resources:
kinds:
- Namespace
generate:
kind: Role
name: default-role
namespace: ""
data:
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
- name: create-rolebinding-for-default-role
match:
resources:
kinds:
- Namespace
generate:
kind: RoleBinding
name: default-role-binding
namespace: ""
data:
subjects:
- kind: Group
name: 'system:authenticated'
apiGroup: 'rbac.authorization.k8s.io'
roleRef:
kind: Role
name: default-role
apiGroup: 'rbac.authorization.k8s.io'
Politika Açıklaması:
- İki kural içeren bir
ClusterPolicyoluşturulmuştur:create-default-rolevecreate-rolebinding-for-default-role. - Her iki kural da
Namespacekaynak türüyle eşleşir, yani yeni birNamespaceoluşturulduğunda tetiklenirler. create-default-rolekuralı:generatebölümü kullanarak birRoleoluşturur.- Bu
Role, oluşturulanNamespaceiçindedefault-roleadını alır. - Oluşturulan
Role‘depodskaynağı içingetvelistyetkileri verilir.
create-rolebinding-for-default-rolekuralı:- Benzer şekilde,
generatebölümü kullanarak birRoleBindingoluşturur. RoleBinding, oluşturulanNamespaceiçindedefault-role-bindingadını alır vedefault-role‘e bağlanır.RoleBinding,system:authenticatedgrubunudefault-role‘e bağlar.
- Benzer şekilde,
Uygulama Adımları:
- Yukarıdaki YAML kodunu bir dosyaya yapıştırın, örneğin
generate-role-and-rolebinding.yamlolarak adlandırabilirsiniz. kubectl apply -f generate-role-and-rolebinding.yamlkomutunu kullanarak politikayı uygulayın.- Bundan sonra, her yeni oluşturulan
Namespaceiçin otomatik olarak birRoleveRoleBindingoluşturulacaktır.
Not:
- Bu örnekteki
RoleveRoleBindingtanımları örnek amaçlıdır; gerçek kullanım senaryonuza göre bu değerleri değiştirmelisiniz. generatekuralı, mevcut kaynaklar üzerinde herhangi bir etkiye sahip değildir; sadece yeni oluşturulan kaynaklara uygulanır.
policy vs clusterpolicy
Biri namespace seviyesinde çalışırken diğeri tüm küme için çalışır.