KubeLinter Mucizesi

Elman Badalov
5 min readOct 14, 2021

--

Selamlar, ben Elman. Bugün sizlere başlıktan da belli olduğu gibi KubeLinter mucizesinden bahsedeceğim. Eskiden yaşadığımız Helm sorunlarını artık unutalım. “Acaba nerede hata yaptım?”, “Tamam helmi hazırladım ama kurmam gereken başka extension’lar var mı?”, “Acaba kurduğum annotation’lar doğru mu? veya Secure bir açık bırakır mıyım?” sorularını artık KubeLinter bizler için cevaplayacak. Hadi baştan başlayalım 😊

KubeLinter nedir ?

KubeLinter, Kubernetes YAML dosyalarını ve Helm çizelgelerini analiz eden ve deploy esnasında oluşabilecek tehlikelere ve güvenlik açıklarını kontrol ederek, buna karşı bizi uyaran tool’dur.

KubeLinter, size Kubernetes YAML dosyalarınız ve Helm çizelgeleriniz hakkında faydalı bilgiler vermek için tasarlanmıştır ve kontrol zamanı mantıklı varsayılan durumlar üzerinden çalışma yaparak sizi olası tehlikelere karşı uyarır. Bu tool, Cloud ekiplerinin yanlış güvenlik yapılandırmalarına karşı DevOps alanında en iyi uygulamaların helm yapılarının sıklıkla kontrol etmesine yardımcı olmak için var.

KubeLinter yapılandırılabilir durumdadır. Böylece helm yapısında veya K8S yaml dosyalarında takip etmek istediğiniz politikalara bağlı olarak kendi özel kontrollerinizi oluşturmanın yanı sıra kontrolleri etkinleştirebilir ve devre dışı bırakabilirsiniz. Bunları tabiki dışarıdan komut vererek veya yaml dosyasının içerisine annotation geçerek yapabilirsiniz. Hiç merak etmeyin bundan da bahsedeceğim. Hadi devam edelim 😉

KubeLinter Kurulumu

Kurulumu yapmadan önce dikkat etmemiz gereken bazı hususlar var. Örneğin ilk adımda GoLang Programlama Dilinin local ortama kurulu olması ve aynı zamanda go version 1.16 ve üzeri sürüm olması gerekmektedir. Aksi durumda kurulum zamanı bazır sorunlarla karşılaşacağız. Kurulum adımları ekteki gibi uygulanmalıdır:

1git clone git@github.com:stackrox/kube-linter.git

2cd kube-linter && make build

3cp .gobin/kube-linter /bin/kube-linter (/usr/bin) && kube-linter version

Eğer kurulum zamanı herhangi bir sorunla karşılaşmadıysak ve version çıktısını görebildiysek demek ki, kurulum işlemleri başarılı bir şekilde tamamlanmıştır. Sonraki adım kullanım ve çıktıları olacak. Burada işlemleri nasıl uygulayacağımızı ve sonuçlarını konuşacağız.

KubeLinter Kullanımı ve Çıktıları

kube-linter lint /path/to/your/yaml.yaml

Örnek bir yaml ile bu bu komutu deneyelim:

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80

Şimdi kube-linter komutunu kullanarak helm yapımızda hangi secure açıkların ve yanlış yapıların olduğunu görelim.

kube-linter lint /opt/example.yaml

