Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Terraform'da Sorun Giderme: Plan'ı Okumak, TF_LOG, Provider Hataları, State Kilidi, "Already Exists" ve Drift
Terraform'da sorun gidermenin ilk adımı hatanın hangi aşamada (init, plan ya da apply) çıktığına bakmak ve plan'daki notları okumaktır. Plan'ı metin ve JSON olarak okuyor, TF_LOG ile provider'ın içine bakıyor, lock file uyumsuzluğunu, "already exists" hatasını, kilitli state'i, provider'ın göremediği drift'i, cycle hatasını ve -target'ı gerçek çıktılarla inceliyor; Azure'da soft-delete'te bekleyen Key Vault vakasını çözüyoruz.
Terraform Built-in Function'ları ve Expression Kalıpları: String, Collection, Encoding, Filesystem ve Network Fonksiyonları, for, Splat ve terraform console
Terraform expression'larını rahat yazmanın yolu, 119 built-in fonksiyonu aileleriyle tanımak ve her ifadeyi önce terraform console'da denemektir. String, collection, encoding, filesystem ve network fonksiyonlarını, for ve splat'i, optional() varsayılanlarını ve AzureRM'in provider function'larını deniyor; Bookstore'da ortam başına subnet'i cidrsubnet ile, API ayarlarını da YAML'dan kuruyoruz.
Windows Container'ları: .NET Framework 4.8 ve IIS Uygulamasını Container'a Almak, Server Core, Nano Server ve Isolation Modları
Bir .NET Framework 4.8 ve IIS uygulaması Windows container'ına girer, ama yalnız Windows host'ta ve image'ın Windows sürümü host'unkine uyduğunda çalışır. Bookstore'un eski back office'i için Server Core tabanlı Dockerfile'ı, web.config'i ortam değişkenleriyle güncelleyen configuration builder'ları, ServiceMonitor ve LogMonitor'ü, process ve Hyper-V isolation'ı, 2,6 GB'lık image'ı, çok işletim sistemli tag'leri ve AKS'teki Windows node pool'u ele alıyor, .NET 10'a taşıma kararını tartışıyoruz.
Dockerfile'ın Az Bilinen Instruction ve Bayrakları: Heredoc, SHELL, ADD'nin Git/URL Kaynakları, COPY --exclude/--parents/--link ve Build Check'ler
Dockerfile'ın yeni bayrakları güvenli kullanılırsa build'i hem kısaltır hem sağlamlaştırır: heredoc'ta set -eu, ADD'de --checksum, COPY'de --parents ve --exclude, publish'te RUN --network=none. Frontend'in docker/dockerfile:1 tag'inin yazım günü 1.27.1'de kaldığını ve 1.29.0 ile davranışın nasıl değiştiğini gerçek çıktılarla gösteriyor, SHELL ile pipefail, ONBUILD, build check'ler ve hadolint'i Bookstore.Api'nin yeni Dockerfile'ında birleştiriyoruz.
Kubernetes'i Genişletmek: CRD, Controller ve Operator Pattern'i, ownerReferences ve Finalizer'lar
Kubernetes'i genişletmek, CRD ile yeni bir resource tipi tanımlayıp onu izleyen bir controller'ın desired state'i sürekli gerçeğe çevirmesi demek. Bookstore için bir Campaign CRD'si, CEL doğrulaması, ownerReferences ile garbage collection, .NET ve KubernetesClient ile yazılmış bir controller, finalizer yüzünden Terminating'de takılan namespace'in güvenli çözümü ve finalizer'ı zorla silmenin bıraktığı sahipsiz kaynak gerçek çıktılarla.
kubectl ile Verimli Çalışmak: Output Format'ları, jsonpath, custom-columns, Selector'lar, patch, events, k9s ve Plugin'ler
kubectl'i verimli kullanmak, okurken custom-columns, jsonpath, selector ve events ile tam istediğin cevabı almak, değiştirirken de doğru patch türünü ve güvenlik kilitlerini seçmek demek. JSON patch'in index yüzünden yanlış değişkeni ezip pod'u çökertmesini, server-side apply çatışmasını, kubectl edit drift'ini, kuberc ile onaylı delete'i, krew, k9s ve stern'i gerçek çıktılarla görüyoruz.
Pod'lar Nereye Yerleşir? nodeSelector, Affinity/Anti-Affinity, Taint/Toleration, Topology Spread ve PriorityClass
Pod'un hangi node'a gideceğini kube-scheduler filter ve score adımlarıyla seçer; zorunlu kurallar pod'u Pending bırakabilir, tercihler hiçbir şeyi garanti etmez. Zorunlu anti-affinity'nin rollout'u kilitlemesini, zone spread'in cordon'da takılmasını ve nodeTaintsPolicy: Honor ile çözülmesini, taint'li worker pool'unu, PriorityClass ile preemption'ı ve "0/3 nodes are available" mesajını gerçek çıktılarla okuyoruz.
SSH Derinlemesine: ~/.ssh/config, ProxyJump ile Bastion, Port Forwarding ile Uzak Veritabanına Bağlanmak ve Agent Forwarding Riski
Bastion üzerinden private sunuculara ssh -A ile değil ProxyJump ile geç: agent forwarding açıkken bastion'da root olan biri senin key'inle veritabanı sunucusuna girebiliyor ve ControlPersist bu pencereyi dakikalarca açık tutuyor. ~/.ssh/config'in ilk-değer-kazanır kuralını, Match ve ControlMaster'ı, -L/-R/-D ile tünelleri, bastion'ı AllowTcpForwarding ve PermitOpen ile daraltmayı, FIDO2 key'leri ve SSH certificate'larını gerçek çıktılarla anlatıyoruz.
Dosya Bulmak, Arşivlemek ve Taşımak: find, xargs, tar, gzip/zstd, zip, rsync, diff ve Checksum
find -mtime +7 sanıldığı gibi 7 günden eski dosyaları değil en az 8 günlükleri bulur; silmeden önce -print ile listeyi oku, -delete'i en sona yaz ve xargs'a dosya adlarını -print0 | xargs -0 ile ver. Bookstore'un release paketini tar --zstd ile hazırlamayı, gzip/xz/zstd farkını, rsync'te sondaki / ile --delete tuzağını ve paketi sha256sum, cmp ve diff ile doğrulamayı gerçek çıktılarla anlatıyoruz.
Sunucuda Dosya Düzenlemek: vim'in Temel Komutları, nano, sudoedit ve Config Dosyasını Güvenle Değiştirmek
Sunucuda config dosyasını sudo vim ile değil sudoedit ile düzenle, önce yedek al, diff -u ile farkı oku, nginx -t ya da sshd -t ile test et ve restart yerine reload kullan; hatalı config'le reload siteyi korur, restart kapatır. vim'in mode'larını ve temel komutlarını, nano'yu, sudo altında editörün neden nano'ya döndüğünü, CRLF ve .swp tuzaklarını ve /etc'yi etckeeper ile Git'te izlemeyi gerçek çıktılarla anlatıyoruz.
GitHub CLI ile Terminalden GitHub: gh pr, gh issue, gh run, gh api ve Extension'lar
GitHub CLI (gh) bir Git aracı değil, GitHub API'sine konuşan bir istemci; doğru scope'lu bir token'la pull request, issue, CI run'ları ve release'ler terminalden yönetilir. gh pr, gh issue, gh run, gh api, alias ve extension'ları, Bookstore'da PR'dan auto-merge'e iki satırlık akışı ve GH_HOST ile scope tuzaklarını anlatıyoruz.
Geçmişte Arama: git grep, git log -S/-G/-L, blame -w -C, ignoreRevsFile ve "Bu Satır Ne Zaman, Neden Değişti?"
Bir satırı kimin, ne zaman, neden değiştirdiğini bulmak için blame'in ilk cevabı yetmez: git log -S metnin ortaya çıktığı commit'i, -G o satırların her değişimini, -L tek bir method'un geçmişini verir. Bookstore'daki kurumsal indirim hatasını git grep, pickaxe, blame -w -C ve .git-blame-ignore-revs ile Git 2.56'da izliyoruz.