{"id":32473,"date":"2025-10-22T06:41:01","date_gmt":"2025-10-22T03:41:01","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=32473"},"modified":"2025-10-22T06:41:01","modified_gmt":"2025-10-22T03:41:01","slug":"digitalocean-kubernetes-uzerine-dayanikli-bir-go-uygulamasi-dagitimi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetes-uzerine-dayanikli-bir-go-uygulamasi-dagitimi\/","title":{"rendered":"DigitalOcean Kubernetes \u00dczerine Dayan\u0131kl\u0131 Bir Go Uygulamas\u0131 Da\u011f\u0131t\u0131m\u0131"},"content":{"rendered":"<p><body><\/p>\n<h2>DigitalOcean Kubernetes \u00dczerine Dayan\u0131kl\u0131 Bir Go Uygulamas\u0131 Da\u011f\u0131t\u0131m\u0131<\/h2>\n<h2>Giri\u015f<\/h2>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn rekabet\u00e7i dijital d\u00fcnyas\u0131nda, uygulamalar\u0131n kesintisiz \u00e7al\u0131\u015fmas\u0131 ve de\u011fi\u015fen y\u00fcklere h\u0131zla adapte olabilmesi kritik \u00f6neme sahiptir. Kullan\u0131c\u0131 beklentileri her zamankinden daha y\u00fcksek ve en ufak bir kesinti bile m\u00fc\u015fteri kayb\u0131na veya itibar zedelenmesine yol a\u00e7abilir. Bu ba\u011flamda, &#8220;dayan\u0131kl\u0131l\u0131k&#8221; (resilience) kavram\u0131, uygulamalar\u0131n hatalara, ar\u0131zalara ve beklenmedik durumlara kar\u015f\u0131 koyabilme, kendini toparlayabilme ve servis vermeye devam edebilme yetene\u011fini ifade eder. Go (Golang), y\u00fcksek performans, e\u015fzamanl\u0131l\u0131k yetenekleri ve basitli\u011fi ile modern mikroservis mimarileri i\u00e7in pop\u00fcler bir dil haline gelmi\u015ftir. Kubernetes ise, konteynerli uygulamalar\u0131n da\u011f\u0131t\u0131m\u0131n\u0131, \u00f6l\u00e7eklendirmesini ve y\u00f6netimini otomatikle\u015ftiren end\u00fcstri standard\u0131 bir platformdur. DigitalOcean Kubernetes (DOKS), bu g\u00fc\u00e7l\u00fc teknolojileri kolayca eri\u015filebilir ve y\u00f6netilebilir bir bulut ortam\u0131nda sunarak geli\u015ftiricilerin altyap\u0131 karma\u015fas\u0131 yerine uygulama geli\u015ftirmeye odaklanmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Bu makalede, dayan\u0131kl\u0131 bir Go uygulamas\u0131n\u0131n nas\u0131l tasarlanaca\u011f\u0131, konteynerle\u015ftirilece\u011fi ve DigitalOcean Kubernetes (DOKS) \u00fczerinde y\u00fcksek eri\u015filebilirlik ve \u00f6l\u00e7eklenebilirlik \u00f6zellikleriyle nas\u0131l da\u011f\u0131t\u0131laca\u011f\u0131 detayl\u0131 bir \u015fekilde ele al\u0131nacakt\u0131r. Go uygulamas\u0131n\u0131n i\u00e7sel dayan\u0131kl\u0131l\u0131\u011f\u0131ndan Kubernetes&#8217;in d\u0131\u015fsal dayan\u0131kl\u0131l\u0131k mekanizmalar\u0131na kadar t\u00fcm s\u00fcre\u00e7leri ad\u0131m ad\u0131m inceleyerek, \u00fcretim ortam\u0131na haz\u0131r, sa\u011flam bir mimari in\u015fa etmeyi hedefliyoruz.<\/p>\n<h2>Go Uygulamas\u0131n\u0131n Temelleri: Dayan\u0131kl\u0131l\u0131k Odakl\u0131 Tasar\u0131m<\/h2>\n<p>Dayan\u0131kl\u0131l\u0131k, uygulaman\u0131n en temel katman\u0131ndan itibaren d\u00fc\u015f\u00fcn\u00fclmesi gereken bir prensiptir. Go dili, e\u015fzamanl\u0131l\u0131k ve hata y\u00f6netimi konusunda g\u00fc\u00e7l\u00fc yerle\u015fik mekanizmalar sunar. Uygulaman\u0131z\u0131 tasarlarken a\u015fa\u011f\u0131daki ilkeleri g\u00f6z \u00f6n\u00fcnde bulundurmak, daha resilient bir yap\u0131 kurman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h3>Dayan\u0131kl\u0131 Go Uygulamas\u0131 Mimarisi<\/h3>\n<p>Bir Go uygulamas\u0131n\u0131n dayan\u0131kl\u0131 olmas\u0131 i\u00e7in sadece iyi kod yazmak yeterli de\u011fildir; ayn\u0131 zamanda hatalar\u0131 \u00f6ng\u00f6rebilen, izleyebilen ve onlara tepki verebilen bir mimariye sahip olmas\u0131 gerekir.<\/p>\n<h4>Hata Y\u00f6netimi (Error Handling)<\/h4>\n<p>Go&#8217;da hata y\u00f6netimi, genellikle fonksiyonlardan <code>error<\/code> tipinde bir d\u00f6n\u00fc\u015f de\u011feri d\u00f6nd\u00fcrmekle yap\u0131l\u0131r. Ancak basit <code>if err != nil<\/code> kontrolleri, hatan\u0131n k\u00f6k nedenini anlamak i\u00e7in yeterli olmayabilir.<br \/>\n*   <strong>Hata Sarmalama (Error Wrapping):<\/strong> <code>fmt.Errorf(\"...: %w\", err)<\/code> veya <code>pkg\/errors<\/code> gibi k\u00fct\u00fcphaneler kullanarak hatalar\u0131 sarmalamak, hata \u00e7a\u011fr\u0131 y\u0131\u011f\u0131n\u0131n\u0131 (stack trace) koruyarak hatan\u0131n nerede olu\u015ftu\u011funu ve hangi kod yolu \u00fczerinden geldi\u011fini anlamay\u0131 kolayla\u015ft\u0131r\u0131r. Bu, \u00f6zellikle mikroservis ortamlar\u0131nda hatalar\u0131n izlenmesi i\u00e7in hayati \u00f6neme sahiptir.<br \/>\n*   <strong>Graceful Shutdown:<\/strong> Uygulaman\u0131n aniden kapanmas\u0131 yerine, gelen istekleri i\u015flemeyi durdurup mevcut istekleri tamamlamas\u0131na izin veren bir mekanizma (\u00f6rne\u011fin, <code>context.WithTimeout<\/code> kullanarak HTTP sunucusunu kapatmak) dayan\u0131kl\u0131l\u0131k i\u00e7in \u00f6nemlidir. Bu, veri kayb\u0131n\u0131 \u00f6nler ve kesintisiz bir kullan\u0131c\u0131 deneyimi sa\u011flar.<br \/>\n*   <strong>Panic\/Recover Kullan\u0131m\u0131:<\/strong> <code>panic<\/code> ve <code>recover<\/code> mekanizmalar\u0131, Go&#8217;da beklenmedik durumlar\u0131 y\u00f6netmek i\u00e7in kullan\u0131l\u0131r. Ancak <code>panic<\/code> genellikle program\u0131n durmas\u0131na neden oldu\u011fundan, sadece ger\u00e7ekten kurtar\u0131lamaz hatalar veya programc\u0131 hatalar\u0131 i\u00e7in kullan\u0131lmal\u0131 ve <code>recover<\/code> ile dikkatli bir \u015fekilde ele al\u0131nmal\u0131d\u0131r. Bir goroutine i\u00e7inde olu\u015fan <code>panic<\/code>&#8216;in sadece o goroutine&#8217;i etkilemesini sa\u011flamak i\u00e7in <code>defer<\/code> ile <code>recover<\/code> kullanmak yayg\u0131n bir desendir.<\/p>\n<h4>Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu (Dependency Injection)<\/h4>\n<p>Ba\u011f\u0131ml\u0131l\u0131k enjeksiyonu (DI), bile\u015fenler aras\u0131ndaki s\u0131k\u0131 ba\u011f\u0131ml\u0131l\u0131klar\u0131 azaltarak kodun daha mod\u00fcler, test edilebilir ve esnek olmas\u0131n\u0131 sa\u011flar. Bu, hata durumlar\u0131nda bile\u015fenlerin daha kolay de\u011fi\u015ftirilmesine veya alay (mock) edilmesine olanak tan\u0131r. <code>wire<\/code>, <code>fx<\/code> gibi k\u00fct\u00fcphaneler veya manuel DI Go&#8217;da kullan\u0131labilir.<\/p>\n<h4>Yap\u0131land\u0131rma Y\u00f6netimi (Configuration Management)<\/h4>\n<p>Uygulama yap\u0131land\u0131rmas\u0131n\u0131n (veritaban\u0131 ba\u011flant\u0131 dizeleri, API anahtarlar\u0131 vb.) \u00e7evre de\u011fi\u015fkenleri, yap\u0131land\u0131rma dosyalar\u0131 veya bir yap\u0131land\u0131rma servisi (\u00f6rne\u011fin, HashiCorp Vault) arac\u0131l\u0131\u011f\u0131yla y\u00f6netilmesi \u00f6nemlidir. <code>viper<\/code> gibi k\u00fct\u00fcphaneler, farkl\u0131 kaynaklardan yap\u0131land\u0131rma okuma yetene\u011fi sunar. Yap\u0131land\u0131rman\u0131n harici olmas\u0131, ayn\u0131 uygulaman\u0131n farkl\u0131 ortamlarda (geli\u015ftirme, test, \u00fcretim) farkl\u0131 ayarlarla \u00e7al\u0131\u015fabilmesini sa\u011flar ve dayan\u0131kl\u0131l\u0131\u011f\u0131 art\u0131r\u0131r.<\/p>\n<h4>Loglama (Logging)<\/h4>\n<p>Uygulaman\u0131n davran\u0131\u015f\u0131n\u0131 ve hata durumlar\u0131n\u0131 anlamak i\u00e7in etkili loglama \u015fartt\u0131r.<br \/>\n*   <strong>Yap\u0131land\u0131r\u0131lm\u0131\u015f Loglama:<\/strong> <code>zap<\/code> veya <code>logrus<\/code> gibi k\u00fct\u00fcphaneler kullanarak JSON format\u0131nda yap\u0131land\u0131r\u0131lm\u0131\u015f loglar olu\u015fturmak, loglar\u0131n merkezi bir log y\u00f6netim sisteminde (ELK Stack, Loki) kolayca analiz edilmesini ve filtrelenmesini sa\u011flar. Log seviyeleri (DEBUG, INFO, WARN, ERROR, FATAL) do\u011fru kullan\u0131lmal\u0131d\u0131r.<br \/>\n*   <strong>Korelasyon ID&#8217;leri:<\/strong> Her istek i\u00e7in benzersiz bir korelasyon ID&#8217;si (trace ID) olu\u015fturmak ve bunu t\u00fcm log girdilerine eklemek, da\u011f\u0131t\u0131lm\u0131\u015f sistemlerde bir iste\u011fin ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc izlemeyi kolayla\u015ft\u0131r\u0131r.<\/p>\n<h4>Metrikler ve \u0130zleme (Metrics &#038; Tracing)<\/h4>\n<p>Uygulaman\u0131n performans\u0131n\u0131 ve sa\u011fl\u0131\u011f\u0131n\u0131 s\u00fcrekli izlemek, sorunlar\u0131 proaktif olarak tespit etmek i\u00e7in hayati \u00f6neme sahiptir.<br \/>\n*   <strong>Metrikler:<\/strong> Prometheus client k\u00fct\u00fcphanesini kullanarak CPU, bellek kullan\u0131m\u0131, istek say\u0131s\u0131, hata oranlar\u0131 gibi uygulama metriklerini toplamak. Bu metrikler daha sonra Prometheus taraf\u0131ndan \u00e7ekilip Grafana gibi ara\u00e7larla g\u00f6rselle\u015ftirilebilir.<br \/>\n*   <strong>Da\u011f\u0131t\u0131lm\u0131\u015f \u0130zleme (Distributed Tracing):<\/strong> OpenTelemetry gibi ara\u00e7larla da\u011f\u0131t\u0131lm\u0131\u015f sistemlerde isteklerin farkl\u0131 servisler aras\u0131ndaki yolculu\u011funu izlemek, gecikme ve hata kaynaklar\u0131n\u0131 belirlemeye yard\u0131mc\u0131 olur.<\/p>\n<h4>Sa\u011fl\u0131k Kontrolleri (Health Checks)<\/h4>\n<p>Uygulaman\u0131z\u0131n canl\u0131l\u0131\u011f\u0131n\u0131 ve haz\u0131r olma durumunu bildiren HTTP endpointleri olu\u015fturmak, Kubernetes&#8217;in uygulaman\u0131z\u0131 do\u011fru \u015fekilde y\u00f6netmesi i\u00e7in kritik \u00f6neme sahiptir.<br \/>\n*   <code>\/healthz<\/code> (Liveness Probe): Uygulaman\u0131n \u00e7al\u0131\u015f\u0131r durumda olup olmad\u0131\u011f\u0131n\u0131, yani tamamen \u00e7\u00f6k\u00fcp \u00e7\u00f6kmedi\u011fini kontrol eder. Ba\u015far\u0131s\u0131z olursa Kubernetes pod&#8217;u yeniden ba\u015flat\u0131r.<br \/>\n*   <code>\/readyz<\/code> (Readiness Probe): Uygulaman\u0131n istekleri i\u015flemeye haz\u0131r olup olmad\u0131\u011f\u0131n\u0131 kontrol eder (\u00f6rne\u011fin, veritaban\u0131 ba\u011flant\u0131s\u0131 kuruldu mu, ba\u011f\u0131ml\u0131 servisler eri\u015filebilir mi?). Ba\u015far\u0131s\u0131z olursa Kubernetes trafi\u011fi bu pod&#8217;a y\u00f6nlendirmez.<\/p>\n<h4>Devre Kesici (Circuit Breaker) Deseni<\/h4>\n<p>Ba\u011f\u0131ml\u0131 bir servisin yava\u015flamas\u0131 veya tamamen eri\u015filemez hale gelmesi durumunda, uygulaman\u0131z\u0131n o servise s\u00fcrekli istek g\u00f6ndermesini engelleyen bir mekanizmad\u0131r. Bu, \u00e7a\u011fr\u0131 yapan servisin de kaynaklar\u0131n\u0131n t\u00fckenmesini \u00f6nler. <code>go-kit\/circuitbreaker<\/code> gibi k\u00fct\u00fcphaneler bu deseni uygulamak i\u00e7in kullan\u0131labilir.<\/p>\n<h4>Tekrar Deneme (Retry) Mekanizmalar\u0131<\/h4>\n<p>Ge\u00e7ici a\u011f sorunlar\u0131 veya servis kesintileri gibi durumlarda, ba\u015far\u0131s\u0131z olan i\u015flemleri belirli bir gecikme ve s\u0131n\u0131rl\u0131 say\u0131da tekrar denemek, dayan\u0131kl\u0131l\u0131\u011f\u0131 art\u0131r\u0131r. \u00dcstel geri \u00e7ekilme (exponential backoff) stratejisi genellikle tercih edilir.<\/p>\n<h2>Kapsay\u0131c\u0131la\u015ft\u0131rma (Containerization)<\/h2>\n<p>Go uygulaman\u0131z\u0131 Kubernetes&#8217;e da\u011f\u0131tmadan \u00f6nce, onu bir Docker konteyneri i\u00e7ine paketlemeniz gerekir. Bu, uygulaman\u0131n t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131yla birlikte izole bir ortamda \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Dockerfile Olu\u015fturma<\/h3>\n<p>Dockerfile, uygulaman\u0131z\u0131n Docker imaj\u0131n\u0131n nas\u0131l olu\u015fturulaca\u011f\u0131n\u0131 tan\u0131mlayan bir metin dosyas\u0131d\u0131r. Dayan\u0131kl\u0131 ve verimli bir imaj i\u00e7in a\u015fa\u011f\u0131daki noktalar \u00f6nemlidir:<\/p>\n<p>*   <strong>\u00c7ok A\u015famal\u0131 Yap\u0131land\u0131rma (Multi-stage Builds):<\/strong> Bu \u00f6zellik, derleme zaman\u0131 ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 (\u00f6rne\u011fin, Go derleyicisi) nihai imajdan ay\u0131rarak daha k\u00fc\u00e7\u00fck ve g\u00fcvenli imajlar olu\u015fturman\u0131z\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-dockerfile\"># A\u015fama 1: Uygulamay\u0131 Derle\nFROM golang:1.21-alpine AS builder\nWORKDIR \/app\nCOPY go.mod go.sum .\/\nRUN go mod download\nCOPY . .\nRUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .\n\n<h2>A\u015fama 2: \u00c7al\u0131\u015ft\u0131r\u0131labilir \u0130maj\u0131 Olu\u015ftur<\/h2>\nFROM alpine:latest\nWORKDIR \/root\/\nCOPY --from=builder \/app\/main .\nEXPOSE 8080\nCMD [\".\/main\"]<\/code><\/pre>\n<p>*   <strong>Temel \u0130maj Se\u00e7imi:<\/strong> <code>alpine<\/code> gibi minimal Linux da\u011f\u0131t\u0131mlar\u0131 veya <code>distroless<\/code> gibi sadece uygulaman\u0131z\u0131n ve temel \u00e7al\u0131\u015fma zaman\u0131 ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131n bulundu\u011fu imajlar, imaj boyutunu k\u00fc\u00e7\u00fclt\u00fcr ve g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 azalt\u0131r.<br \/>\n*   <strong>Ba\u011f\u0131ml\u0131l\u0131k Y\u00f6netimi:<\/strong> <code>go mod download<\/code> komutunu <code>COPY<\/code> i\u015fleminden \u00f6nce \u00e7al\u0131\u015ft\u0131rarak, mod\u00fcllerin \u00f6nbelle\u011fe al\u0131nmas\u0131n\u0131 ve kod de\u011fi\u015fikliklerinde tekrar indirilmemesini sa\u011flayabilirsiniz.<br \/>\n*   <strong><code>EXPOSE<\/code>:<\/strong> Uygulaman\u0131z\u0131n hangi porttan hizmet verdi\u011fini belirtir.<br \/>\n*   <strong><code>CMD<\/code> ve <code>ENTRYPOINT<\/code>:<\/strong> Konteyner ba\u015flad\u0131\u011f\u0131nda hangi komutun \u00e7al\u0131\u015faca\u011f\u0131n\u0131 belirler. <code>CMD<\/code> genellikle uygulaman\u0131z\u0131 \u00e7al\u0131\u015ft\u0131r\u0131r, <code>ENTRYPOINT<\/code> ise bir y\u00fcr\u00fct\u00fclebilir dosya olarak davranabilir.<\/p>\n<h3>Docker Image Olu\u015fturma ve DigitalOcean Container Registry&#8217;ye G\u00f6nderme<\/h3>\n<p>Dockerfile&#8217;\u0131n\u0131z\u0131 olu\u015fturduktan sonra, Docker imaj\u0131n\u0131 olu\u015fturman\u0131z ve DigitalOcean Container Registry&#8217;ye (DOCR) g\u00f6ndermeniz gerekir.<\/p>\n<p>1.  <strong>Docker \u0130maj\u0131n\u0131 Olu\u015fturma:<\/strong><\/p>\n<pre><code class=\"language-bash\">docker build -t my-go-app:latest .<\/code><\/pre>\n<p>    Burada <code>my-go-app<\/code> uygulaman\u0131z\u0131n ad\u0131d\u0131r.<\/p>\n<p>2.  <strong>DigitalOcean Container Registry&#8217;ye Kimlik Do\u011frulama:<\/strong><br \/>\n    \u00d6ncelikle <code>doctl<\/code> komut sat\u0131r\u0131 arac\u0131n\u0131 kurman\u0131z ve DigitalOcean hesab\u0131n\u0131za ba\u011flaman\u0131z gerekir.<\/p>\n<pre><code class=\"language-bash\">doctl auth init\n    doctl registry login<\/code><\/pre>\n<p>3.  <strong>\u0130maj\u0131 Etiketleme (Tagging):<\/strong><br \/>\n    DOCR&#8217;ye g\u00f6ndermeden \u00f6nce imaj\u0131n\u0131z\u0131 do\u011fru formatta etiketlemeniz gerekir. Registry ad\u0131 genellikle <code>registry.digitalocean.com\/your-registry-name<\/code> \u015feklindedir.<\/p>\n<pre><code class=\"language-bash\">docker tag my-go-app:latest registry.digitalocean.com\/my-registry\/my-go-app:latest<\/code><\/pre>\n<p>    Burada <code>my-registry<\/code> sizin DigitalOcean Container Registry&#8217;nizin ad\u0131d\u0131r.<\/p>\n<p>4.  <strong>\u0130maj\u0131 G\u00f6nderme (Pushing):<\/strong><\/p>\n<pre><code class=\"language-bash\">docker push registry.digitalocean.com\/my-registry\/my-go-app:latest<\/code><\/pre>\n<p>    Bu ad\u0131mlarla Go uygulaman\u0131z\u0131n konteyner imaj\u0131 DigitalOcean Container Registry&#8217;de haz\u0131r olacakt\u0131r.<\/p>\n<h2>DigitalOcean Kubernetes (DOKS) Kurulumu<\/h2>\n<p>Uygulaman\u0131z konteynerle\u015ftirildi\u011fine g\u00f6re, onu \u00e7al\u0131\u015ft\u0131racak Kubernetes k\u00fcmesini DigitalOcean \u00fczerinde kurabiliriz.<\/p>\n<h3>DOKS K\u00fcmesi Olu\u015fturma<\/h3>\n<p>DOKS k\u00fcmesini DigitalOcean kontrol panelinden veya <code>doctl<\/code> komut sat\u0131r\u0131 arac\u0131yla olu\u015fturabilirsiniz.<\/p>\n<p><strong><code>doctl<\/code> ile K\u00fcme Olu\u015fturma \u00d6rne\u011fi:<\/strong><\/p>\n<pre><code class=\"language-bash\">doctl kubernetes cluster create my-go-cluster \\\n  --region nyc1 \\\n  --version 1.27.5-do.0 \\\n  --node-pool name=worker-pool,size=s-2vcpu-4gb,count=3<\/code><\/pre>\n<p>*   <code>--region<\/code>: K\u00fcmenizin fiziksel olarak bulunaca\u011f\u0131 b\u00f6lge (\u00f6rne\u011fin, <code>nyc1<\/code>, <code>fra1<\/code>).<br \/>\n*   <code>--version<\/code>: Kubernetes s\u00fcr\u00fcm\u00fc.<br \/>\n*   <code>--node-pool<\/code>: K\u00fcmenizin d\u00fc\u011f\u00fcm havuzlar\u0131n\u0131 tan\u0131mlar. \u00dcretim ortamlar\u0131 i\u00e7in en az 3 d\u00fc\u011f\u00fcml\u00fc bir havuz ve yeterli kaynaklara sahip d\u00fc\u011f\u00fcm boyutlar\u0131 (\u00f6rne\u011fin, <code>s-2vcpu-4gb<\/code>) se\u00e7mek y\u00fcksek eri\u015filebilirlik i\u00e7in \u00f6nemlidir. Farkl\u0131 i\u015f y\u00fckleri i\u00e7in farkl\u0131 d\u00fc\u011f\u00fcm havuzlar\u0131 da tan\u0131mlanabilir.<\/p>\n<h3><code>kubectl<\/code> ve <code>doctl<\/code> Yap\u0131land\u0131rmas\u0131<\/h3>\n<p>K\u00fcmeniz olu\u015fturulduktan sonra, <code>kubectl<\/code> komut sat\u0131r\u0131 arac\u0131n\u0131 kullanarak k\u00fcmenizle etkile\u015fim kurman\u0131z gerekir.<\/p>\n<p>1.  <strong><code>kubeconfig<\/code> Dosyas\u0131n\u0131 \u0130ndirme:<\/strong><br \/>\n    <code>doctl<\/code> arac\u0131l\u0131\u011f\u0131yla k\u00fcmenizin yap\u0131land\u0131rma dosyas\u0131n\u0131 (kubeconfig) yerel makinenize indirebilirsiniz.<\/p>\n<pre><code class=\"language-bash\">doctl kubernetes cluster kubeconfig save my-go-cluster<\/code><\/pre>\n<p>    Bu komut, <code>~\/.kube\/config<\/code> dosyan\u0131za k\u00fcme bilgilerinizi ekler veya g\u00fcnceller.<\/p>\n<p>2.  <strong><code>kubectl<\/code> Ba\u011flant\u0131s\u0131n\u0131 Test Etme:<\/strong><\/p>\n<pre><code class=\"language-bash\">kubectl get nodes<\/code><\/pre>\n<p>    Bu komut, k\u00fcmenizdeki d\u00fc\u011f\u00fcmleri listelemelidir.<\/p>\n<h2>Kubernetes Da\u011f\u0131t\u0131m\u0131 (Deployment)<\/h2>\n<p>Kubernetes manifest dosyalar\u0131, uygulaman\u0131z\u0131n k\u00fcmede nas\u0131l \u00e7al\u0131\u015faca\u011f\u0131n\u0131 tan\u0131mlar. Dayan\u0131kl\u0131 bir da\u011f\u0131t\u0131m i\u00e7in Kubernetes&#8217;in sundu\u011fu \u00f6zellikleri etkin bir \u015fekilde kullanmak gerekir.<\/p>\n<h3>Kubernetes Manifest Dosyalar\u0131<\/h3>\n<p>Uygulaman\u0131z i\u00e7in en az\u0131ndan bir <code>Deployment<\/code> ve bir <code>Service<\/code> objesine ihtiyac\u0131n\u0131z olacakt\u0131r.<\/p>\n<p>*   <strong><code>Deployment<\/code> Objesi:<\/strong> Uygulaman\u0131z\u0131n pod&#8217;lar\u0131n\u0131 y\u00f6netir. Ka\u00e7 kopya (replica) \u00e7al\u0131\u015faca\u011f\u0131n\u0131, hangi imaj\u0131 kullanaca\u011f\u0131n\u0131 ve g\u00fcncelleme stratejilerini tan\u0131mlar.<\/p>\n<pre><code class=\"language-yaml\">apiVersion: apps\/v1\n    kind: Deployment\n    metadata:\n      name: go-app-deployment\n      labels:\n        app: go-app\n    spec:\n      replicas: 3 # En az 3 kopya ile y\u00fcksek eri\u015filebilirlik sa\u011flan\u0131r\n      selector:\n        matchLabels:\n          app: go-app\n      strategy:\n        type: RollingUpdate # Kesintisiz g\u00fcncellemeler i\u00e7in RollingUpdate\n        rollingUpdate:\n          maxSurge: 1 # Yeni podlar i\u00e7in ek kaynak\n          maxUnavailable: 0 # G\u00fcncelleme s\u0131ras\u0131nda hi\u00e7bir podun kullan\u0131lamaz olmamas\u0131n\u0131 sa\u011flar\n      template:\n        metadata:\n          labels:\n            app: go-app\n        spec:\n          containers:\n          - name: go-app\n            image: registry.digitalocean.com\/my-registry\/my-go-app:latest\n            ports:\n            - containerPort: 8080\n            env: # \u00c7evre de\u011fi\u015fkenleri ile yap\u0131land\u0131rma\n            - name: APP_ENV\n              value: production\n            resources: # Kaynak limitleri ve istekleri\n              requests:\n                memory: \"64Mi\"\n                cpu: \"100m\"\n              limits:\n                memory: \"128Mi\"\n                cpu: \"200m\"\n            livenessProbe: # Uygulaman\u0131n canl\u0131l\u0131k kontrol\u00fc\n              httpGet:\n                path: \/healthz\n                port: 8080\n              initialDelaySeconds: 5\n              periodSeconds: 5\n            readinessProbe: # Uygulaman\u0131n haz\u0131r olma kontrol\u00fc\n              httpGet:\n                path: \/readyz\n                port: 8080\n              initialDelaySeconds: 10\n              periodSeconds: 10<\/code><\/pre>\n<p>*   <strong><code>Service<\/code> Objesi:<\/strong> Pod&#8217;lar\u0131n\u0131za a\u011f eri\u015fimi sa\u011flar. <code>LoadBalancer<\/code> tipi, DigitalOcean \u00fczerinde otomatik olarak bir Load Balancer provision eder ve internetten uygulaman\u0131za eri\u015fim sa\u011flar.<\/p>\n<pre><code class=\"language-yaml\">apiVersion: v1\n    kind: Service\n    metadata:\n      name: go-app-service\n    spec:\n      selector:\n        app: go-app\n      type: LoadBalancer # D\u0131\u015far\u0131dan eri\u015fim i\u00e7in LoadBalancer\n      ports:\n        - protocol: TCP\n          port: 80 # D\u0131\u015far\u0131dan gelen port\n          targetPort: 8080 # Konteynerin dinledi\u011fi port<\/code><\/pre>\n<p>*   <strong><code>Ingress<\/code> Objesi (Opsiyonel):<\/strong> Birden fazla servisi tek bir IP adresi \u00fczerinden y\u00f6netmek, TLS sonland\u0131rmas\u0131 yapmak veya geli\u015fmi\u015f y\u00f6nlendirme kurallar\u0131 tan\u0131mlamak i\u00e7in kullan\u0131l\u0131r. DOKS \u00fczerinde NGINX Ingress Controller gibi bir \u00e7\u00f6z\u00fcmle birlikte kullan\u0131labilir.<\/p>\n<p>*   <strong><code>ConfigMap<\/code> ve <code>Secret<\/code> Objeleri:<\/strong> Uygulaman\u0131z\u0131n yap\u0131land\u0131rma verilerini (veritaban\u0131 ba\u011flant\u0131 dizeleri, API anahtarlar\u0131 vb.) pod&#8217;lar\u0131n\u0131zdan ayr\u0131 tutmak i\u00e7in kullan\u0131l\u0131r. <code>ConfigMap<\/code> hassas olmayan veriler i\u00e7in, <code>Secret<\/code> ise hassas veriler i\u00e7in kullan\u0131l\u0131r. <code>Secret<\/code>&#8216;lar varsay\u0131lan olarak Base64 ile kodlan\u0131r, ancak daha iyi g\u00fcvenlik i\u00e7in External Secrets gibi \u00e7\u00f6z\u00fcmlerle harici bir s\u0131r y\u00f6neticisi (\u00f6rne\u011fin, HashiCorp Vault, DigitalOcean Secrets) entegre edilebilir.<\/p>\n<h3>Dayan\u0131kl\u0131l\u0131k i\u00e7in Kubernetes \u00d6zellikleri<\/h3>\n<p>Kubernetes, da\u011f\u0131t\u0131m\u0131n\u0131z\u0131n dayan\u0131kl\u0131l\u0131\u011f\u0131n\u0131 art\u0131rmak i\u00e7in bir dizi yerle\u015fik \u00f6zellik sunar.<\/p>\n<h4>Liveness ve Readiness Problar\u0131<\/h4>\n<p>Yukar\u0131daki <code>Deployment<\/code> manifestinde g\u00f6sterildi\u011fi gibi, <code>livenessProbe<\/code> ve <code>readinessProbe<\/code> uygulaman\u0131z\u0131n sa\u011fl\u0131k endpoint&#8217;lerini kullanarak Kubernetes&#8217;in pod&#8217;lar\u0131n\u0131z\u0131 do\u011fru \u015fekilde y\u00f6netmesini sa\u011flar.<br \/>\n*   <strong>Liveness Probe:<\/strong> Bir pod&#8217;un canl\u0131l\u0131\u011f\u0131n\u0131 kontrol eder. Ba\u015far\u0131s\u0131z olursa, Kubernetes pod&#8217;u yeniden ba\u015flat\u0131r. Bu, uygulaman\u0131z\u0131n tak\u0131l\u0131 kalmas\u0131 veya kaynak s\u0131z\u0131nt\u0131s\u0131 gibi durumlarda kendini toparlamas\u0131na yard\u0131mc\u0131 olur.<br \/>\n*   <strong>Readiness Probe:<\/strong> Bir pod&#8217;un gelen trafi\u011fi i\u015flemeye haz\u0131r olup olmad\u0131\u011f\u0131n\u0131 kontrol eder. Ba\u015far\u0131s\u0131z olursa, Kubernetes bu pod&#8217;a trafik g\u00f6ndermeyi durdurur. Bu, uygulaman\u0131z\u0131n ba\u015flatma a\u015famas\u0131nda veya ba\u011f\u0131ml\u0131 bir servis kesintiye u\u011frad\u0131\u011f\u0131nda hatal\u0131 istekleri almas\u0131n\u0131 engeller.<\/p>\n<h4>Kaynak Limitleri ve \u0130stekleri (Resource Limits and Requests)<\/h4>\n<p>Her konteyner i\u00e7in CPU ve bellek <code>requests<\/code> (istekler) ve <code>limits<\/code> (limitler) tan\u0131mlamak, k\u00fcmenizin kaynaklar\u0131n\u0131 verimli bir \u015fekilde kullanmas\u0131n\u0131 ve pod&#8217;lar\u0131n\u0131z\u0131n birbirlerinin kaynaklar\u0131n\u0131 t\u00fcketmesini engeller.<br \/>\n*   <code>requests<\/code>: Kubernetes&#8217;in pod&#8217;a tahsis etmeye \u00e7al\u0131\u015faca\u011f\u0131 minimum kaynak miktar\u0131d\u0131r.<br \/>\n*   <code>limits<\/code>: Bir pod&#8217;un kullanabilece\u011fi maksimum kaynak miktar\u0131d\u0131r. Bu limitler a\u015f\u0131ld\u0131\u011f\u0131nda pod sonland\u0131r\u0131labilir (OOMKilled).<\/p>\n<h4>Horizontal Pod Autoscaler (HPA)<\/h4>\n<p>HPA, CPU kullan\u0131m\u0131, bellek kullan\u0131m\u0131 veya \u00f6zel metrikler (\u00f6rne\u011fin, istek kuyru\u011fu uzunlu\u011fu) gibi g\u00f6zlemlenen metrik de\u011ferlerine g\u00f6re pod say\u0131s\u0131n\u0131 otomatik olarak art\u0131r\u0131r veya azalt\u0131r. Bu, uygulaman\u0131z\u0131n de\u011fi\u015fen y\u00fcklere dinamik olarak adapte olmas\u0131n\u0131 sa\u011flayarak performans\u0131 ve dayan\u0131kl\u0131l\u0131\u011f\u0131 art\u0131r\u0131r.<\/p>\n<pre><code class=\"language-yaml\">apiVersion: autoscaling\/v2\nkind: HorizontalPodAutoscaler\nmetadata:\n  name: go-app-hpa\nspec:\n  scaleTargetRef:\n    apiVersion: apps\/v1\n    kind: Deployment\n    name: go-app-deployment\n  minReplicas: 3\n  maxReplicas: 10\n  metrics:\n  - type: Resource\n    resource:\n      name: cpu\n      target:\n        type: Utilization\n        averageUtilization: 70 # CPU kullan\u0131m\u0131 %70'i a\u015farsa \u00f6l\u00e7ekle\n  - type: Resource\n    resource:\n      name: memory\n      target:\n        type: Utilization\n        averageUtilization: 80 # Bellek kullan\u0131m\u0131 %80'i a\u015farsa \u00f6l\u00e7ekle<\/code><\/pre>\n<h4>Pod Disruption Budget (PDB)<\/h4>\n<p>PDB, iste\u011fe ba\u011fl\u0131 kesintiler (\u00f6rne\u011fin, d\u00fc\u011f\u00fcm bak\u0131m\u0131 veya y\u00fckseltme) s\u0131ras\u0131nda bir uygulaman\u0131n ka\u00e7 tane pod&#8217;unun ayn\u0131 anda kullan\u0131lamaz olabilece\u011fini s\u0131n\u0131rlayarak uygulaman\u0131z\u0131n y\u00fcksek eri\u015filebilirli\u011fini korur.<\/p>\n<pre><code class=\"language-yaml\">apiVersion: policy\/v1\nkind: PodDisruptionBudget\nmetadata:\n  name: go-app-pdb\nspec:\n  minAvailable: 2 # Her zaman en az 2 pod'un \u00e7al\u0131\u015f\u0131r durumda olmas\u0131n\u0131 sa\u011flar\n  selector:\n    matchLabels:\n      app: go-app<\/code><\/pre>\n<h4>Anti-Affinity<\/h4>\n<p>Pod anti-affinity kurallar\u0131, Kubernetes&#8217;e belirli pod&#8217;lar\u0131 farkl\u0131 d\u00fc\u011f\u00fcmlere da\u011f\u0131tmas\u0131n\u0131 s\u00f6yler. Bu, bir d\u00fc\u011f\u00fcm\u00fcn ar\u0131zalanmas\u0131 durumunda uygulaman\u0131z\u0131n birden fazla kopyas\u0131n\u0131n etkilenmesini \u00f6nleyerek dayan\u0131kl\u0131l\u0131\u011f\u0131 art\u0131r\u0131r.<\/p>\n<pre><code class=\"language-yaml\"># Deployment manifestindeki spec.template.spec alt\u0131na eklenir\n      affinity:\n        podAntiAffinity:\n          requiredDuringSchedulingIgnoredDuringExecution:\n          - labelSelector:\n              matchLabels:\n                app: go-app\n            topologyKey: \"kubernetes.io\/hostname\" # Ayn\u0131 d\u00fc\u011f\u00fcmde birden fazla pod olmas\u0131n<\/code><\/pre>\n<h3>Da\u011f\u0131t\u0131m\u0131n Yap\u0131lmas\u0131<\/h3>\n<p>T\u00fcm manifest dosyalar\u0131n\u0131z\u0131 (\u00f6rne\u011fin, <code>deployment.yaml<\/code>, <code>service.yaml<\/code>, <code>hpa.yaml<\/code>, <code>pdb.yaml<\/code>) bir dizine kaydettikten sonra, a\u015fa\u011f\u0131daki komutla uygulaman\u0131z\u0131 k\u00fcmenize da\u011f\u0131tabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">kubectl apply -f .<\/code><\/pre>\n<p>Bu komut, dizindeki t\u00fcm YAML dosyalar\u0131n\u0131 okur ve Kubernetes k\u00fcmenize uygular.<\/p>\n<h2>\u0130zleme ve Loglama<\/h2>\n<p>Dayan\u0131kl\u0131 bir sistemin vazge\u00e7ilmez bir par\u00e7as\u0131, onun sa\u011fl\u0131\u011f\u0131n\u0131 ve performans\u0131n\u0131 s\u00fcrekli olarak izlemek ve olas\u0131 sorunlar\u0131 h\u0131zl\u0131ca tespit etmektir.<\/p>\n<h3>DigitalOcean Monitoring<\/h3>\n<p>DigitalOcean, DOKS k\u00fcmeleri i\u00e7in yerle\u015fik izleme yetenekleri sunar. K\u00fcme d\u00fczeyinde CPU, bellek, a\u011f kullan\u0131m\u0131 gibi metrikleri izleyebilir, uyar\u0131lar kurabilirsiniz. Bu, altyap\u0131 katman\u0131ndaki sorunlar\u0131 tespit etmek i\u00e7in iyi bir ba\u015flang\u0131\u00e7 noktas\u0131d\u0131r.<\/p>\n<h3>Prometheus ve Grafana<\/h3>\n<p>Go uygulaman\u0131zdan toplad\u0131\u011f\u0131n\u0131z metrikleri merkezi bir sistemde toplamak ve g\u00f6rselle\u015ftirmek i\u00e7in Prometheus ve Grafana standart \u00e7\u00f6z\u00fcmlerdir.<br \/>\n*   <strong>Kurulum:<\/strong> Helm ile Kubernetes k\u00fcmenize Prometheus ve Grafana&#8217;y\u0131 kolayca kurabilirsiniz.<br \/>\n*   <strong>Metrik Toplama:<\/strong> Prometheus, Go uygulaman\u0131z\u0131n <code>metrics<\/code> endpoint&#8217;inden metrikleri \u00e7ekecek \u015fekilde yap\u0131land\u0131r\u0131l\u0131r. Service Discovery \u00f6zellikleri sayesinde Kubernetes pod&#8217;lar\u0131n\u0131 otomatik olarak ke\u015ffedebilir.<br \/>\n*   <strong>G\u00f6rselle\u015ftirme:<\/strong> Grafana, Prometheus&#8217;tan ald\u0131\u011f\u0131 metrikleri kullanarak \u00f6zelle\u015ftirilebilir g\u00f6sterge tablolar\u0131 (dashboards) olu\u015fturman\u0131za olanak tan\u0131r. Uygulaman\u0131z\u0131n hata oranlar\u0131, gecikme s\u00fcreleri, kaynak kullan\u0131m\u0131 gibi kritik metrikleri buradan takip edebilirsiniz.<\/p>\n<h3>Log Y\u00f6netimi<\/h3>\n<p>Uygulama loglar\u0131n\u0131 merkezi bir yerde toplamak, sorun giderme ve hata ay\u0131klama s\u00fcre\u00e7lerini h\u0131zland\u0131r\u0131r.<br \/>\n*   <strong>ELK Stack (Elasticsearch, Logstash, Kibana):<\/strong> Kubernetes pod&#8217;lar\u0131ndan loglar\u0131 toplayan (\u00f6rne\u011fin, Fluentd veya Fluent Bit ile) ve Elasticsearch&#8217;te depolay\u0131p Kibana ile g\u00f6rselle\u015ftiren pop\u00fcler bir \u00e7\u00f6z\u00fcmd\u00fcr.<br \/>\n*   <strong>Loki ve Grafana:<\/strong> Prometheus&#8217;un loglama kar\u015f\u0131l\u0131\u011f\u0131 olan Loki, Go uygulaman\u0131z\u0131n yap\u0131land\u0131r\u0131lm\u0131\u015f loglar\u0131n\u0131 depolar ve Grafana ile sorgulanabilir ve g\u00f6rselle\u015ftirilebilir hale getirir. Bu, metrikler ve loglar i\u00e7in tek bir g\u00f6rselle\u015ftirme aray\u00fcz\u00fc sa\u011flar.<br \/>\n*   <strong>DigitalOcean Logs (Varsa):<\/strong> DigitalOcean&#8217;\u0131n kendi log toplama ve analiz hizmetleri varsa, DOKS ile entegre bir \u00e7\u00f6z\u00fcm sunabilir.<\/p>\n<h2>G\u00fcncellemeler ve Bak\u0131m<\/h2>\n<p>Uygulamalar s\u00fcrekli geli\u015fti\u011fi i\u00e7in, g\u00fcncellemelerin ve bak\u0131m\u0131n kesintisiz ve g\u00fcvenli bir \u015fekilde yap\u0131lmas\u0131 dayan\u0131kl\u0131l\u0131\u011f\u0131n bir par\u00e7as\u0131d\u0131r.<\/p>\n<h3>Rolling Updates<\/h3>\n<p>Kubernetes <code>Deployment<\/code> objesinin varsay\u0131lan g\u00fcncelleme stratejisi olan <code>RollingUpdate<\/code>, yeni s\u00fcr\u00fcm pod&#8217;lar\u0131n\u0131 yava\u015f yava\u015f devreye al\u0131rken eski s\u00fcr\u00fcm pod&#8217;lar\u0131n\u0131 kademeli olarak sonland\u0131r\u0131r. Bu, hizmet kesintisi olmadan g\u00fcncellemeler yapman\u0131z\u0131 sa\u011flar. <code>maxSurge<\/code> ve <code>maxUnavailable<\/code> parametreleri ile bu s\u00fcrecin nas\u0131l i\u015fleyece\u011fini detayl\u0131 olarak kontrol edebilirsiniz.<\/p>\n<h3>Rollback<\/h3>\n<p>Bir g\u00fcncelleme s\u0131ras\u0131nda sorunlar ortaya \u00e7\u0131karsa, Kubernetes \u00f6nceki kararl\u0131 s\u00fcr\u00fcme geri d\u00f6nme (rollback) yetene\u011fi sunar.<\/p>\n<pre><code class=\"language-bash\">kubectl rollout undo deployment\/go-app-deployment<\/code><\/pre>\n<p>Bu komut, uygulaman\u0131z\u0131 bir \u00f6nceki da\u011f\u0131t\u0131m revizyonuna geri d\u00f6nd\u00fcr\u00fcr.<\/p>\n<h3>S\u00fcrekli Entegrasyon\/S\u00fcrekli Da\u011f\u0131t\u0131m (CI\/CD)<\/h3>\n<p>CI\/CD i\u015flem hatlar\u0131, kod de\u011fi\u015fikliklerinin otomatik olarak test edilmesini, imajlar\u0131n olu\u015fturulmas\u0131n\u0131 ve Kubernetes&#8217;e da\u011f\u0131t\u0131lmas\u0131n\u0131 sa\u011flayarak insan hatas\u0131n\u0131 azalt\u0131r ve da\u011f\u0131t\u0131m h\u0131z\u0131n\u0131 art\u0131r\u0131r.<br \/>\n*   <strong>GitHub Actions, GitLab CI, Jenkins:<\/strong> Kod depolar\u0131n\u0131zla entegre olabilen ve bu ad\u0131mlar\u0131 otomatikle\u015ftirebilen pop\u00fcler CI\/CD ara\u00e7lar\u0131d\u0131r.<br \/>\n*   <strong>ArgoCD\/FluxCD:<\/strong> Kubernetes yerel CI\/CD ara\u00e7lar\u0131d\u0131r. GitOps prensiplerini kullanarak Kubernetes k\u00fcmenizin durumunu Git deposundaki manifest dosyalar\u0131yla senkronize ederler.<\/p>\n<h2>G\u00fcvenlik<\/h2>\n<p>Dayan\u0131kl\u0131 bir uygulama ayn\u0131 zamanda g\u00fcvenli olmal\u0131d\u0131r. Kubernetes ve Go uygulamas\u0131 d\u00fczeyinde g\u00fcvenlik \u00f6nlemleri almak kritik \u00f6neme sahiptir.<\/p>\n<h3>Kubernetes G\u00fcvenli\u011fi<\/h3>\n<p>*   <strong>RBAC (Role-Based Access Control):<\/strong> Kullan\u0131c\u0131lar\u0131n ve servis hesaplar\u0131n\u0131n Kubernetes API&#8217;sine eri\u015fimini k\u0131s\u0131tlar. Minimum ayr\u0131cal\u0131k prensibini uygulay\u0131n.<br \/>\n*   <strong>Network Policies:<\/strong> Pod&#8217;lar aras\u0131ndaki a\u011f ileti\u015fimini k\u0131s\u0131tlar. Hangi pod&#8217;lar\u0131n birbirleriyle ve d\u0131\u015f kaynaklarla ileti\u015fim kurabilece\u011fini tan\u0131mlar.<br \/>\n*   <strong>Secrets Y\u00f6netimi:<\/strong> Hassas verileri (API anahtarlar\u0131, veritaban\u0131 \u015fifreleri) <code>Secret<\/code> objelerinde saklay\u0131n ve daha da g\u00fcvenli hale getirmek i\u00e7in External Secrets veya DigitalOcean Secrets gibi \u00e7\u00f6z\u00fcmlerle entegre edin.<br \/>\n*   <strong>Kapsay\u0131c\u0131 G\u00fcvenli\u011fi:<\/strong> Konteyner imajlar\u0131n\u0131 d\u00fczenli olarak g\u00fcvenlik a\u00e7\u0131klar\u0131 i\u00e7in taray\u0131n ve bilinen g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 yamalay\u0131n.<\/p>\n<h3>Uygulama G\u00fcvenli\u011fi<\/h3>\n<p>*   <strong>Ba\u011f\u0131ml\u0131l\u0131k Taramalar\u0131:<\/strong> Go uygulaman\u0131z\u0131n kulland\u0131\u011f\u0131 \u00fc\u00e7\u00fcnc\u00fc taraf ba\u011f\u0131ml\u0131l\u0131klar\u0131 d\u00fczenli olarak g\u00fcvenlik a\u00e7\u0131klar\u0131 i\u00e7in taray\u0131n (\u00f6rne\u011fin, <code>go list -m all<\/code> ve ard\u0131ndan bir g\u00fcvenlik taray\u0131c\u0131).<br \/>\n*   <strong>Giri\u015f Do\u011frulama:<\/strong> T\u00fcm kullan\u0131c\u0131 giri\u015flerini ve API isteklerini dikkatlice do\u011frulay\u0131n ve temizleyin (sanitize).<br \/>\n*   <strong>Minimum Ayr\u0131cal\u0131k:<\/strong> Uygulaman\u0131z\u0131n sadece \u00e7al\u0131\u015fmas\u0131 i\u00e7in gerekli olan minimum ayr\u0131cal\u0131klarla \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flay\u0131n. Konteyner i\u00e7inde root kullan\u0131c\u0131s\u0131 olarak \u00e7al\u0131\u015ft\u0131rmaktan ka\u00e7\u0131n\u0131n.<\/p>\n<h2>Sonu\u00e7 ve Sonraki Ad\u0131mlar<\/h2>\n<p>Bu makalede, dayan\u0131kl\u0131 bir Go uygulamas\u0131n\u0131n DigitalOcean Kubernetes \u00fczerinde nas\u0131l da\u011f\u0131t\u0131laca\u011f\u0131n\u0131, tasar\u0131m prensiplerinden izleme ve g\u00fcvenli\u011fe kadar geni\u015f bir yelpazede ele ald\u0131k. Go&#8217;nun e\u015fzamanl\u0131l\u0131k yetenekleri ve Kubernetes&#8217;in g\u00fc\u00e7l\u00fc orkestrasyon mekanizmalar\u0131 birle\u015fti\u011finde, y\u00fcksek performansl\u0131, \u00f6l\u00e7eklenebilir ve hatalara kar\u015f\u0131 diren\u00e7li uygulamalar in\u015fa etmek m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<p>Dayan\u0131kl\u0131l\u0131k, tek seferlik bir hedef de\u011fil, s\u00fcrekli bir s\u00fcre\u00e7tir. Uygulaman\u0131z\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca a\u015fa\u011f\u0131daki ad\u0131mlar\u0131 g\u00f6z \u00f6n\u00fcnde bulundurarak sisteminizi daha da g\u00fc\u00e7lendirebilirsiniz:<\/p>\n<p>*   <strong>Felaket Kurtarma (Disaster Recovery) Planlamas\u0131:<\/strong> K\u00fcme veya b\u00f6lge \u00e7ap\u0131nda bir ar\u0131za durumunda uygulaman\u0131z\u0131 nas\u0131l kurtaraca\u011f\u0131n\u0131z\u0131 planlay\u0131n ve test edin.<br \/>\n*   <strong>Chaos Engineering:<\/strong> Uygulaman\u0131z\u0131n ve altyap\u0131n\u0131z\u0131n stres alt\u0131nda nas\u0131l davrand\u0131\u011f\u0131n\u0131 anlamak i\u00e7in kas\u0131tl\u0131 olarak hatalar ve kesintiler olu\u015fturun.<br \/>\n*   <strong>Maliyet Optimizasyonu:<\/strong> <code>doctl<\/code> ve DigitalOcean paneli \u00fczerinden k\u00fcmenizin kaynak kullan\u0131m\u0131n\u0131 d\u00fczenli olarak g\u00f6zden ge\u00e7irin ve ihtiyac\u0131n\u0131z olmayan kaynaklar\u0131 kapat\u0131n veya k\u00fc\u00e7\u00fclt\u00fcn. Spot\/Preemptible d\u00fc\u011f\u00fcmleri, belirli i\u015f y\u00fckleri i\u00e7in maliyetleri d\u00fc\u015f\u00fcrebilir.<br \/>\n*   <strong>Otomasyon:<\/strong> CI\/CD i\u015flem hatlar\u0131n\u0131z\u0131 s\u00fcrekli geli\u015ftirin ve m\u00fcmk\u00fcn oldu\u011funca \u00e7ok manuel ad\u0131m\u0131 otomatikle\u015ftirin.<br \/>\n*   <strong>Topluluk ve Kaynaklar:<\/strong> Go ve Kubernetes topluluklar\u0131n\u0131 takip edin, en iyi uygulamalar\u0131 \u00f6\u011frenin ve yeni ara\u00e7lar\u0131 ve teknolojileri ke\u015ffedin.<\/p>\n<p>DigitalOcean Kubernetes, geli\u015ftiricilerin karma\u015f\u0131k altyap\u0131 y\u00f6netimiyle u\u011fra\u015fmadan, Go gibi modern dillerle yaz\u0131lm\u0131\u015f uygulamalar\u0131n\u0131 g\u00fcvenle ve verimli bir \u015fekilde da\u011f\u0131tmalar\u0131 i\u00e7in m\u00fckemmel bir platform sunar. Bu k\u0131lavuzdaki ad\u0131mlar\u0131 takip ederek, \u00fcretim ortam\u0131na haz\u0131r, dayan\u0131kl\u0131 ve \u00f6l\u00e7eklenebilir bir Go uygulamas\u0131n\u0131 ba\u015far\u0131yla da\u011f\u0131tabilirsiniz.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"DigitalOcean Kubernetes \u00dczerine Dayan\u0131kl\u0131 Bir Go Uygulamas\u0131 Da\u011f\u0131t\u0131m\u0131\nGiri\u015f\nG\u00fcn\u00fcm\u00fcz\u00fcn rekabet\u00e7i dijital d\u00fcnyas\u0131nda, uygulamalar\u0131n ke","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1328],"tags":[],"class_list":{"0":"post-32473","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-bash","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>DigitalOcean Kubernetes \u00dczerine Dayan\u0131kl\u0131 Bir Go Uygulamas\u0131 Da\u011f\u0131t\u0131m\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetes-uzerine-dayanikli-bir-go-uygulamasi-dagitimi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"DigitalOcean Kubernetes \u00dczerine Dayan\u0131kl\u0131 Bir Go Uygulamas\u0131 Da\u011f\u0131t\u0131m\u0131\" \/>\n<meta property=\"og:description\" content=\"DigitalOcean Kubernetes \u00dczerine Dayan\u0131kl\u0131 Bir Go Uygulamas\u0131 Da\u011f\u0131t\u0131m\u0131 Giri\u015f G\u00fcn\u00fcm\u00fcz\u00fcn rekabet\u00e7i dijital d\u00fcnyas\u0131nda, uygulamalar\u0131n ke\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetes-uzerine-dayanikli-bir-go-uygulamasi-dagitimi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-22T03:41:01+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"19 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetes-uzerine-dayanikli-bir-go-uygulamasi-dagitimi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetes-uzerine-dayanikli-bir-go-uygulamasi-dagitimi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"DigitalOcean Kubernetes \u00dczerine Dayan\u0131kl\u0131 Bir Go Uygulamas\u0131 Da\u011f\u0131t\u0131m\u0131\",\"datePublished\":\"2025-10-22T03:41:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetes-uzerine-dayanikli-bir-go-uygulamasi-dagitimi\/\"},\"wordCount\":3351,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Bash\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetes-uzerine-dayanikli-bir-go-uygulamasi-dagitimi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetes-uzerine-dayanikli-bir-go-uygulamasi-dagitimi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetes-uzerine-dayanikli-bir-go-uygulamasi-dagitimi\/\",\"name\":\"DigitalOcean Kubernetes \u00dczerine Dayan\u0131kl\u0131 Bir Go Uygulamas\u0131 Da\u011f\u0131t\u0131m\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-22T03:41:01+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetes-uzerine-dayanikli-bir-go-uygulamasi-dagitimi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetes-uzerine-dayanikli-bir-go-uygulamasi-dagitimi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetes-uzerine-dayanikli-bir-go-uygulamasi-dagitimi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"DigitalOcean Kubernetes \u00dczerine Dayan\u0131kl\u0131 Bir Go Uygulamas\u0131 Da\u011f\u0131t\u0131m\u0131\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"DigitalOcean Kubernetes \u00dczerine Dayan\u0131kl\u0131 Bir Go Uygulamas\u0131 Da\u011f\u0131t\u0131m\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetes-uzerine-dayanikli-bir-go-uygulamasi-dagitimi\/","og_locale":"tr_TR","og_type":"article","og_title":"DigitalOcean Kubernetes \u00dczerine Dayan\u0131kl\u0131 Bir Go Uygulamas\u0131 Da\u011f\u0131t\u0131m\u0131","og_description":"DigitalOcean Kubernetes \u00dczerine Dayan\u0131kl\u0131 Bir Go Uygulamas\u0131 Da\u011f\u0131t\u0131m\u0131 Giri\u015f G\u00fcn\u00fcm\u00fcz\u00fcn rekabet\u00e7i dijital d\u00fcnyas\u0131nda, uygulamalar\u0131n ke","og_url":"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetes-uzerine-dayanikli-bir-go-uygulamasi-dagitimi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-22T03:41:01+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"19 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetes-uzerine-dayanikli-bir-go-uygulamasi-dagitimi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetes-uzerine-dayanikli-bir-go-uygulamasi-dagitimi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"DigitalOcean Kubernetes \u00dczerine Dayan\u0131kl\u0131 Bir Go Uygulamas\u0131 Da\u011f\u0131t\u0131m\u0131","datePublished":"2025-10-22T03:41:01+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetes-uzerine-dayanikli-bir-go-uygulamasi-dagitimi\/"},"wordCount":3351,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Bash"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetes-uzerine-dayanikli-bir-go-uygulamasi-dagitimi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetes-uzerine-dayanikli-bir-go-uygulamasi-dagitimi\/","url":"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetes-uzerine-dayanikli-bir-go-uygulamasi-dagitimi\/","name":"DigitalOcean Kubernetes \u00dczerine Dayan\u0131kl\u0131 Bir Go Uygulamas\u0131 Da\u011f\u0131t\u0131m\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-22T03:41:01+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetes-uzerine-dayanikli-bir-go-uygulamasi-dagitimi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetes-uzerine-dayanikli-bir-go-uygulamasi-dagitimi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetes-uzerine-dayanikli-bir-go-uygulamasi-dagitimi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"DigitalOcean Kubernetes \u00dczerine Dayan\u0131kl\u0131 Bir Go Uygulamas\u0131 Da\u011f\u0131t\u0131m\u0131"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32473","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=32473"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32473\/revisions"}],"predecessor-version":[{"id":32474,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32473\/revisions\/32474"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32473"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32473"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32473"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}