ArgoCD ve Kyverno Kullanarak Kubernetes Yönetimini Kolaylaştırın

ArgoCd ile Kyverno

Bu makalede Kyverno ve ArgoCd ile beraber Kubernetes üzerinde policy tanımlarını gitOps ile yönetmeyi ve Kubernetes kümemizi nasıl daha güvenli hala getirebiliriz bunu inceliyor olacağız.

Kyverno Nedir ?

Kyverno açık kaynak bir policy yönetim aracı olarak karşımıza çıkıyor. Kullanıcılarına deklaratif metod ile policy tanımlamalarını kullanarak Kubernetes kümemiz üzerindeki kaynakları otomatik olarak doğrulamak ve yönetilen politikalara uygunluk sağlamayı amaçlar.

Kyverno Mekanizması

Kyverno Nasıl Çalışır ?

Kyverno Kubernetes kümesi üzerinde dynamic admission controller olarak çalışır. Bu mekanizma, Kubernetes nesnelerinin oluşturulması ve güncellenmesi sırasında özelleştirilebilir kontroller eklememizi sağlar. Kyverno, Kubernetes API sunucusundan validation ve mutation admission webhook HTTP callbacklarini alır ve eşleşen politikaları uygulayarak kabul politikalarını zorlayan sonuçlar döndürür veya istekleri reddeder.

Policy Nedir ?

Policy tanımını Kubernetes kümemizdekideki kaynakların nasıl oluşturulması, güncellenmesi ve silinmesi gerektiğini tanımlayan objeler olarak düşünebiliriz. Bu tanımlamaları gereken koşul ve standartlara göre cluster (ClusterPolicy), namespace (Policy) gibi seviyelerde tanımlayabilip istediğimiz seviyede ilgili kaynaklar (Pod,Service,Deployment) için tanımlama gerçekleştirebiliriz.

Policy Mekanizması

Bir Kyverno policy bir veya daha fazla Rule’un toplamıdır. Herbir rule match ya da opsiyonel olarak exclude deklarasyonuna ve validate,mutate,generate ya da verifyImages bildirisini barındırır.

Policy Tipleri

Policy Tipleri
  • Generate — Yeni kaynakları veya yapıları otomatik olarak oluşturmak için kullanılır. Bu, bir kaynak oluşturulduğunda başka bir kaynağın otomatik olarak oluşturulmasını sağlamak için kullanılabilir. Örneğin, bir Namespace oluşturulduğunda otomatik olarak bir NetworkPolicy oluşturmak için kullanılabilir.
  • Mutate — Kaynağın belirli bir politika veya kurallara uymasını sağlamak için kullanılır. Politika kaynağın belirli özelliklerini veya ayarlarını otomatik olarak değiştirebilir.
  • Validate — Kaynakların belirli kurallara veya koşullara uygun olup olmadığını kontrol etmek için kullanılır. Eğer bir kaynak belirli bir koşulu karşılamıyorsa, validationFailureAction değerine göre( Enforce,Audit) ilgili kaynak engellenir ya da rapor oluşur.
  • VerifyImages Software Supply Chain Security için container imzalarını ve beyanlarını kontrol eder

Ön Gereksinimler

  • ArgoCd
  • Kubernetes Cluster ( Minikube kullanabilirsiniz )
  • Helm

Kyverno Kurulumu ( Helm ile ArgoCd)

Installation Methods | Kyverno (Kyverno resmi kurulum dökümantasyonu linki burada farklı methodlar ile kurulum da bulunmaktadır)

1) helm repo add kyverno https://kyverno.github.io/kyverno/

=> kyvernonun kubernetes clusterı üzerinde kurulması için gerekli olan chart

2) helm repo add kyverno-policies https://kyverno.github.io/kyverno/

=> kubernetes üzerinde kullanacağımız policy tanımlarını barındıran chart

2) helm repo update

