Kubernetes ile ilk tanıştığınızda hemen her işi tek bir araçla yaptığınızı fark ediyorsunuz: kubectl. Peki kubectl nasıl çalışır, yazdığınız komut cluster'a nasıl ulaşıyor ve günlük işlerde en çok hangi kubectl komutları lazım oluyor? Bu yazıda önce perde arkasını, sonra da işinize yarayacak komutları tablolar halinde topladık. Kubernetes'e tamamen yeniyseniz önce Kubernetes nedir yazımıza göz atmanızı öneririz.
Kubectl Nedir?
kubectl, Kubernetes cluster'larını komut satırından yönetmek için kullanılan resmi araç. Pod listelemek, uygulama deploy etmek, log okumak, bir pod'un içine girmek, ölçeklendirmek... hepsi kubectl ile yapılıyor. Okunuşu konusunda topluluk hala anlaşamadı; "kube-control", "kube-c-t-l" hatta "kube-cuttle" diyenler var, hangisini derseniz deyin herkes anlıyor.
Kubectl Nasıl Çalışır?
Önemli bir detay: kubectl cluster'daki sunuculara doğrudan bağlanmıyor. Yaptığı tek şey Kubernetes API sunucusuyla (kube-apiserver) HTTPS üzerinden konuşmak. Bir komut yazdığınızda arka planda kabaca şunlar oluyor:
- kubeconfig okunur: kubectl hangi cluster'a, hangi kullanıcıyla bağlanacağını
~/.kube/configdosyasından öğrenir. - İstek hazırlanır:
kubectl get podsgibi bir komut, API sunucusuna gidecek bir REST isteğine (ör.GET /api/v1/namespaces/default/pods) çevrilir. - Kimlik doğrulama: API sunucusu sertifika veya token ile kim olduğunuzu kontrol eder.
- Yetkilendirme (RBAC): Bu işlemi yapmaya yetkiniz var mı diye bakılır.
- Kayıt: Değişiklik içeren isteklerde (apply, scale, delete) yeni "istenen durum" cluster'ın veritabanı olan etcd'ye yazılır.
- Uygulama: Scheduler yeni pod'ları uygun node'lara yerleştirir, controller'lar istenen durumla gerçek durumu eşitler, her node'daki kubelet de container'ları başlatır.
Yani kubectl aslında akıllı bir API istemcisi. Bunu bilmek, "neden komut hemen bitti ama pod hala Pending?" gibi soruların cevabını da veriyor: kubectl isteği iletip dönüyor, asıl iş arka planda devam ediyor.
-v=6 eklerseniz kubectl'in API sunucusuna hangi istekleri gönderdiğini görebilirsiniz. Öğrenmek için çok faydalı.Kubeconfig Dosyası ve Context Mantığı
kubeconfig dosyası üç ana bölümden oluşuyor:
- clusters: API sunucusunun adresi ve sertifikası,
- users: kimlik bilgileri (sertifika, token vb.),
- contexts: "şu cluster'a, şu kullanıcıyla, şu namespace'te bağlan" eşleştirmesi.
Birden fazla cluster ile çalışıyorsanız (ör. test ve prod) context'ler arasında geçiş yaparsınız:
kubectl config get-contexts # tanımlı context'leri listeler
kubectl config current-context # şu an hangi context'tesiniz
kubectl config use-context prod-cluster # başka bir cluster'a geçer
kubectl config set-context --current --namespace=uygulama # varsayılan namespace'i değiştirir
Prod ortamında yanlış context'te komut çalıştırmak malesef en sık yapılan hatalardan biri. Komut yazmadan önce current-context'e bakmayı alışkanlık haline getirin.
Kubectl Kurulumu
kubectl macOS, Linux ve Windows'ta çalışıyor. macOS'ta brew install kubectl, Linux'ta resmi paket deposu veya tek bir binary indirerek, Windows'ta winget/choco ile kurabilirsiniz. Kurulumu kontrol etmek için:
kubectl version --client
kubectl sürümünün cluster sürümünden en fazla bir minor sürüm ileri veya geri olması öneriliyor.
Kubectl Komut Yapısı
Neredeyse tüm komutlar aynı kalıbı izliyor:
kubectl [komut] [kaynak-türü] [ad] [bayraklar]
# örnek:
kubectl get pods web-7d4b9 -n uygulama -o wide
Burada get komut, pods kaynak türü, web-7d4b9 kaynağın adı, -n ve -o da bayraklar.
En Çok Kullanılan Kubectl Komutları
Bilgi Alma ve İnceleme
| Komut | Ne yapar? |
|---|---|
kubectl get pods | Pod'ları listeler (-A ile tüm namespace'ler) |
kubectl get all | Namespace'teki temel kaynakları birlikte gösterir |
kubectl describe pod <ad> | Kaynağın detaylarını ve son olaylarını gösterir; hata ayıklamada ilk durak |
kubectl logs <pod> | Container loglarını gösterir (-f canlı takip, --previous çöken önceki container) |
kubectl get events --sort-by=.lastTimestamp | Cluster'daki son olayları sıralı listeler |
kubectl top pods / top nodes | CPU ve RAM kullanımını gösterir (metrics-server gerekir) |
Oluşturma ve Güncelleme
| Komut | Ne yapar? |
|---|---|
kubectl apply -f app.yaml | YAML'daki kaynakları oluşturur ya da günceller (en çok kullanılan) |
kubectl create deployment web --image=nginx | Hızlıca bir deployment oluşturur |
kubectl edit deploy/web | Kaynağı editörde açıp canlı düzenlemenizi sağlar |
kubectl patch deploy/web -p '{...}' | Kaynağın sadece belirli alanlarını değiştirir |
kubectl set image deploy/web web=nginx:1.27 | Container imajını günceller |
kubectl scale deploy/web --replicas=5 | Kopya sayısını değiştirir |
Silme
| Komut | Ne yapar? |
|---|---|
kubectl delete -f app.yaml | YAML'da tanımlı kaynakları siler |
kubectl delete pod <ad> | Pod'u siler; deployment'a bağlıysa yerine yenisi açılır |
kubectl delete deploy/web | Deployment'ı ve pod'larını siler |
Hata Ayıklama
| Komut | Ne yapar? |
|---|---|
kubectl exec -it <pod> -- sh | Çalışan container'ın içinde shell açar |
kubectl port-forward svc/web 8080:80 | Servisi kendi bilgisayarınızın 8080 portuna bağlar |
kubectl cp <pod>:/yol ./yerel | Pod ile bilgisayarınız arasında dosya kopyalar |
kubectl debug -it <pod> --image=busybox | Pod'a geçici bir hata ayıklama container'ı ekler |
Rollout (Sürüm) Yönetimi
| Komut | Ne yapar? |
|---|---|
kubectl rollout status deploy/web | Güncellemenin ilerleyişini takip eder |
kubectl rollout history deploy/web | Önceki sürümleri listeler |
kubectl rollout undo deploy/web | Bir önceki sürüme geri döner |
kubectl rollout restart deploy/web | Pod'ları sırayla yeniden başlatır (kesintisiz) |
Çıktı Formatları
| Bayrak | Ne verir? |
|---|---|
-o wide | Ek sütunlar (node adı, IP vb.) |
-o yaml / -o json | Kaynağın tam tanımı |
-o name | Sadece kaynak adları (script'lerde işe yarar) |
-o jsonpath='{.items[*].metadata.name}' | İstediğiniz alanı seçip çıkarır |
-w | Değişiklikleri canlı izler (watch) |
Kaynak Türlerinin Kısa Adları
Her seferinde uzun uzun yazmak yerine kısa adları kullanabilirsiniz:
| Kaynak | Kısa ad | Kaynak | Kısa ad |
|---|---|---|---|
| pods | po | configmaps | cm |
| services | svc | ingresses | ing |
| deployments | deploy | persistentvolumeclaims | pvc |
| namespaces | ns | nodes | no |
Imperative mi, Declarative mi?
kubectl ile iki farklı şekilde çalışabilirsiniz. Komutla doğrudan "şunu yap" demek (imperative) ya da YAML'da "şöyle olsun" deyip apply etmek (declarative).
| Imperative (komutla) | Declarative (YAML + apply) | |
|---|---|---|
| Örnek | kubectl create deployment, kubectl scale | kubectl apply -f app.yaml |
| Hız | Tek seferlik işler için çok hızlı | İlk yazımı biraz daha uzun |
| Tekrarlanabilirlik | Düşük, ne yapıldığı kayıt altında değil | Yüksek, dosya her şeyi anlatır |
| Git / CI/CD uyumu | Zayıf | Çok iyi (GitOps'un temeli) |
| Ne zaman? | Test, deneme, acil müdahale | Üretim ortamı ve ekip çalışması |
apply, create ve replace Arasındaki Fark
| Komut | Kaynak yoksa | Kaynak varsa | Ne zaman kullanılır? |
|---|---|---|---|
kubectl create | Oluşturur | Hata verir | Bir kere oluşturulacak kaynaklar |
kubectl apply | Oluşturur | Farkları birleştirerek günceller | Günlük kullanım, GitOps |
kubectl replace | Hata verir | Kaynağı tamamen yenisiyle değiştirir | Tüm tanımı bilerek ezmek istediğinizde |
Hayatınızı Kolaylaştıracak Birkaç İpucu
- Kısayol tanımlayın:
alias k=kubectlile her seferinde 7 harf yerine 1 harf yazarsınız. - Otomatik tamamlama:
source <(kubectl completion bash)(zsh içincompletion zsh) ile kaynak adlarını Tab ile tamamlayabilirsiniz. - YAML'ı sıfırdan yazmayın:
kubectl create deployment web --image=nginx --dry-run=client -o yaml > web.yamlsize hazır bir şablon verir. - Alanların ne işe yaradığını öğrenin:
kubectl explain deployment.spec.strategyile herhangibir alanın açıklamasını terminalden okuyabilirsiniz. - Etiketlerle filtreleyin:
kubectl get pods -l app=websadece o etikete sahip pod'ları getirir.
Kubectl'i Denemek İçin Hazır Bir Cluster
Bu komutları okumak bir şey, denemek başka birşey. Kendi bilgisayarınıza cluster kurmakla uğraşmak istemiyorsanız VECDC Kubernetes Server paketleri Kubernetes ön kurulu geliyor; aylık $6'dan başlıyor ve otomatik kurulum sayesinde yaklaşık 5 dakikada kubeconfig dosyanız e-postanızda oluyor. Dosyayı ~/.kube/config olarak kaydettiğiniz an bu yazıdaki tüm komutları deneyebilirsiniz. Üretim için çok node'lu bir yapı gerekiyorsa Kubernetes danışmanlık ekibimiz yardımcı olabilir.
Sık Sorulan Sorular
kubectl ile kubeadm arasındaki fark nedir?
kubeadm, Kubernetes cluster'ını kurmak (node eklemek, control plane'i ayağa kaldırmak) için kullanılır. kubectl ise kurulu bir cluster'ı yönetmek için kullanılan istemci araçtır; pod listelemek, deploy etmek, log okumak gibi işler kubectl ile yapılır.
kubeconfig dosyası nerede durur?
Varsayılan olarak kullanıcı dizinindeki ~/.kube/config dosyasıdır. Farklı bir dosya kullanmak için KUBECONFIG ortam değişkenini veya --kubeconfig bayrağını kullanabilirsiniz.
kubectl apply mi, kubectl create mi kullanmalıyım?
Günlük kullanımda ve üretim ortamında kubectl apply önerilir; kaynak yoksa oluşturur, varsa farkları birleştirerek günceller ve YAML dosyalarıyla Git üzerinden yönetime uygundur. create ise kaynak zaten varsa hata verir.
Yanlış cluster'da komut çalıştırmayı nasıl önlerim?
Komut çalıştırmadan önce kubectl config current-context ile hangi cluster'da olduğunuzu kontrol edin, prod ve test için ayrı context ve namespace kullanın; terminal isteminize aktif context'i gösteren araçlar da bu hatayı büyük ölçüde azaltır.
Kısacası
kubectl, kubeconfig dosyasındaki bilgilerle Kubernetes API sunucusuna istek gönderen bir komut satırı aracı. Asıl işi cluster'ın kendisi yapıyor, kubectl sadece ne istediğinizi iletiyor. Bu yazıdaki tabloları bir kenara kaydedin; günlük işlerin büyük kısmı bu komutlarla hallediliyor. Takıldığınız bir yer olursa bize yazın.