İş Yükü Politikalarını Uygulamak
Bu sayfada
Admission Control (Kabul Denetimi)
Admission control, iş yüklerinin kümede çalışmasına izin verme — ya da engelleme — sürecidir. Bunu kendi kurallarınızı uygulamak için kullanabilirsiniz. Onaylı bir registry'den imaj kullanmayan tüm container'ları engellemek, ya da belirtiminde kaynak limitleri bulunmayan Pod'ları engellemek isteyebilirsiniz.
Bunu admission controller webhook'larıyla yapabilirsiniz — küme içinde çalışan ve nesneler oluşturulduğunda kuralları uygulamak üzere API tarafından çağrılan HTTP sunucuları. Admission controller'lar sizin kendi mantığınızı kullanabileceği gibi Open Policy Agent gibi standart bir aracı da kullanabilir.
Kaynaklar
Validating ve Mutating Webhook'lar
Kendi admission control mantığınızı kümede çalıştırdığınız bir REST API içinde yazabilir ve Kubernetes nesnelerine uygulanacak kurallar yapılandırabilirsiniz:
- şu ValidatingWebhookConfiguration
kümede Pod oluşturulduğunda veya güncellendiğinde devreye giriyor ve özel bir webhook sunucusundaki validate metodunu çağırıyor; sunucu, işlemin devam etmesine izin verilip verilmediğini döndürüyor
- şu MutatingWebhookConfiguration —
Pod oluşturulduğunda veya güncellendiğinde devreye giriyor ve sunucudaki mutate uç noktasını çağırıyor; bu, Kubernetes işlemi yürütmeden önce belirtimi düzenleyip değişiklikleri geri gönderebilir.
Kümede bir webhook sunucusu çalıştırabilirdik — bu örnekler bir demo NodeJS web uygulamasıyla çalışıyor (GitHub'da kaynak kod) — ama daha yaygın bir alternatif var.
OPA Gatekeeper'ı çalıştırmak
Özel webhook'ların iki olumsuz tarafı var: kodu kendiniz yazmanız gerekiyor, bu da bakım yükünüze ekleniyor; ve kuralları küme üzerinden keşfedilebilir değil, dolayısıyla harici dökümantasyona ihtiyacınız oluyor.
OPA Gatekeeper, admission control'ü genel kural tanımlarıyla (Rego adında bir dille) uygulayan bir alternatif.
Admission kurallarını — bir başka CNCF projesi olan — Gatekeeper ile dağıtacağız. Kubernetes'i yeni nesne tipleriyle genişletiyor ve kendi kurallarınızı saklamak ve uygulamak için o nesneleri kullanıyorsunuz.
OPA Gatekeeper de karmaşık bir bileşen; onu yönetmenin yükünü kendi controller'larınızı çalıştırmanın sorunlarıyla takas ediyorsunuz:
- opa-gatekeeper/v3.23.1.yaml — admission
kurallarını tanımlamak için özel kaynaklar, controller için RBAC ve onu çalıştırmak için bir Service ile Deployment dağıtıyor
OPA'yı dağıtın:
kubectl apply -f labs/admission/specs/opa-gatekeeper📋 Gatekeeper hangi özel kaynak tiplerini kuruyor?
Takıldınız mı?
CustomResourceDefinition'lara bakın:
kubectl get crdBirkaç tane göreceksiniz — asıl çalıştığımız ConstraintTemplate.
OPA admission kurallarını dağıtmak
Gatekeeper ile kural uygulamanın iki parçası var:
- Genel bir kısıt tanımlayan bir ConstraintTemplate oluşturmak (örneğin
belirli bir namespace'teki container'lar yalnızca belirli bir imaj registry'si kullanabilir)
- Şablondan bir Constraint oluşturmak (örneğin
whoaminamespace'indekicontainer'lar yalnızca Docker Hub'daki
courselabsrepolarından imaj kullanabilir)
Kural tanımı Rego genel politika diliyle yapılıyor:
- requiredLabels-template.yaml —
bir nesnede etiket zorunlu kılan basit (!) bir şablon tanımlıyor
- resourceLimits-template.yaml —
container nesnelerinde resources tanımlı olmasını zorunlu kılan daha karmaşık bir şablon tanımlıyor
Şablonları oluşturun:
kubectl apply -f labs/admission/specs/opa-gatekeeper/templates📋 Özel kaynakları yeniden kontrol edin; Gatekeeper kısıtları Kubernetes'te nasıl sakliyor sizce?
Takıldınız mı?
kubectl get crdKısıt şablonları için yeni CRD'ler görüyorsunuz:
policyresourcelimits.constraints.gatekeeper.sh
requiredlabels.constraints.gatekeeper.shGatekeeper her kısıt şablonu için bir CRD oluşturuyor; böylece her kısıt bir Kubernetes kaynağı oluyor.
Şablonları kullanan kısıtlar şunlar:
- requiredLabels.yaml —
Pod'larda
appveversion, namespace'lerde isekubernetes.courselabs.coetiketini zorunlu kılıyor
- resourceLimits.yaml —
apodnamespace'indeki tüm Pod'lar için resources belirtilmesini zorunlu kılıyor
Kısıtları dağıtın:
kubectl apply -f labs/admission/specs/opa-gatekeeper/constraints📋 Zorunlu etiketler namespace kısıtının ayrıntılarını yazdırın. Neyi zorunlu kıldığı anlaşılıyor mu?
Takıldınız mı?
Kısıt tipi bir CRD olduğu için nesneleri her zamanki gibi listeleyebilirsiniz:
kubectl get requiredlabels
kubectl describe requiredlabels requiredlabels-nsKuralın mevcut tüm ihlallerini göreceksiniz ve neyin gerektiği anlaşılır olmalı — her namespace üzerindeki etiket.
Rego kolay bir dil değil — ama politika tanımlamanın genel bir yolu. Trivy de hatalı yapılandırma kontrol kütüphanesi için Rego kullanıyor (o kütüphane eskiden appshield adlı bir repoda duruyordu).
OPA kurallarını doğrulamak
labs/admission/specs/pi klasöründeki bu uygulama YAML'ı, namespace ve Pod'lar
için tanımlı tüm OPA kurallarını ihlal ediyor.
📋 Uygulamayı dağıtın. Çalışıyor mu?
Takıldınız mı?
Kubectl apply kullanın:
kubectl apply -f labs/admission/specs/piPolitika ihlali nedeniyle namespace'in oluşturulamadığını, ardından namespace olmadığı için diğer nesnelerin de oluşturulamadığını söyleyen hatalar göreceksiniz.
Bazı politika hataları Kubectl ile oluşturduğunuz nesnelerde oluyor — dolayısıyla böyle net doğrulama hataları görüyorsunuz.
Düzeltme fix-1/01-namespace.yaml dosyasında; namespace'e gereken etiketi ekliyor. Düzeltilmiş sürümü dağıtıp çıktıyı kontrol edin:
kubectl apply -f labs/admission/specs/pi/fix-1Kubectl çıktısı tüm nesnelerin oluşturulduğunu söylüyor. http://localhost:30031 adresinde dinliyor olmalı. Çalışıyor mu? Hayır... Service oluşturulmuş ama ondan yanıt yok.
📋 Sorunun ne olduğunu görmek için hata ayıklayabilir misiniz?
Nasıl yapılacağını bilmiyor musunuz?
Service'i tanımlayarak başlayın:
kubectl describe svc pi-np -n piHiç Endpoints olmadığını göreceksiniz; yani Service'in trafik yönlendireceği hedef olarak kaydolmuş Pod yok.
Namespace'teki tüm Pod'ları listelemeyi deneyin:
kubectl get po -n piHiç yok. Hmm. Deployment ve ReplicaSet'ler nasıl?
kubectl get deploy,rs -n piOluşturulmuşlar ama Pod yok. Sorunu görmek için ReplicaSet'i tanımlayın:
kubectl describe rs -n piŞimdi hatayı göreceksiniz.
OPA Gatekeeper politikası Pod'ların oluşturulmasını engelliyor — olaylarda sebebini söyleyen iki uyarı mesajı var:
Error creating: admission webhook "validation.gatekeeper.sh" denied the request: [resource-limits] container <pi-web> has no resource limits
Error creating: admission webhook "validation.gatekeeper.sh" denied the request: [requiredlabels-pods] you must provide labels: {"version"}Ama bunu Kubectl'de görmüyorsunuz, çünkü Pod'ları doğrudan siz oluşturmuyorsunuz — bir Deployment oluşturuyorsunuz, o bir ReplicaSet oluşturuyor, o da Pod'ları oluşturuyor.
fix-2/deployment.yaml içindeki Pod şablonu gereken etiketleri ve kaynakları ekliyor.
📋 fix-2 YAML'ını dağıtın — uygulama şimdi çalışıyor mu?
Nasıl yapılacağını bilmiyor musunuz?
kubectl apply -f labs/admission/specs/pi/fix-2
kubectl get pods -n piİyi görünüyor 🙂
Uygulamayı şimdi http://localhost:30031 adresinde deneyin. Sınırlı miktarda CPU ve bellekle çalışıyor ve operasyon açısından yönetimi kolay, çünkü tutarlı bir etiket kümesine sahip.
Lab
Sıra bir uygulama dağıtıp admission gereksinimlerini karşıladığından emin olmada sizde.
Bu lab'ın belirtimlerinden demo Astronomy Picture of the Day uygulamasını dağıtmayı deneyin:
kubectl apply -f labs/admission/specs/apodKaynaklar, yürürlükteki kısıtları karşılamadığı için başarısız olacak. Göreviniz belirtimleri düzeltip uygulamayı çalıştırmak — politikalarda hiçbir değişiklik yapmadan 🙂
Takıldınız mı? İpuçlarına bakın veya çözümü inceleyin.
Temizlik
Lab'ın tüm namespace'lerini kaldırın; bu diğer tüm nesneleri de kaldırıyor:
kubectl delete ns -l kubernetes.courselabs.co=admissionCRD'ler hariç:
kubectl delete crd -l gatekeeper.sh/system
kubectl delete crd -l gatekeeper.sh/constraint