Şimdi çıktımızı kontrol edelim ve KubeLinter’in bizi hangi sorunlar üzerine uyardığını görelim.

  1. check: no-anti-affinity Policy: Bildiğimiz gibi pod’lar belli bir nodeAffinity bilgisini ele alarak ilgili node’lar üzerinde dağılım yapıyor. Eğer biz bu bilgiyi yaml üzerinde geçmezsek o zaman Kubernetes bu işlemi bizim için default olarak yapıyor ve hangi nodegroup müsaitse pod o node’un üzerinde çalışmaya başlıyor ve trafik o node üzerinden akmaya başlıyor. Bu yönetemeyeceğimiz yapıdır. Buyüzden KubeLinter bizi bu konuda uyarıyor.
  2. no-read-only-root-fs Policy: Burada KubeLinter ilgili policy’i kullanarak yaml üzerinde kontrol sağlıyor ve nginx yapısının file system üzerinde root yetkisine sahip olduğunu ve bu işlemin tehlikeli olduğunu bizlere gösteriyor. Burada read-only yetkisinin olmasını öneriyor. run-as-non-root Policy aynı zamanda bu Policy de bizi bazı işlemlerin root yetkisine sahip olmaması gerektiği hususunda uyarıyor ve bu işlemin Secure açık olduğunu belirtiyor.
  3. unset-cpu-requirements, unset-memory-requirements Policy: Burada KubeLinter bize yaml üzerinde Cpu ve Memory limitlerinin ve aynı zamanda request bilgilerinin verilmesi gerektiği konusunda uyarıyor. Çünkü eğer biz bu limitlemeyi yapmazsak o zaman pod node üzerinde Defult olarak sınırsız cpu ve memory kullanımı yapar. Bu da tabiki karşılaşmak istemediğimiz bir durumdur.

Yukarıda KubeLinter’in bazı Policy’lerini inceledik. Peki daha ayrıntılı ve tüm Policy’lerin kullanımını sağlayan bir kontrol istiyorsak ne yapmalıyız? Burada tüm policy’ler aktif olarak çalışacaktır. KubeLinter bu konuda da bizi düşünüyor ve ek bir komut desteğimize geliyor.

kube-linter lint path/to/example.yaml — add-all-built-in

Bu komut bize helm dosyasında hangi sorunların olduğunu daha ayrıntılı ve yaml dosyasında oluşabilecek deafult sorunlarla beraber gösteriyor. Yani bu komutu kullandığımızda normalde 7 hatalı işlem var iken 16 hatalı işleme kadar yükseliyor. Amaç daha fazla hatayı göstererek (default oluşmuş sorunlar ile beraber) best practice’lere en uygun yaml’ı hazırlamamızda bize yardımcı olmaktır.

Eğer tüm kontrol Policy’lerini disable etmek istiyorsak bunun için de bu komutu kullanabiliriz. KubeLinter her konuda kullanıcıları düşünüyor.

kube-linter lint path/to/example.yaml — do-not-auto-add-defaults

Bu bayrağı kullanarak defult warning check disable etmiş olacağız. Artık helm yaml dosyalarında default warning’leri görmemiş olacağız ve bu şekilde tüm kontrolleri devre dışı bırakmış olacağız. Ama tabiki önerilen bunun kullanılmaması üzerinedir.

Peki diyelim ki, biz helm yapısı üzerinde bazı Policy’lerin kullanılmamasını istiyorsak ne yapmalıyız? Merak etmeyin bu konuda da yine KubeLinter bizi düşünüyor. Bu Policy’leri biz helm yapısı üzerinde annotation olarak geçersek Policy buraya geldiği zaman burayı atlıyor ve bizim verdiğimiz bilgileri ekrana bastırıyor.

Örnek:

- annotations:
ignore-check.kube-linter.io/unset-cpu-requirements : “cpu ayarlaması gerekli değildir.”

Annotation’a ekleyeceğimiz Policy bilgileri ekteki gibidir:

  1. env-var-secret
  2. no-liveness-probe
  3. no-read-only-root-fs
  4. no-readiness-probe
  5. non-existent-service-account
  6. required-annotation-email
  7. required-label-owner
  8. run-as-non-root
  9. unset-cpu-requirements
  10. unset-memory-requirements

ignore-check.kube-linter.io/<check name> : “INFO”

Reference

KubeLinter: https://docs.kubelinter.io/#/

Bugün sizler için KubeLinter tool’unu adım adım anlatmaya çalıştım. Umarım keyifle okuyacağınız ve beğeneceğiniz bir yazı olmuştur. Şimdiden keyifli okumalar… 😊

Yazının ingilizce versiyonunu okumak için lütfen aşağıdaki linke tıklayınız:

https://thebadalov.medium.com/miracle-of-kubelinter-75d5e23a1f22

--

--