KYAML Nedir ve Kubernetes YAML’ı Nasıl Biçimlendirir?
Kubernetes manifestlerini yazarken YAML uzun süredir fiili standart. YAML’ın esnekliği aynı yapıyı farklı şekillerde ifade etmeye izin verdiği için ekiplerde tutarsızlığa ve zaman zaman sürpriz davranışlara yol açıyor. Kubernetes topluluğu bu soruna yeni bir dil icat ederek değil, mevcut YAML’ın daha dar ve tutarlı bir alt kümesini tanımlayarak yanıt veriyor: KYAML.
Bu yazıda KYAML’ın ne olduğunu, hangi problemleri çözdüğünü ve mevcut YAML dosyalarını KYAML biçiminde üretmenin yollarını kaynak belgeye sadık kalarak özetliyorum.
KYAML nedir?
KYAML, standart YAML’ın katı bir alt kümesi (ya da “lehçesi”) olarak tanımlanıyor. Yeni bir format veya yeni bir ayrıştırıcı getirmiyor; mevcut YAML ekosistemi tarafından olduğu gibi ayrıştırılabiliyor. Öneri, SIG CLI tarafından KEP 5295 kapsamında getirildi.
KYAML’ı yeni bir dilden çok, üzerinde uzlaşılmış bir yazım stili gibi düşünmek daha doğru. KYAML olarak geçerli her şey aynı zamanda geçerli YAML. Fark, yazarken yaptığınız seçimlerin daraltılmış olması.
Hangi sorunları çözüyor?
Standart YAML’ın bilinen bazı tuzakları var; JSON da bunlara alternatif olamıyor.
Boşluğa duyarlılık
YAML’da yapı girintiyle tanımlanır. Yanlış girintili bir dosya sözdizimsel olarak geçerli kalabilir ama amaçlanandan farklı bir nesneyi temsil eder. Bu durum, YAML bağlamının dışından girintiyi manipüle eden Helm gibi şablonlama araçlarında özellikle sorun çıkarır.
Sessiz tür dönüşümleri
YAML’da string tırnaklamak isteğe bağlıdır. Bazı string gibi görünen değerler uyarı verilmeden başka türlere dönüştürülür. Klasik örnek “Norway Bug” olarak bilinen durumdur:
country: NO
Standart YAML’da NO değeri "NO" string’i olarak değil, boolean false olarak ayrıştırılır.
JSON neden çözüm değil?
JSON yorum satırlarını desteklemez, sondaki virgüle izin vermez ve her anahtarın tırnak içinde olmasını gerektirir. Bu da onu manuel yapılandırma yazımı için elverişsiz kılar.
KYAML’ın kuralları
KYAML, yapı ve türleri açık hale getirerek bu problemleri şu şekilde ele alıyor:
- Yapı için girintiye bağımlı değildir.
- Değer string’lerini her zaman tırnak içine alır, sessiz tür dönüşümü olmaz.
- Map ve struct’lar için her zaman
{}kullanır. - Listeler için her zaman
[]kullanır. - JSON’un aksine yorum ve sondaki virgüle izin verir.
- Dosyaya
---başlığı ekler; böylece hem KYAML hem de JSON{ile başlamasına rağmen ilk bakışta ayırt edilir.
YAML terminolojisinde buna flow style deniyor; çoğunluğun kullandığı block style‘ın karşıtı. KYAML, JSON ile klasik YAML arasında bir noktada duruyor: varsayılan YAML’dan daha açık, JSON’dan daha okunabilir.
Aynı manifest, iki farklı stil
Aynı Pod manifestini iki biçimde görelim.
Standart YAML:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
labels:
app: demo
spec:
containers:
- name: nginx
image: nginx:1.20
KYAML:
---
{
apiVersion: "v1",
kind: "Pod",
metadata: {
name: "my-pod",
labels: {
app: "demo",
},
},
spec: {
containers: [{
name: "nginx",
image: "nginx:1.20",
}],
},
}
Çift tırnaklı string değerler, her map’in etrafındaki süslü parantezler, listenin etrafındaki köşeli parantezler ve sondaki virgüller dikkat çekiyor. Ek sözdizimi, belge yapısını girintiye güvenmek yerine açıkça ortaya koyuyor.
YAML’ı KYAML olarak üretmenin yolları
Seçenek 1: kubectl -o kyaml
Kubernetes 1.34’ten itibaren kubectl, KYAML’ı yerel bir çıktı formatı olarak destekliyor.
# Kubernetes 1.35+ (beta; özellik varsayılan olarak açık, -o kyaml parametresi hâlâ gerekli)
kubectl get deployment my-app -o kyaml
# Kubernetes 1.34 (alpha, opt-in)
export KUBECTL_KYAML=true
kubectl get deployment my-app -o kyaml
Çıktıyı bir dosyaya kaydetmek için:
kubectl get deployment my-app -o kyaml > my-app.yaml
Kaynağa göre KYAML’ı varsayılan çıktı formatı yapma planı yok. Varsayılan olarak KYAML kullanmak isterseniz kuberc üzerinden yapılandırabilirsiniz:
# Kubernetes 1.36+
kubectl kuberc set --section defaults --command get --option output=kyaml
# Kubernetes 1.33–1.35 (alpha öneki hâlâ gerekli)
kubectl alpha kuberc set --section defaults --command get --option output=kyaml
Seçenek 2: Kubernetes’in yamlfmt aracı
sigs.k8s.io/yaml deposu, dosyaları KYAML’a çevirebilen bir yamlfmt aracı içeriyor.
Go ile kurulum:
go install sigs.k8s.io/yaml/yamlfmt@latest
Araç bir dosya üzerinde çalıştırıldığında KYAML çıktısını stdout‘a yazar. Bir dizin de kabul eder; bu durumda dizindeki her dosyayı dönüştürüp yazdırır. Dönüşümü kalıcı hale getirmek için çıktıyı dosyaya yönlendirmeniz gerekir.
yamlfmt -o=kyaml my-deployment.yaml
Tam dönüşüm yerine yalnızca fark göstermesini de isteyebilirsiniz:
yamlfmt -o=kyaml -d my-deployment.yaml
Seçenek 3: Google’ın yamlfmt aracı
Mevcut dosyaları dönüştürmek için Google’ın yamlfmt aracı, v0.21.0 sürümüyle özel bir kyaml formatlayıcısı ekledi.
Go ile veya releases sayfasından ikili dosya alarak kurabilirsiniz:
go install github.com/google/yamlfmt/cmd/yamlfmt@latest
Ayrıca bir pre-commit hook ve CI hatları için bir Docker imajı olarak da mevcut. Proje kökünüze şu .yamlfmt yapılandırmasını ekleyin:
formatter:
type: kyaml
Dosyanızı değiştirmeden çıktıyı önizlemek için:
yamlfmt -dry my-deployment.yaml
Uygulamak için:
yamlfmt my-deployment.yaml
Tüm dizini dönüştürmek için:
yamlfmt./k8s/
kyaml formatlayıcısı ek bir yapılandırma almaz ve varsayılan formatlayıcıyla seçenekleri paylaşmaz; ikisini karıştırmak hataya yol açar.
KYAML’a geçmeye değer mi?
Her geçerli KYAML dosyası aynı zamanda geçerli bir YAML dosyasıdır. Bu, mevcut araçlarınızın, kubectl‘ünüzün ve CI hatlarınızın hiçbir şey değiştirmesine gerek olmadığı anlamına gelir. KYAML’ı yalnızca 1.34+ değil, herhangi bir kubectl sürümüne girdi olarak da verebilirsiniz; sonuçta bu sadece YAML.
KYAML kesinlikle zorunlu değil. Block-style YAML yazmaya devam edebilirsiniz ve her şey çalışır. KYAML, özellikle bir ekipte veya daha büyük bir depoda yapılandırmaları daha az hataya açık ve daha tutarlı hale getirmek için bilinçli bir tercih. Bir göç değil, daha iyi bir alışkanlık olarak düşünmek yerinde olur.
Kaynaklar ve İleri Okuma
- How to Pretty-Print Your Kubernetes YAML as KYAML and Why You’d Want To (kubernetes.io)
- KEP 5295: KYAML önerisi
- kubectl kuberc belgeleri
- kubernetes-sigs/yaml deposu ve yamlfmt aracı
- Google yamlfmt — yapılandırma, komut kullanımı, pre-commit, sürümler
- StrictYAML: implicit typing sorunu ve Norway Bug
- SIG CLI topluluk sayfası
- İlgili yazı: Kubernetes 1.36 Ön İzleme: Neler Geliyor, Neler Gidiyor?







Yorum gönder