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 birClusterPolicy
tü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 sadecePod
tü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’ınimage
alanı için beklenen patern. Bu örnekte,your-allowed-registry.com/
ile başlayan imaj adlarına izin verilir.
- Örnek-2: her oluşturulan podta
team
anahtarı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:
patchStrategicMerge
daha basit ve spesifik alan değişiklikleri için uygundur.overlay
daha 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 birClusterPolicy
türündedir, yani tüm cluster’da uygulanır.name: add-security-context
: Politikanın adı.match.resources.kinds: - Pod
: Bu politika sadecePod
türündeki kaynaklara uygulanır.mutate.overlay.spec.securityContext
: Mutasyon işlemi sırasında Pod’a ekleneceksecurityContext
tanımlanmıştır. Bu örnekte, her Pod’unrunAsNonRoot: true
verunAsUser: 1000
olarak ayarlanacak birsecurityContext
alması 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
ClusterPolicy
oluşturulmuştur:create-default-role
vecreate-rolebinding-for-default-role
. - Her iki kural da
Namespace
kaynak türüyle eşleşir, yani yeni birNamespace
oluşturulduğunda tetiklenirler. create-default-role
kuralı:generate
bölümü kullanarak birRole
oluşturur.- Bu
Role
, oluşturulanNamespace
içindedefault-role
adını alır. - Oluşturulan
Role
‘depods
kaynağı içinget
velist
yetkileri verilir.
create-rolebinding-for-default-role
kuralı:- Benzer şekilde,
generate
bölümü kullanarak birRoleBinding
oluşturur. RoleBinding
, oluşturulanNamespace
içindedefault-role-binding
adını alır vedefault-role
‘e bağlanır.RoleBinding
,system:authenticated
grubunudefault-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.yaml
olarak adlandırabilirsiniz. kubectl apply -f generate-role-and-rolebinding.yaml
komutunu kullanarak politikayı uygulayın.- Bundan sonra, her yeni oluşturulan
Namespace
için otomatik olarak birRole
veRoleBinding
oluşturulacaktır.
Not:
- Bu örnekteki
Role
veRoleBinding
tanımları örnek amaçlıdır; gerçek kullanım senaryonuza göre bu değerleri değiştirmelisiniz. generate
kuralı, 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.