3) helm pull kyverno/kyverno — untar — untardir ./ && helm pull kyverno/kyverno-policies — untar — untardir

Localimize kyverno ve kyverno-policies chartlarını indirmiş olduk sonrasında bu chartları ilgili git reposuna pushluyoruz.

emirhandogandemir/kyverno-argocd (github.com) => kyverno ve kyverno-policies chartlarını bulunduran git repository

Kyverno Kurulumu

Buradaki çalışmalarınızı gerçekleştirmek için killercoda içerisindeki argoCd playgroundunu kullanabilirsiniz. New Applications diyerek aşağıdaki parametreleri giriyoruz.

kyverno kurulumu için applicationun özeti

Kyvernonun kendisi kubernetes kümemiz üzerinde argoCd aracılığı ile konumlanmış oluyor.

kyverno chartının argoCd ile sync olması

Kyverno Policies Oluşturulması

kyverno-policies chart tanımının özeti
kyverno-policies chartı ile argocdnin sync olması

Default gelen policies tanımları yukarıda bulunmaktadır. Git reposunda argoCd sürekli olarak istenilen policy tanımlarını izleyip istenilen kubernetes clusterında izleme gerçekleştirecektir. Hadi gelin yeni bir policy tanımı gerçekleştirerek olanlara bakalım policy tanımımızda; cluster bazında tagsız olabilecek ve latest tagına sahip olabilecek imagelara sahip podları engellemiş olacağız.

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
name: disallow-latest-tag
annotations:
policies.kyverno.io/title: Disallow Latest Tag
policies.kyverno.io/category: Best Practices
policies.kyverno.io/severity: medium
policies.kyverno.io/subject: Pod
policies.kyverno.io/description: >-
The ':latest' tag is mutable and can lead to unexpected errors if the
image changes. A best practice is to use an immutable tag that maps to
a specific version of an application Pod. This policy validates that the image
specifies a tag and that it is not called `latest`.
spec:
validationFailureAction: enforce
background: true
rules:
- name: require-image-tag
match:
resources:
kinds:
- Pod
validate:
message: "An image tag is required."
pattern:
spec:
containers:
- image: "*:*"
- name: validate-image-tag
match:
resources:
kinds:
- Pod
validate:
message: "Using a mutable image tag e.g. 'latest' is not allowed."
pattern:
spec:
containers:
- image: "!*:latest"

Policy Tanımındaki birkaç noktayı aşağıda gelin beraber inceleyelim

  • kind : kubernetes içerisinde hangi seviyede geçerli olacağını belirtir.
  • annotations : Burada policy ile ilgili bilgileri konumlandırıyoruz.
  • validationFailureAction : Enforce değeri ile kaynağı reddeder.
  • background : policynin arka planda çalışıp çalışmayacağını belirtir. “true” olarak ayarlandığında, politika asenkron olarak çalışır ve kaynakları doğrularken diğer işlemleri engellemez.
  • match : Bu kısımda uygulanacak olan kaynakları seçiyoruz
Yeni bir policy tanımının argocdye yansıması

Git reposunda yaptığımız değişikliği argoCd algıladı ve sonuç olarak aşağıdaki görünüme sahip olduk.

Yeni bir policy tanımının kubernetes kümemize uygulanması

Peki bu kısıtlamaya baglı olarak ben bir tane latest tagına sahip pod ayaga kaldırmak istersem kubernetes kümemiz nasıl cevap verecektir ?

apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 2
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: nginx:latest
Kısıtlmayı ihlal eden bir k8s objesi ve çıktısı

Yukarıda örnek latest tag kısıtlamasına uymayan bir deployment örneğini göstermektedir. Burada kyvernonun bize döndüğü outputu yukarıda görebiliriz.

--

--

Emirhan Doğandemir
Devops Türkiye☁️ 🐧 🐳 ☸️

DevOps & Platform Engineer #Kubernetes #CI/CD #GitOps #Automation #DevSecOps