{"id":38727,"date":"2026-02-06T12:23:31","date_gmt":"2026-02-06T09:23:31","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulama-olceklendirme-neden-bu-kadar-onemli\/"},"modified":"2026-02-06T12:23:31","modified_gmt":"2026-02-06T09:23:31","slug":"node-js-uygulama-olceklendirme-neden-bu-kadar-onemli","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulama-olceklendirme-neden-bu-kadar-onemli\/","title":{"rendered":"Node.js Uygulama \u00d6l\u00e7eklendirme Neden Bu Kadar \u00d6nemli?"},"content":{"rendered":"<p><title>Node.js Uygulamalar\u0131n\u0131 Kubernetes ve Helm ile Nas\u0131l \u00d6l\u00e7eklendirirsiniz?<\/title><br \/>\n<body><\/p>\n<p>Modern web uygulamalar\u0131 geli\u015ftirirken kar\u015f\u0131la\u015f\u0131lan en b\u00fcy\u00fck zorluklardan biri, de\u011fi\u015fen kullan\u0131c\u0131 trafi\u011fine g\u00f6re uygulaman\u0131n performans\u0131n\u0131 ve eri\u015filebilirli\u011fini korumakt\u0131r. Node.js tabanl\u0131 uygulamalar\u0131n\u0131z\u0131n y\u00fcksek talepleri kar\u015f\u0131layabilmesi ve maliyet etkin bir \u015fekilde \u00e7al\u0131\u015fabilmesi i\u00e7in do\u011fru \u00f6l\u00e7eklendirme stratejilerine ihtiyac\u0131n\u0131z var. Peki, Node.js uygulamalar\u0131n\u0131z\u0131 Kubernetes&#8217;in g\u00fcc\u00fc ve Helm&#8217;in kolayl\u0131\u011f\u0131yla nas\u0131l otomatik olarak \u00f6l\u00e7eklendirebilirsiniz? Bu makale, bu karma\u015f\u0131k s\u00fcreci ad\u0131m ad\u0131m a\u00e7\u0131klayarak, uygulaman\u0131z\u0131n her zaman en iyi performans\u0131 sunmas\u0131n\u0131 sa\u011flaman\u0131za yard\u0131mc\u0131 olacak.<\/p>\n<h2>Node.js Uygulama \u00d6l\u00e7eklendirme Neden Bu Kadar \u00d6nemli?<\/h2>\n<p>G\u00fcn\u00fcm\u00fcz dijital d\u00fcnyas\u0131nda, kullan\u0131c\u0131 beklentileri her zamankinden daha y\u00fcksek. Bir web uygulamas\u0131n\u0131n yava\u015f y\u00fcklenmesi veya eri\u015filemez hale gelmesi, potansiyel m\u00fc\u015fteri kayb\u0131na ve marka itibar\u0131n\u0131n zedelenmesine yol a\u00e7abilir. \u00d6zellikle Node.js gibi tek i\u015f par\u00e7ac\u0131kl\u0131 (single-threaded) yap\u0131s\u0131yla dikkat \u00e7eken platformlarda, gelen yo\u011fun istekleri e\u015f zamanl\u0131 olarak y\u00f6netmek ve yan\u0131t s\u00fcrelerini optimize etmek kritik bir \u00f6neme sahiptir. \u00d6l\u00e7eklendirme, tam da bu noktada devreye girer ve uygulaman\u0131z\u0131n de\u011fi\u015fen y\u00fck alt\u0131nda bile kararl\u0131 ve h\u0131zl\u0131 \u00e7al\u0131\u015fmas\u0131n\u0131 garanti eder.<\/p>\n<p>\u00d6l\u00e7eklendirme temelde iki ana yakla\u015f\u0131ma ayr\u0131l\u0131r: dikey (vertical) ve yatay (horizontal). Dikey \u00f6l\u00e7eklendirme, uygulaman\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 sunucunun kaynaklar\u0131n\u0131 (CPU, RAM gibi) art\u0131rmak anlam\u0131na gelir. Bu y\u00f6ntem, ba\u015flang\u0131\u00e7ta kolay ve h\u0131zl\u0131 olsa da, belirli bir noktadan sonra fiziksel s\u0131n\u0131rlarla kar\u015f\u0131la\u015f\u0131r ve maliyeti h\u0131zla art\u0131r\u0131r. Ayr\u0131ca, tek bir sunucunun ar\u0131zalanmas\u0131 durumunda t\u00fcm uygulaman\u0131z\u0131n \u00e7evrimd\u0131\u015f\u0131 kalma riskini ta\u015f\u0131r. Yatay \u00f6l\u00e7eklendirme ise, uygulaman\u0131n birden fazla sunucu veya &#8220;\u00f6rnek&#8221; (instance) \u00fczerinde \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131 ve gelen trafi\u011fin bu \u00f6rnekler aras\u0131nda da\u011f\u0131t\u0131lmas\u0131 prensibine dayan\u0131r. Bu yakla\u015f\u0131m, \u00e7ok daha esnek, dayan\u0131kl\u0131 ve maliyet etkin bir \u00e7\u00f6z\u00fcm sunar. Uygulaman\u0131z\u0131n kapasitesini ihtiyaca g\u00f6re kolayca art\u0131rabilir veya azaltabilir, b\u00f6ylece kaynaklar\u0131 daha verimli kullanabilirsiniz. \u00d6zellikle mikroservis mimarileri ve bulut tabanl\u0131 da\u011f\u0131t\u0131mlar i\u00e7in yatay \u00f6l\u00e7eklendirme vazge\u00e7ilmez bir stratejidir.<\/p>\n<p>Node.js uygulamalar\u0131 i\u00e7in yatay \u00f6l\u00e7eklendirme, tek i\u015f par\u00e7ac\u0131kl\u0131 yap\u0131n\u0131n getirdi\u011fi k\u0131s\u0131tlamalar\u0131 a\u015fman\u0131n en etkili yoludur. Gelen her iste\u011fi tek bir i\u015flem yerine birden fazla Node.js i\u015flemine da\u011f\u0131tarak, CPU kullan\u0131m\u0131n\u0131 optimize edebilir ve genel i\u015flem hacmini (throughput) art\u0131rabilirsiniz. Bu, \u00f6zellikle I\/O yo\u011fun i\u015flemlerde (veritaban\u0131 sorgular\u0131, a\u011f istekleri vb.) Node.js&#8217;in asenkron do\u011fas\u0131ndan tam anlam\u0131yla faydalanman\u0131z\u0131 sa\u011flar. Ancak bu yatay \u00f6l\u00e7eklendirmeyi manuel olarak y\u00f6netmek, her bir uygulama \u00f6rne\u011fini da\u011f\u0131tmak, izlemek ve gerekti\u011finde yeniden yap\u0131land\u0131rmak olduk\u00e7a karma\u015f\u0131k ve hataya a\u00e7\u0131k bir s\u00fcre\u00e7tir. \u0130\u015fte tam da bu noktada Kubernetes gibi kapsay\u0131c\u0131 d\u00fczenleme (container orchestration) platformlar\u0131 ve Helm gibi paket y\u00f6neticileri devreye girerek bu s\u00fcreci otomatikle\u015ftirmemizi ve basitle\u015ftirmemizi sa\u011flar.<\/p>\n<p>Sonu\u00e7 olarak, uygulaman\u0131z\u0131n kullan\u0131c\u0131 deneyimini iyile\u015ftirmek, operasyonel maliyetleri d\u00fc\u015f\u00fcrmek, y\u00fcksek eri\u015filebilirlik sa\u011flamak ve gelecekteki b\u00fcy\u00fcme ihtiya\u00e7lar\u0131na haz\u0131rl\u0131kl\u0131 olmak i\u00e7in do\u011fru \u00f6l\u00e7eklendirme stratejilerini benimsemek kritik \u00f6neme sahiptir. Bu makalenin devam\u0131nda, Node.js uygulaman\u0131z\u0131 Kubernetes ve Helm ile nas\u0131l yatay olarak \u00f6l\u00e7eklendirebilece\u011finizi ad\u0131m ad\u0131m ke\u015ffedece\u011fiz.<\/p>\n<h2>Kubernetes ve Helm: Modern Da\u011f\u0131t\u0131m\u0131n Temel Ta\u015flar\u0131 Nelerdir?<\/h2>\n<p>Modern bulut yerel uygulamalar\u0131n da\u011f\u0131t\u0131m\u0131 ve y\u00f6netimi, geleneksel y\u00f6ntemlerle olduk\u00e7a karma\u015f\u0131k hale gelebilir. Milyonlarca kullan\u0131c\u0131n\u0131n ayn\u0131 anda eri\u015fti\u011fi bir Node.js uygulamas\u0131n\u0131n performans\u0131n\u0131 ve eri\u015filebilirli\u011fini garanti alt\u0131na almak i\u00e7in g\u00fc\u00e7l\u00fc ara\u00e7lara ihtiyac\u0131m\u0131z var. \u0130\u015fte bu noktada Kubernetes ve Helm ikilisi, geli\u015ftiricilere ve DevOps m\u00fchendislerine muazzam kolayl\u0131klar sunar. Bu b\u00f6l\u00fcmde, bu iki temel teknolojinin ne oldu\u011funu ve neden birlikte bu kadar g\u00fc\u00e7l\u00fc olduklar\u0131n\u0131 detayl\u0131ca inceleyece\u011fiz.<\/p>\n<h3>Kubernetes Nedir ve Neden Kullan\u0131l\u0131r?<\/h3>\n<p>Kubernetes, a\u00e7\u0131k kaynakl\u0131 bir kapsay\u0131c\u0131 d\u00fczenleme platformudur. Yani, Docker gibi ara\u00e7larla olu\u015fturdu\u011funuz kapsay\u0131c\u0131lar\u0131 (container) otomatik olarak da\u011f\u0131tman\u0131za, \u00f6l\u00e7eklendirmenize, y\u00f6netmenize ve izlemenize olanak tan\u0131r. Google taraf\u0131ndan geli\u015ftirilen ve \u015fu anda Cloud Native Computing Foundation (CNCF) taraf\u0131ndan y\u00f6netilen Kubernetes, &#8220;K8s&#8221; olarak da bilinir ve d\u00fcnya genelinde en pop\u00fcler kapsay\u0131c\u0131 d\u00fczenleme arac\u0131 haline gelmi\u015ftir. Temel amac\u0131, uygulamalar\u0131n farkl\u0131 ortamlarda (yerel makine, \u00f6zel bulut, genel bulut) tutarl\u0131 bir \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flamakt\u0131r.<\/p>\n<p>Kubernetes&#8217;in sundu\u011fu ba\u015fl\u0131ca avantajlar \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Otomatik Da\u011f\u0131t\u0131m ve Y\u00f6netim:<\/strong> Uygulama \u00f6rneklerini (pod&#8217;lar) otomatik olarak ba\u015flat\u0131r, durdurur ve yeniden ba\u015flat\u0131r.<\/li>\n<li><strong>Otomatik \u00d6l\u00e7eklendirme:<\/strong> Uygulaman\u0131z\u0131n CPU veya bellek kullan\u0131m\u0131na g\u00f6re otomatik olarak yeni \u00f6rnekler ekler veya mevcut \u00f6rnekleri azalt\u0131r. (Horizontal Pod Autoscaler &#8211; HPA)<\/li>\n<li><strong>Kendi Kendini \u0130yile\u015ftirme (Self-healing):<\/strong> Ba\u015far\u0131s\u0131z olan veya yan\u0131t vermeyen kapsay\u0131c\u0131lar\u0131 otomatik olarak tespit eder ve yeniden ba\u015flat\u0131r.<\/li>\n<li><strong>Y\u00fck Dengeleme:<\/strong> Gelen trafi\u011fi, \u00e7al\u0131\u015fan uygulama \u00f6rnekleri aras\u0131nda e\u015fit \u015fekilde da\u011f\u0131t\u0131r.<\/li>\n<li><strong>Hizmet Ke\u015ffi (Service Discovery):<\/strong> Uygulama bile\u015fenlerinin birbirini kolayca bulmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><strong>Depolama Orkestrasyonu:<\/strong> Uygulamalar\u0131n\u0131z i\u00e7in kal\u0131c\u0131 depolama birimlerini y\u00f6netir.<\/li>\n<li><strong>Gizli Bilgi (Secrets) ve Yap\u0131land\u0131rma Y\u00f6netimi:<\/strong> Veritaban\u0131 \u015fifreleri, API anahtarlar\u0131 gibi hassas bilgileri g\u00fcvenli bir \u015fekilde saklar ve uygulamalara sa\u011flar.<\/li>\n<\/ul>\n<p>Bir Node.js uygulamas\u0131 s\u00f6z konusu oldu\u011funda, Kubernetes, uygulaman\u0131z\u0131n kapsay\u0131c\u0131s\u0131n\u0131 (Docker imaj\u0131) al\u0131p, onu bir veya daha fazla &#8220;pod&#8221; i\u00e7inde \u00e7al\u0131\u015ft\u0131r\u0131r. Her pod, bir veya daha fazla kapsay\u0131c\u0131y\u0131 bar\u0131nd\u0131ran en k\u00fc\u00e7\u00fck da\u011f\u0131t\u0131labilir birimdir. Kubernetes, bu pod&#8217;lar\u0131n sa\u011fl\u0131kl\u0131 kalmas\u0131n\u0131, gerekti\u011finde \u00f6l\u00e7eklenmesini ve d\u0131\u015f d\u00fcnyaya eri\u015filebilir olmas\u0131n\u0131 sa\u011flar. Bu sayede, geli\u015ftiriciler altyap\u0131 detaylar\u0131yla u\u011fra\u015fmak yerine do\u011frudan uygulama mant\u0131\u011f\u0131na odaklanabilirler.<\/p>\n<h3>Helm Nedir ve Neden Kubernetes ile Birlikte Kullan\u0131l\u0131r?<\/h3>\n<p>Kubernetes, kapsay\u0131c\u0131 d\u00fczenleme konusunda olduk\u00e7a g\u00fc\u00e7l\u00fc bir ara\u00e7 olsa da, karma\u015f\u0131k uygulamalar\u0131n da\u011f\u0131t\u0131m\u0131n\u0131 ve y\u00f6netimini manuel olarak yapmak yine de zaman al\u0131c\u0131 ve hataya a\u00e7\u0131k olabilir. \u0130\u015fte Helm tam da bu noktada devreye girer. Helm, Kubernetes i\u00e7in bir paket y\u00f6neticisidir. Linux d\u00fcnyas\u0131ndaki <span class=\"code-inline\">apt<\/span> veya <span class=\"code-inline\">yum<\/span> gibi, Helm de Kubernetes uygulamalar\u0131 i\u00e7in &#8220;chart&#8221; ad\u0131 verilen \u00f6nceden yap\u0131land\u0131r\u0131lm\u0131\u015f paketler olu\u015fturman\u0131za, da\u011f\u0131tman\u0131za ve y\u00f6netmenize olanak tan\u0131r.<\/p>\n<p>Helm&#8217;in sundu\u011fu ba\u015fl\u0131ca faydalar \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Uygulama Paketleme:<\/strong> Bir uygulamay\u0131 (Node.js backend, veritaban\u0131, \u00f6n y\u00fcz gibi t\u00fcm bile\u015fenleriyle birlikte) tek bir &#8220;chart&#8221; i\u00e7inde paketlemenizi sa\u011flar.<\/li>\n<li><strong>Tekrarlanabilir Da\u011f\u0131t\u0131mlar:<\/strong> Ayn\u0131 uygulamay\u0131 farkl\u0131 ortamlara (geli\u015ftirme, test, \u00fcretim) tutarl\u0131 bir \u015fekilde da\u011f\u0131tabilirsiniz.<\/li>\n<li><strong>Yap\u0131land\u0131rma Y\u00f6netimi:<\/strong> Uygulaman\u0131n farkl\u0131 ortamlar i\u00e7in \u00f6zelle\u015ftirilebilir yap\u0131land\u0131rmalar\u0131n\u0131 (<span class=\"code-inline\">values.yaml<\/span> dosyas\u0131 arac\u0131l\u0131\u011f\u0131yla) kolayca y\u00f6netir.<\/li>\n<li><strong>S\u00fcr\u00fcm Kontrol\u00fc:<\/strong> Da\u011f\u0131t\u0131lan uygulamalar\u0131n s\u00fcr\u00fcmlerini izler, kolayca geri alabilir (rollback) veya y\u00fckseltebilir (upgrade) olana\u011f\u0131 sunar.<\/li>\n<li><strong>Ba\u011f\u0131ml\u0131l\u0131k Y\u00f6netimi:<\/strong> Bir chart&#8217;\u0131n di\u011fer chart&#8217;lara olan ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00f6netir.<\/li>\n<\/ul>\n<p>Node.js uygulamam\u0131z\u0131 Kubernetes&#8217;e da\u011f\u0131t\u0131rken, Helm bize bir Node.js uygulamas\u0131n\u0131n gerektirdi\u011fi t\u00fcm Kubernetes kaynaklar\u0131n\u0131 (Deployment, Service, Ingress, HPA vb.) i\u00e7eren bir \u015fablon seti sa\u011flar. Bu \u015fablonlar, <span class=\"code-inline\">values.yaml<\/span> dosyas\u0131 arac\u0131l\u0131\u011f\u0131yla kolayca \u00f6zelle\u015ftirilebilir. \u00d6rne\u011fin, uygulama imaj\u0131n\u0131n ad\u0131n\u0131, replica say\u0131s\u0131n\u0131, kaynak limitlerini veya ortam de\u011fi\u015fkenlerini bu dosya \u00fczerinden de\u011fi\u015ftirebiliriz. Bu, \u00f6zellikle CI\/CD (S\u00fcrekli Entegrasyon\/S\u00fcrekli Teslimat) s\u00fcre\u00e7lerinde b\u00fcy\u00fck kolayl\u0131k sa\u011flar ve da\u011f\u0131t\u0131m otomasyonunu basitle\u015ftirir.<\/p>\n<p>\u00d6zetle, Kubernetes uygulamalar\u0131n\u0131z\u0131 \u00e7al\u0131\u015ft\u0131ran g\u00fc\u00e7l\u00fc bir motor gibiyken, Helm bu motoru \u00e7al\u0131\u015ft\u0131rmak i\u00e7in gereken t\u00fcm par\u00e7alar\u0131 (uygulama yap\u0131land\u0131rmalar\u0131, kaynak tan\u0131mlar\u0131) d\u00fczenli bir \u015fekilde paketleyen ve y\u00f6neten bir anahtar tak\u0131m\u0131 gibidir. Birlikte kullan\u0131ld\u0131klar\u0131nda, Node.js uygulamalar\u0131n\u0131z\u0131 bulutta y\u00fcksek performansla ve kolayca \u00f6l\u00e7eklendirilebilir bir \u015fekilde da\u011f\u0131tmak i\u00e7in e\u015fsiz bir kombinasyon sunarlar.<\/p>\n<h2>Node.js Uygulaman\u0131z\u0131 Kapsay\u0131c\u0131 Hale Getirme: Dockerfile Nas\u0131l Yaz\u0131l\u0131r?<\/h2>\n<p>Kubernetes ile Node.js uygulamalar\u0131n\u0131 \u00f6l\u00e7eklendirmeye ba\u015flamadan \u00f6nce, uygulaman\u0131z\u0131n bir kapsay\u0131c\u0131 (container) i\u00e7inde \u00e7al\u0131\u015fabilir durumda olmas\u0131 gerekir. Docker, bu kapsay\u0131c\u0131lar\u0131 olu\u015fturmak i\u00e7in end\u00fcstri standard\u0131 bir ara\u00e7t\u0131r. Bir Node.js uygulamas\u0131n\u0131 Docker kapsay\u0131c\u0131s\u0131na d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in <span class=\"code-inline\">Dockerfile<\/span> ad\u0131 verilen basit bir metin dosyas\u0131 yazmam\u0131z gerekiyor. Bu dosya, Docker&#8217;a uygulaman\u0131z\u0131n nas\u0131l olu\u015fturulaca\u011f\u0131n\u0131 ve hangi ortamda \u00e7al\u0131\u015faca\u011f\u0131n\u0131 ad\u0131m ad\u0131m anlat\u0131r.<\/p>\n<p>Bir Node.js uygulamas\u0131n\u0131 kapsay\u0131c\u0131 hale getirmenin temel amac\u0131, uygulaman\u0131n t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131 ve \u00e7al\u0131\u015fma zaman\u0131 ortam\u0131 ile birlikte ta\u015f\u0131nabilir, izole edilmi\u015f ve tutarl\u0131 bir birim olu\u015fturmakt\u0131r. Bu, &#8220;bir kere yaz, her yerde \u00e7al\u0131\u015ft\u0131r&#8221; felsefesinin temelini olu\u015fturur ve geli\u015ftirme, test ve \u00fcretim ortamlar\u0131 aras\u0131ndaki uyumsuzluk sorunlar\u0131n\u0131 ortadan kald\u0131r\u0131r. A\u015fa\u011f\u0131da, tipik bir Node.js uygulamas\u0131 i\u00e7in ad\u0131m ad\u0131m bir <span class=\"code-inline\">Dockerfile<\/span> \u00f6rne\u011fi ve a\u00e7\u0131klamalar\u0131 bulunmaktad\u0131r.<\/p>\n<h3>Ad\u0131m 1: Temel \u0130maj Se\u00e7imi<\/h3>\n<p>Her <span class=\"code-inline\">Dockerfile<\/span>, bir temel imaj ile ba\u015flar. Node.js uygulamalar\u0131 i\u00e7in genellikle resmi Node.js Docker imajlar\u0131 kullan\u0131l\u0131r. Bu imajlar, Node.js \u00e7al\u0131\u015fma zaman\u0131n\u0131 ve npm gibi gerekli ara\u00e7lar\u0131 i\u00e7erir. Genellikle <span class=\"code-inline\">alpine<\/span> tabanl\u0131 imajlar, daha k\u00fc\u00e7\u00fck boyutlar\u0131 nedeniyle tercih edilir.<\/p>\n<pre><code>\nFROM node:18-alpine\n\n<\/code><\/pre>\n<p>Burada <span class=\"code-inline\">node:18-alpine<\/span>, Node.js&#8217;in 18. s\u00fcr\u00fcm\u00fcn\u00fc Alpine Linux \u00fczerinde \u00e7al\u0131\u015ft\u0131ran bir imaj\u0131 temel ald\u0131\u011f\u0131m\u0131z\u0131 belirtir. Alpine Linux, minimalist yap\u0131s\u0131yla bilinen k\u00fc\u00e7\u00fck boyutlu bir Linux da\u011f\u0131t\u0131m\u0131d\u0131r, bu da nihai Docker imaj\u0131n\u0131z\u0131n boyutunu k\u00fc\u00e7\u00fclt\u00fcr.<\/p>\n<h3>Ad\u0131m 2: \u00c7al\u0131\u015fma Dizini Belirleme<\/h3>\n<p>Kapsay\u0131c\u0131 i\u00e7inde uygulaman\u0131z\u0131n nerede bulunaca\u011f\u0131n\u0131 belirlemek i\u00e7in bir \u00e7al\u0131\u015fma dizini ayarlaman\u0131z gerekir. Bu, t\u00fcm komutlar\u0131n bu dizin ba\u011flam\u0131nda \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar.<\/p>\n<pre><code>\nWORKDIR \/app\n\n<\/code><\/pre>\n<p>Bu komut, kapsay\u0131c\u0131 i\u00e7inde <span class=\"code-inline\">\/app<\/span> ad\u0131nda bir dizin olu\u015fturur ve sonraki t\u00fcm komutlar\u0131n bu dizin i\u00e7inde \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Ad\u0131m 3: Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Kopyalama ve Y\u00fckleme<\/h3>\n<p>Uygulaman\u0131z\u0131n ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 (\u00f6rne\u011fin <span class=\"code-inline\">package.json<\/span> ve <span class=\"code-inline\">package-lock.json<\/span>) kopyalay\u0131p y\u00fcklemek, imaj boyutunu optimize etmek ve katman \u00f6nbelleklemesinden faydalanmak i\u00e7in \u00f6nemli bir ad\u0131md\u0131r. \u00d6nce ba\u011f\u0131ml\u0131l\u0131k dosyalar\u0131n\u0131 kopyalar, sonra <span class=\"code-inline\">npm install<\/span> \u00e7al\u0131\u015ft\u0131r\u0131r\u0131z. Bu, uygulama kodunda bir de\u011fi\u015fiklik oldu\u011funda ba\u011f\u0131ml\u0131l\u0131klar\u0131n yeniden y\u00fcklenmesini engeller.<\/p>\n<pre><code>\nCOPY package*.json .\/\nRUN npm install --production\n\n<\/code><\/pre>\n<p><span class=\"code-inline\">COPY package*.json .\/<\/span> komutu, yerel dizindeki <span class=\"code-inline\">package.json<\/span> ve <span class=\"code-inline\">package-lock.json<\/span> dosyalar\u0131n\u0131 kapsay\u0131c\u0131daki <span class=\"code-inline\">\/app<\/span> dizinine kopyalar. Ard\u0131ndan <span class=\"code-inline\">RUN npm install &#8211;production<\/span> komutu, yaln\u0131zca \u00fcretim ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00fckler, bu da imaj boyutunu daha da k\u00fc\u00e7\u00fclt\u00fcr.<\/p>\n<h3>Ad\u0131m 4: Uygulama Kodunu Kopyalama<\/h3>\n<p>Ba\u011f\u0131ml\u0131l\u0131klar y\u00fcklendikten sonra, uygulaman\u0131z\u0131n geri kalan kodunu kapsay\u0131c\u0131ya kopyalayabilirsiniz.<\/p>\n<pre><code>\nCOPY . .\n\n<\/code><\/pre>\n<p>Bu komut, <span class=\"code-inline\">Dockerfile<\/span>&#8216;\u0131n bulundu\u011fu dizindeki t\u00fcm dosyalar\u0131 (ba\u011f\u0131ml\u0131l\u0131k dosyalar\u0131 hari\u00e7, \u00e7\u00fcnk\u00fc zaten kopyaland\u0131lar) kapsay\u0131c\u0131daki \u00e7al\u0131\u015fma dizinine kopyalar. Genellikle <span class=\"code-inline\">.dockerignore<\/span> dosyas\u0131 kullanarak gereksiz dosyalar\u0131n (\u00f6rne\u011fin <span class=\"code-inline\">node_modules<\/span>, <span class=\"code-inline\">.git<\/span>) kopyalanmas\u0131n\u0131 engellersiniz.<\/p>\n<h3>Ad\u0131m 5: Uygulaman\u0131n Dinleyece\u011fi Portu Belirtme<\/h3>\n<p>Uygulaman\u0131z\u0131n hangi port \u00fczerinden d\u0131\u015f d\u00fcnyaya hizmet verece\u011fini belirtmek iyi bir pratiktir.<\/p>\n<pre><code>\nEXPOSE 3000\n\n<\/code><\/pre>\n<p>Bu, uygulaman\u0131z\u0131n 3000 numaral\u0131 portu kullanaca\u011f\u0131n\u0131 belgeler. Bu, kapsay\u0131c\u0131n\u0131n d\u0131\u015far\u0131dan eri\u015filebilir olmas\u0131n\u0131 sa\u011flamaz, sadece bir bildirimdir. A\u011f yap\u0131land\u0131rmas\u0131 Kubernetes veya Docker komutlar\u0131 ile yap\u0131l\u0131r.<\/p>\n<h3>Ad\u0131m 6: Uygulamay\u0131 Ba\u015flatma Komutu<\/h3>\n<p>Son olarak, kapsay\u0131c\u0131 ba\u015flat\u0131ld\u0131\u011f\u0131nda hangi komutun \u00e7al\u0131\u015faca\u011f\u0131n\u0131 belirtmeniz gerekir.<\/p>\n<pre><code>\nCMD [\"node\", \"server.js\"]\n\n<\/code><\/pre>\n<p>Bu komut, kapsay\u0131c\u0131 her ba\u015flad\u0131\u011f\u0131nda <span class=\"code-inline\">node server.js<\/span> komutunu \u00e7al\u0131\u015ft\u0131rarak Node.js uygulaman\u0131z\u0131 ba\u015flat\u0131r. <span class=\"code-inline\">server.js<\/span> yerine kendi ana dosyan\u0131z\u0131n ad\u0131n\u0131 kullanmal\u0131s\u0131n\u0131z.<\/p>\n<h3>Tamamlanm\u0131\u015f Dockerfile \u00d6rne\u011fi:<\/h3>\n<pre><code>\n# Temel imaj\u0131 se\u00e7\nFROM node:18-alpine\n\n# \u00c7al\u0131\u015fma dizinini belirle\nWORKDIR \/app\n\n# package.json ve package-lock.json dosyalar\u0131n\u0131 kopyala\n# ve ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckle\nCOPY package*.json .\/\nRUN npm install --production\n\n# Uygulama kodunun geri kalan\u0131n\u0131 kopyala\nCOPY . .\n\n# Uygulaman\u0131n dinleyece\u011fi portu belirt\nEXPOSE 3000\n\n# Uygulamay\u0131 ba\u015flat\nCMD [\"node\", \"server.js\"]\n\n<\/code><\/pre>\n<h3>Docker \u0130maj\u0131n\u0131 Olu\u015fturma ve \u00c7al\u0131\u015ft\u0131rma<\/h3>\n<p><span class=\"code-inline\">Dockerfile<\/span>&#8216;\u0131 olu\u015fturduktan sonra, ayn\u0131 dizinde terminali a\u00e7\u0131p a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131rarak Docker imaj\u0131n\u0131 olu\u015fturabilirsiniz:<\/p>\n<pre><code>\ndocker build -t my-nodejs-app:1.0 .\n\n<\/code><\/pre>\n<p>Burada <span class=\"code-inline\">-t my-nodejs-app:1.0<\/span> imaj\u0131n\u0131za bir isim ve etiket (tag) verirken, <span class=\"code-inline\">.<\/span> ise <span class=\"code-inline\">Dockerfile<\/span>&#8216;\u0131n mevcut dizinde oldu\u011funu belirtir.<\/p>\n<p>\u0130maj\u0131 olu\u015fturduktan sonra, yerel olarak test etmek i\u00e7in a\u015fa\u011f\u0131daki komutu kullanabilirsiniz:<\/p>\n<pre><code>\ndocker run -p 80:3000 my-nodejs-app:1.0\n\n<\/code><\/pre>\n<p>Bu komut, kapsay\u0131c\u0131daki 3000 numaral\u0131 portu yerel makinenizin 80 numaral\u0131 portuna e\u015fler. Art\u0131k web taray\u0131c\u0131n\u0131zdan <span class=\"code-inline\">http:\/\/localhost<\/span> adresine giderek Node.js uygulaman\u0131za eri\u015febilirsiniz.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Daha k\u00fc\u00e7\u00fck ve g\u00fcvenli Docker imajlar\u0131 i\u00e7in multi-stage build (\u00e7ok a\u015famal\u0131 derleme) kullanmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz. Bu teknik, ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fcklemek i\u00e7in bir a\u015fama ve nihai uygulama i\u00e7in daha minimalist bir a\u015fama kullanarak gereksiz derleme ara\u00e7lar\u0131n\u0131 nihai imajdan \u00e7\u0131kar\u0131r. Bu, \u00f6zellikle CI\/CD s\u00fcre\u00e7lerinde h\u0131z ve verimlilik sa\u011flar.\n<\/div>\n<p>Node.js uygulaman\u0131z\u0131 Docker kapsay\u0131c\u0131s\u0131na d\u00f6n\u00fc\u015ft\u00fcrmek, Kubernetes ile \u00f6l\u00e7eklendirme yolculu\u011funuzun ilk ve en kritik ad\u0131m\u0131d\u0131r. Bu ad\u0131m\u0131 tamamlad\u0131\u011f\u0131n\u0131zda, uygulaman\u0131z\u0131n herhangi bir Kubernetes k\u00fcmesinde tutarl\u0131 bir \u015fekilde \u00e7al\u0131\u015faca\u011f\u0131ndan emin olabilirsiniz.<\/p>\n<h2>Helm Chart Olu\u015fturma ve Yap\u0131land\u0131rma Ad\u0131mlar\u0131 Nelerdir?<\/h2>\n<p>Node.js uygulaman\u0131z\u0131 Docker kapsay\u0131c\u0131s\u0131na d\u00f6n\u00fc\u015ft\u00fcrd\u00fc\u011f\u00fcn\u00fcze g\u00f6re, \u015fimdi bu kapsay\u0131c\u0131y\u0131 Kubernetes&#8217;e da\u011f\u0131tmak i\u00e7in Helm&#8217;i kullanman\u0131n zaman\u0131 geldi. Helm, Kubernetes uygulamalar\u0131n\u0131 paketlemek ve da\u011f\u0131tmak i\u00e7in &#8220;chart&#8221; ad\u0131 verilen yap\u0131lar\u0131 kullan\u0131r. Bir Helm chart&#8217;\u0131, bir uygulaman\u0131n t\u00fcm Kubernetes kaynaklar\u0131n\u0131 (Deployment, Service, Ingress, HPA vb.) tan\u0131mlayan bir \u015fablon koleksiyonudur. Bu b\u00f6l\u00fcmde, Node.js uygulaman\u0131z i\u00e7in nas\u0131l bir Helm chart olu\u015fturaca\u011f\u0131n\u0131z\u0131 ve onu nas\u0131l yap\u0131land\u0131raca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m \u00f6\u011freneceksiniz.<\/p>\n<h3>Ad\u0131m 1: Yeni Bir Helm Chart Olu\u015fturma<\/h3>\n<p>\u0130lk olarak, Helm CLI&#8217;yi kullanarak yeni bir chart iskeleti olu\u015fturmal\u0131s\u0131n\u0131z. Terminalinizde a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code>\nhelm create my-nodejs-app-chart\n\n<\/code><\/pre>\n<p>Bu komut, <span class=\"code-inline\">my-nodejs-app-chart<\/span> ad\u0131nda yeni bir dizin olu\u015fturur ve i\u00e7ine temel bir Helm chart yap\u0131s\u0131n\u0131 yerle\u015ftirir. Bu dizinin i\u00e7eri\u011fi genellikle \u015funa benzer:<\/p>\n<pre><code>\nmy-nodejs-app-chart\/\n\u251c\u2500\u2500 Chart.yaml          # Chart hakk\u0131nda meta bilgiler\n\u251c\u2500\u2500 values.yaml         # Chart i\u00e7in varsay\u0131lan yap\u0131land\u0131rma de\u011ferleri\n\u251c\u2500\u2500 charts\/             # Ba\u011f\u0131ml\u0131 chart'lar i\u00e7in dizin\n\u251c\u2500\u2500 templates\/          # Kubernetes manifest dosyalar\u0131 i\u00e7in \u015fablonlar\n\u2502   \u251c\u2500\u2500 deployment.yaml\n\u2502   \u251c\u2500\u2500 service.yaml\n\u2502   \u251c\u2500\u2500 ingress.yaml\n\u2502   \u251c\u2500\u2500 _helpers.tpl\n\u2502   \u2514\u2500\u2500 tests\/\n\u2502       \u2514\u2500\u2500 test-connection.yaml\n\u2514\u2500\u2500 .helmignore         # Helm'in pakete dahil etmemesi gereken dosyalar\n\n<\/code><\/pre>\n<h3>Ad\u0131m 2: <span class=\"code-inline\">Chart.yaml<\/span> Dosyas\u0131n\u0131 \u0130nceleme<\/h3>\n<p><span class=\"code-inline\">Chart.yaml<\/span> dosyas\u0131, chart&#8217;\u0131n\u0131z hakk\u0131nda temel bilgileri i\u00e7erir. Bu bilgiler, chart&#8217;\u0131n ad\u0131, s\u00fcr\u00fcm\u00fc, a\u00e7\u0131klamas\u0131 ve Kubernetes API s\u00fcr\u00fcm\u00fc gibi detaylard\u0131r. Node.js uygulaman\u0131z i\u00e7in bu dosyay\u0131 g\u00fcncelleyebilirsiniz:<\/p>\n<pre><code>\napiVersion: v2\nname: my-nodejs-app-chart\ndescription: A Helm chart for my Node.js application.\nversion: 0.1.0\nappVersion: \"1.0.0\" # Uygulaman\u0131z\u0131n versiyonu\n\n<\/code><\/pre>\n<p><span class=\"code-inline\">appVersion<\/span> alan\u0131, da\u011f\u0131tt\u0131\u011f\u0131n\u0131z Node.js uygulamas\u0131n\u0131n s\u00fcr\u00fcm\u00fcn\u00fc belirtir ve chart s\u00fcr\u00fcm\u00fcnden ba\u011f\u0131ms\u0131z olabilir.<\/p>\n<h3>Ad\u0131m 3: <span class=\"code-inline\">values.yaml<\/span> Dosyas\u0131n\u0131 Yap\u0131land\u0131rma<\/h3>\n<p><span class=\"code-inline\">values.yaml<\/span> dosyas\u0131, chart&#8217;\u0131n\u0131z i\u00e7in varsay\u0131lan yap\u0131land\u0131rma de\u011ferlerini i\u00e7erir. Bu dosya, <span class=\"code-inline\">templates<\/span> dizinindeki Kubernetes manifest dosyalar\u0131nda kullan\u0131lan de\u011fi\u015fkenleri tan\u0131mlar. Node.js uygulaman\u0131z i\u00e7in bu dosyay\u0131 \u00f6zelle\u015ftirece\u011fiz:<\/p>\n<pre><code>\n# my-nodejs-app-chart\/values.yaml\n\nreplicaCount: 2 # Uygulaman\u0131n ka\u00e7 kopyas\u0131n\u0131n \u00e7al\u0131\u015faca\u011f\u0131n\u0131 belirtir\n\nimage:\n  repository: your-dockerhub-username\/my-nodejs-app # Docker imaj\u0131n\u0131z\u0131n yolu\n  pullPolicy: IfNotPresent # \u0130maj \u00e7ekme politikas\u0131 (Always, IfNotPresent, Never)\n  tag: \"1.0\" # Kullanaca\u011f\u0131n\u0131z imaj etiketi (Dockerfile'da olu\u015fturdu\u011funuz etiket)\n\nservice:\n  type: ClusterIP # Kubernetes Service tipi (ClusterIP, NodePort, LoadBalancer)\n  port: 80 # Servisin dinleyece\u011fi port\n  targetPort: 3000 # Uygulaman\u0131n dinledi\u011fi port (Node.js uygulaman\u0131z\u0131n portu)\n\ningress:\n  enabled: true # Ingress Controller kullan\u0131l\u0131p kullan\u0131lmayaca\u011f\u0131n\u0131 belirtir\n  className: nginx\n  annotations:\n    kubernetes.io\/ingress.class: nginx\n    # cert-manager.io\/cluster-issuer: letsencrypt-prod # SSL i\u00e7in \u00f6rnek annotation\n  hosts:\n    - host: myapp.example.com # Uygulaman\u0131z\u0131n etki alan\u0131\n      paths:\n        - path: \/\n          pathType: Prefix\n          backend:\n            service:\n              name: my-nodejs-app-chart # Servis ad\u0131\n              port:\n                number: 80\n\nresources: # Uygulaman\u0131n kullanabilece\u011fi CPU ve bellek kaynaklar\u0131\n  limits:\n    cpu: 500m # 0.5 CPU \u00e7ekirde\u011fi\n    memory: 512Mi # 512 Megabayt bellek\n  requests:\n    cpu: 200m\n    memory: 256Mi\n\nautoscaling: # Horizontal Pod Autoscaler (HPA) ayarlar\u0131\n  enabled: true\n  minReplicas: 2\n  maxReplicas: 10\n  targetCPUUtilizationPercentage: 70 # CPU kullan\u0131m\u0131 %70'e ula\u015f\u0131nca \u00f6l\u00e7eklendir\n\nnodeSelector: {} # Uygulaman\u0131n belirli d\u00fc\u011f\u00fcmlerde \u00e7al\u0131\u015fmas\u0131n\u0131 istiyorsan\u0131z\n\ntolerations: [] # Belirli d\u00fc\u011f\u00fcmlerdeki taint'leri tolere etmek i\u00e7in\n\naffinity: {} # Uygulaman\u0131n d\u00fc\u011f\u00fcm veya pod'lara yak\u0131nl\u0131\u011f\u0131n\u0131\/uzakl\u0131\u011f\u0131n\u0131 ayarlamak i\u00e7in\n\n<\/code><\/pre>\n<p>Bu <span class=\"code-inline\">values.yaml<\/span> dosyas\u0131, Node.js uygulaman\u0131z\u0131n Kubernetes \u00fczerinde nas\u0131l da\u011f\u0131t\u0131laca\u011f\u0131na dair kapsaml\u0131 bir yap\u0131land\u0131rma sa\u011flar. \u00d6rne\u011fin, <span class=\"code-inline\">replicaCount<\/span> ile ba\u015flang\u0131\u00e7ta ka\u00e7 adet uygulama kopyas\u0131n\u0131n \u00e7al\u0131\u015faca\u011f\u0131n\u0131, <span class=\"code-inline\">image<\/span> ile Docker imaj\u0131n\u0131z\u0131n nerede oldu\u011funu ve <span class=\"code-inline\">service<\/span> ile uygulaman\u0131z\u0131n nas\u0131l eri\u015filebilir olaca\u011f\u0131n\u0131 belirtirsiniz. \u00d6zellikle <span class=\"code-inline\">autoscaling<\/span> b\u00f6l\u00fcm\u00fc, uygulaman\u0131z\u0131n otomatik \u00f6l\u00e7eklendirme davran\u0131\u015f\u0131n\u0131 tan\u0131mlar.<\/p>\n<h3>Ad\u0131m 4: <span class=\"code-inline\">templates<\/span> Dizini \u0130\u00e7indeki Dosyalar\u0131 D\u00fczenleme<\/h3>\n<p><span class=\"code-inline\">templates<\/span> dizini, Kubernetes manifest dosyalar\u0131n\u0131 (Deployment, Service, Ingress vb.) i\u00e7eren Jinja benzeri \u015fablonlar\u0131 bar\u0131nd\u0131r\u0131r. Bu dosyalar, <span class=\"code-inline\">values.yaml<\/span> dosyas\u0131ndaki de\u011ferleri kullanarak nihai Kubernetes kaynaklar\u0131n\u0131 olu\u015fturur. Varsay\u0131lan olarak olu\u015fturulan dosyalar\u0131 Node.js uygulaman\u0131za g\u00f6re \u00f6zelle\u015ftirelim.<\/p>\n<h4><span class=\"code-inline\">deployment.yaml<\/span> Dosyas\u0131<\/h4>\n<p>Bu dosya, uygulaman\u0131z\u0131n pod&#8217;lar\u0131n\u0131 ve bunlar\u0131n nas\u0131l \u00e7al\u0131\u015faca\u011f\u0131n\u0131 tan\u0131mlar. <span class=\"code-inline\">values.yaml<\/span>&#8216;deki <span class=\"code-inline\">image<\/span>, <span class=\"code-inline\">replicaCount<\/span> ve <span class=\"code-inline\">resources<\/span> de\u011ferlerini kullan\u0131r.<\/p>\n<pre><code>\n# my-nodejs-app-chart\/templates\/deployment.yaml\napiVersion: apps\/v1\nkind: Deployment\nmetadata:\n  name: {{ include \"my-nodejs-app-chart.fullname\" . }}\n  labels:\n    {{- include \"my-nodejs-app-chart.labels\" . | nindent 4 }}\nspec:\n  {{- if not .Values.autoscaling.enabled }}\n  replicas: {{ .Values.replicaCount }}\n  {{- end }}\n  selector:\n    matchLabels:\n      {{- include \"my-nodejs-app-chart.selectorLabels\" . | nindent 6 }}\n  template:\n    metadata:\n      {{- with .Values.podAnnotations }}\n      annotations:\n        {{- toYaml . | nindent 8 }}\n      {{- end }}\n      labels:\n        {{- include \"my-nodejs-app-chart.selectorLabels\" . | nindent 8 }}\n    spec:\n      containers:\n        - name: {{ .Chart.Name }}\n          image: \"{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}\"\n          imagePullPolicy: {{ .Values.image.pullPolicy }}\n          ports:\n            - name: http\n              containerPort: {{ .Values.service.targetPort }}\n              protocol: TCP\n          resources:\n            {{- toYaml .Values.resources | nindent 12 }}\n          # Sa\u011fl\u0131k kontrolleri\n          livenessProbe:\n            httpGet:\n              path: \/healthz # Uygulaman\u0131z\u0131n sa\u011fl\u0131k kontrol\u00fc endpoint'i\n              port: http\n            initialDelaySeconds: 5\n            periodSeconds: 10\n          readinessProbe:\n            httpGet:\n              path: \/ready # Uygulaman\u0131z\u0131n haz\u0131r olma kontrol\u00fc endpoint'i\n              port: http\n            initialDelaySeconds: 5\n            periodSeconds: 5\n          env: # Ortam de\u011fi\u015fkenleri\n            - name: NODE_ENV\n              value: production\n            - name: PORT\n              value: \"{{ .Values.service.targetPort }}\"\n      {{- with .Values.nodeSelector }}\n      nodeSelector:\n        {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- with .Values.affinity }}\n      affinity:\n        {{- toYaml . | nindent 8 }}\n      {{- end }}\n      {{- with .Values.tolerations }}\n      tolerations:\n        {{- toYaml . | nindent 8 }}\n      {{- end }}\n\n<\/code><\/pre>\n<p>Bu <span class=\"code-inline\">deployment.yaml<\/span> dosyas\u0131nda, Node.js uygulaman\u0131z\u0131n imaj\u0131n\u0131, portunu, kaynak limitlerini ve sa\u011fl\u0131k kontrollerini (<span class=\"code-inline\">livenessProbe<\/span>, <span class=\"code-inline\">readinessProbe<\/span>) <span class=\"code-inline\">values.yaml<\/span>&#8216;den gelen de\u011ferlerle dinamik olarak yap\u0131land\u0131r\u0131yoruz. Sa\u011fl\u0131k kontrolleri, Kubernetes&#8217;in uygulaman\u0131z\u0131n sa\u011fl\u0131kl\u0131 olup olmad\u0131\u011f\u0131n\u0131 anlamas\u0131 i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h4><span class=\"code-inline\">service.yaml<\/span> Dosyas\u0131<\/h4>\n<p>Bu dosya, uygulaman\u0131z\u0131n pod&#8217;lar\u0131na d\u0131\u015far\u0131dan veya di\u011fer pod&#8217;lardan nas\u0131l eri\u015filece\u011fini tan\u0131mlar.<\/p>\n<pre><code>\n# my-nodejs-app-chart\/templates\/service.yaml\napiVersion: v1\nkind: Service\nmetadata:\n  name: {{ include \"my-nodejs-app-chart.fullname\" . }}\n  labels:\n    {{- include \"my-nodejs-app-chart.labels\" . | nindent 4 }}\nspec:\n  type: {{ .Values.service.type }}\n  ports:\n    - port: {{ .Values.service.port }}\n      targetPort: {{ .Values.service.targetPort }}\n      protocol: TCP\n      name: http\n  selector:\n    {{- include \"my-nodejs-app-chart.selectorLabels\" . | nindent 4 }}\n\n<\/code><\/pre>\n<p>Burada, <span class=\"code-inline\">service.type<\/span> ve <span class=\"code-inline\">service.port<\/span> de\u011ferleri <span class=\"code-inline\">values.yaml<\/span> dosyas\u0131ndan al\u0131n\u0131r.<\/p>\n<h4><span class=\"code-inline\">ingress.yaml<\/span> Dosyas\u0131<\/h4>\n<p>E\u011fer uygulaman\u0131za d\u0131\u015far\u0131dan HTTP\/HTTPS \u00fczerinden eri\u015fim sa\u011flamak istiyorsan\u0131z, bir Ingress kayna\u011f\u0131na ihtiyac\u0131n\u0131z vard\u0131r. Bu dosya, trafi\u011fi Kubernetes Service&#8217;inize y\u00f6nlendirir.<\/p>\n<pre><code>\n# my-nodejs-app-chart\/templates\/ingress.yaml\n{{- if .Values.ingress.enabled -}}\napiVersion: networking.k8s.io\/v1\nkind: Ingress\nmetadata:\n  name: {{ include \"my-nodejs-app-chart.fullname\" . }}\n  labels:\n    {{- include \"my-nodejs-app-chart.labels\" . | nindent 4 }}\n  {{- with .Values.ingress.annotations }}\n  annotations:\n    {{- toYaml . | nindent 4 }}\n  {{- end }}\nspec:\n  {{- if .Values.ingress.className }}\n  ingressClassName: {{ .Values.ingress.className }}\n  {{- end }}\n  rules:\n    {{- range .Values.ingress.hosts }}\n    - host: {{ .host | quote }}\n      http:\n        paths:\n          {{- range .paths }}\n          - path: {{ .path }}\n            pathType: {{ .pathType }}\n            backend:\n              service:\n                name: {{ include \"my-nodejs-app-chart.fullname\" $ }}\n                port:\n                  number: {{ $.Values.service.port }}\n          {{- end }}\n    {{- end }}\n  {{- if .Values.ingress.tls }}\n  tls:\n    {{- toYaml .Values.ingress.tls | nindent 4 }}\n  {{- end }}\n{{- end }}\n\n<\/code><\/pre>\n<p>Ingress tan\u0131m\u0131, <span class=\"code-inline\">values.yaml<\/span>&#8216;deki <span class=\"code-inline\">ingress.enabled<\/span>, <span class=\"code-inline\">ingress.hosts<\/span> ve <span class=\"code-inline\">ingress.annotations<\/span> gibi de\u011ferleri kullanarak dinamik olarak olu\u015fturulur.<\/p>\n<h4><span class=\"code-inline\">hpa.yaml<\/span> (Horizontal Pod Autoscaler) Dosyas\u0131<\/h4>\n<p>Otomatik \u00f6l\u00e7eklendirme i\u00e7in <span class=\"code-inline\">HorizontalPodAutoscaler<\/span> (HPA) kayna\u011f\u0131n\u0131 tan\u0131mlaman\u0131z gerekir. Bu dosya, Node.js uygulaman\u0131z\u0131n CPU veya bellek kullan\u0131m\u0131na g\u00f6re pod say\u0131s\u0131n\u0131 otomatik olarak art\u0131r\u0131p azaltmas\u0131n\u0131 sa\u011flar.<\/p>\n<pre><code>\n# my-nodejs-app-chart\/templates\/hpa.yaml\n{{- if .Values.autoscaling.enabled }}\napiVersion: autoscaling\/v2\nkind: HorizontalPodAutoscaler\nmetadata:\n  name: {{ include \"my-nodejs-app-chart.fullname\" . }}\n  labels:\n    {{- include \"my-nodejs-app-chart.labels\" . | nindent 4 }}\nspec:\n  scaleTargetRef:\n    apiVersion: apps\/v1\n    kind: Deployment\n    name: {{ include \"my-nodejs-app-chart.fullname\" . }}\n  minReplicas: {{ .Values.autoscaling.minReplicas }}\n  maxReplicas: {{ .Values.autoscaling.maxReplicas }}\n  metrics:\n    - type: Resource\n      resource:\n        name: cpu\n        target:\n          type: Utilization\n          averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }}\n    # Bellek bazl\u0131 \u00f6l\u00e7eklendirme i\u00e7in a\u015fa\u011f\u0131daki b\u00f6l\u00fcm\u00fc etkinle\u015ftirebilirsiniz\n    # - type: Resource\n    #   resource:\n    #     name: memory\n    #     target:\n    #       type: Utilization\n    #       averageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }}\n{{- end }}\n\n<\/code><\/pre>\n<p>Bu HPA tan\u0131m\u0131, <span class=\"code-inline\">values.yaml<\/span>&#8216;deki <span class=\"code-inline\">autoscaling<\/span> ayarlar\u0131n\u0131 kullanarak uygulaman\u0131z\u0131n CPU kullan\u0131m\u0131na g\u00f6re otomatik olarak \u00f6l\u00e7eklenmesini sa\u011flar. \u00d6rne\u011fin, CPU kullan\u0131m\u0131 %70&#8217;i a\u015ft\u0131\u011f\u0131nda yeni pod&#8217;lar olu\u015fturulacak, alt\u0131na d\u00fc\u015ft\u00fc\u011f\u00fcnde ise mevcut pod&#8217;lar azalt\u0131lacakt\u0131r.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Helm chart&#8217;\u0131n\u0131zda <span class=\"code-inline\">_helpers.tpl<\/span> dosyas\u0131n\u0131 kullanarak tekrar eden kod bloklar\u0131n\u0131 (\u00f6rne\u011fin etiketler veya tam ad olu\u015fturma mant\u0131\u011f\u0131) merkezi hale getirebilirsiniz. Bu, chart&#8217;\u0131n\u0131z\u0131 daha okunabilir ve bak\u0131m\u0131 kolay hale getirir.\n<\/div>\n<p>Bu ad\u0131mlar\u0131 tamamlad\u0131\u011f\u0131n\u0131zda, Node.js uygulaman\u0131z\u0131 Kubernetes&#8217;e da\u011f\u0131tmak ve otomatik \u00f6l\u00e7eklendirme \u00f6zelliklerinden faydalanmak i\u00e7in tamamen yap\u0131land\u0131r\u0131lm\u0131\u015f bir Helm chart&#8217;\u0131n\u0131z olacakt\u0131r. Bir sonraki b\u00f6l\u00fcmde, bu chart&#8217;\u0131 kullanarak uygulaman\u0131z\u0131 Kubernetes k\u00fcmesine nas\u0131l da\u011f\u0131taca\u011f\u0131m\u0131z\u0131 ve \u00f6l\u00e7eklendirme mekanizmalar\u0131n\u0131 nas\u0131l etkinle\u015ftirece\u011fimizi g\u00f6rece\u011fiz.<\/p>\n<h2>Kubernetes&#8217;e Da\u011f\u0131t\u0131m ve \u00d6l\u00e7eklendirme Nas\u0131l Yap\u0131l\u0131r?<\/h2>\n<p>Helm chart&#8217;\u0131n\u0131z\u0131 Node.js uygulaman\u0131z i\u00e7in ba\u015far\u0131yla olu\u015fturdu\u011funuza g\u00f6re, art\u0131k bu chart&#8217;\u0131 Kubernetes k\u00fcmenize da\u011f\u0131tman\u0131n ve otomatik \u00f6l\u00e7eklendirme \u00f6zelliklerini etkinle\u015ftirmenin zaman\u0131 geldi. Bu b\u00f6l\u00fcm, uygulaman\u0131z\u0131 da\u011f\u0131t\u0131m, g\u00fcncelleme ve izleme ad\u0131mlar\u0131n\u0131 detayland\u0131rarak, Kubernetes&#8217;in sundu\u011fu g\u00fc\u00e7l\u00fc \u00f6l\u00e7eklendirme yeteneklerinden nas\u0131l faydalanaca\u011f\u0131n\u0131z\u0131 g\u00f6sterecektir.<\/p>\n<h3>Ad\u0131m 1: Docker \u0130maj\u0131n\u0131 Bir Kay\u0131t Defterine G\u00f6nderme (Push)<\/h3>\n<p>Kubernetes k\u00fcmeniz, uygulaman\u0131z\u0131n Docker imaj\u0131n\u0131 \u00e7ekebilmesi i\u00e7in bir Docker kay\u0131t defterine (Registry) eri\u015febilmelidir. Bu genellikle Docker Hub, Google Container Registry (GCR), Amazon Elastic Container Registry (ECR) veya Azure Container Registry (ACR) gibi herkese a\u00e7\u0131k veya \u00f6zel bir kay\u0131t defteri olabilir. Daha \u00f6nce olu\u015fturdu\u011funuz imaj\u0131 bu kay\u0131t defterine g\u00f6ndermelisiniz.<\/p>\n<pre><code>\n# Docker Hub'a giri\u015f yap\u0131n\ndocker login\n\n# \u0130maj\u0131n\u0131z\u0131 etiketleyin (tag)\ndocker tag my-nodejs-app:1.0 your-dockerhub-username\/my-nodejs-app:1.0\n\n# \u0130maj\u0131n\u0131z\u0131 kay\u0131t defterine g\u00f6nderin\ndocker push your-dockerhub-username\/my-nodejs-app:1.0\n\n<\/code><\/pre>\n<p>Kay\u0131t defteri yolunu ve imaj etiketini <span class=\"code-inline\">values.yaml<\/span> dosyan\u0131zda do\u011fru \u015fekilde belirtti\u011finizden emin olun.<\/p>\n<h3>Ad\u0131m 2: Helm Chart&#8217;\u0131 Kubernetes K\u00fcmesine Da\u011f\u0131tma<\/h3>\n<p>Helm chart&#8217;\u0131n\u0131z\u0131 da\u011f\u0131tmak i\u00e7in <span class=\"code-inline\">helm install<\/span> komutunu kullan\u0131r\u0131z. Bu komut, chart&#8217;\u0131 al\u0131r, <span class=\"code-inline\">values.yaml<\/span> dosyas\u0131ndaki de\u011ferlerle birle\u015ftirir ve ortaya \u00e7\u0131kan Kubernetes manifest dosyalar\u0131n\u0131 k\u00fcmenize uygular.<\/p>\n<pre><code>\nhelm install my-nodejs-app my-nodejs-app-chart\/\n\n<\/code><\/pre>\n<p>Burada <span class=\"code-inline\">my-nodejs-app<\/span>, da\u011f\u0131t\u0131m\u0131n\u0131z i\u00e7in bir &#8220;release&#8221; ad\u0131, <span class=\"code-inline\">my-nodejs-app-chart\/<\/span> ise chart&#8217;\u0131n\u0131z\u0131n bulundu\u011fu dizinin yoludur. Ba\u015far\u0131l\u0131 bir da\u011f\u0131t\u0131m\u0131n ard\u0131ndan, Helm size da\u011f\u0131t\u0131m hakk\u0131nda bilgiler g\u00f6sterecektir.<\/p>\n<p>Da\u011f\u0131t\u0131m\u0131n durumunu kontrol etmek i\u00e7in a\u015fa\u011f\u0131daki komutlar\u0131 kullanabilirsiniz:<\/p>\n<pre><code>\nkubectl get deployments\nkubectl get pods\nkubectl get services\nkubectl get ingress\n\n<\/code><\/pre>\n<p>Pod&#8217;lar\u0131n\u0131z\u0131n <span class=\"code-inline\">Running<\/span> durumunda oldu\u011fundan ve <span class=\"code-inline\">READY<\/span> s\u00fctununun do\u011fru de\u011ferleri g\u00f6sterdi\u011finden emin olun. E\u011fer bir Ingress kayna\u011f\u0131 yap\u0131land\u0131rd\u0131ysan\u0131z, <span class=\"code-inline\">kubectl get ingress<\/span> komutu size uygulaman\u0131z\u0131n d\u0131\u015f IP adresini veya DNS ad\u0131n\u0131 verecektir.<\/p>\n<h3>Ad\u0131m 3: Otomatik \u00d6l\u00e7eklendirme (Horizontal Pod Autoscaler &#8211; HPA)<\/h3>\n<p>Helm chart&#8217;\u0131n\u0131zda <span class=\"code-inline\">hpa.yaml<\/span> dosyas\u0131n\u0131 etkinle\u015ftirdiyseniz ve <span class=\"code-inline\">values.yaml<\/span>&#8216;de <span class=\"code-inline\">autoscaling.enabled: true<\/span> olarak ayarlad\u0131ysan\u0131z, uygulaman\u0131z otomatik olarak \u00f6l\u00e7eklenmeye ba\u015flayacakt\u0131r. HPA&#8217;n\u0131n durumunu kontrol etmek i\u00e7in:<\/p>\n<pre><code>\nkubectl get hpa\n\n<\/code><\/pre>\n<p>Bu komut, HPA&#8217;n\u0131z\u0131n hedefledi\u011fi CPU y\u00fczdesini, mevcut CPU kullan\u0131m\u0131n\u0131, minimum ve maksimum pod say\u0131s\u0131n\u0131 g\u00f6sterecektir. Uygulaman\u0131z\u0131n y\u00fck\u00fc artt\u0131\u011f\u0131nda, HPA otomatik olarak yeni pod&#8217;lar olu\u015fturacak ve <span class=\"code-inline\">maxReplicas<\/span> de\u011ferine kadar \u00f6l\u00e7eklenecektir. Y\u00fck azald\u0131\u011f\u0131nda ise pod say\u0131s\u0131 <span class=\"code-inline\">minReplicas<\/span> de\u011ferine kadar d\u00fc\u015f\u00fcr\u00fclecektir.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: HPA&#8217;n\u0131n do\u011fru \u00e7al\u0131\u015fabilmesi i\u00e7in pod&#8217;lar\u0131n\u0131zda CPU ve bellek kaynak istekleri (requests) ve limitleri (limits) tan\u0131mlaman\u0131z \u015fartt\u0131r. Bu tan\u0131mlar olmadan Kubernetes, pod&#8217;lar\u0131n\u0131z\u0131n kaynak kullan\u0131m\u0131n\u0131 do\u011fru bir \u015fekilde \u00f6l\u00e7emez ve HPA etkin bir \u015fekilde \u00e7al\u0131\u015famaz. <span class=\"code-inline\">values.yaml<\/span> dosyas\u0131ndaki <span class=\"code-inline\">resources<\/span> b\u00f6l\u00fcm\u00fcn\u00fc dikkatlice yap\u0131land\u0131r\u0131n.\n<\/div>\n<h3>Ad\u0131m 4: Uygulama G\u00fcncelleme ve Geri Alma (Rollback)<\/h3>\n<p>Uygulaman\u0131zda bir de\u011fi\u015fiklik yapt\u0131\u011f\u0131n\u0131zda (\u00f6rne\u011fin yeni bir kod s\u00fcr\u00fcm\u00fc veya yap\u0131land\u0131rma de\u011fi\u015fikli\u011fi), Helm ile kolayca g\u00fcncelleyebilirsiniz. Yeni Docker imaj\u0131n\u0131z\u0131 kay\u0131t defterine g\u00f6nderdikten sonra, <span class=\"code-inline\">values.yaml<\/span> dosyas\u0131ndaki <span class=\"code-inline\">image.tag<\/span> de\u011ferini g\u00fcncelleyin ve ard\u0131ndan <span class=\"code-inline\">helm upgrade<\/span> komutunu kullan\u0131n:<\/p>\n<pre><code>\n# values.yaml dosyas\u0131n\u0131 d\u00fczenleyin: image.tag: \"1.1\" (yeni s\u00fcr\u00fcm)\nhelm upgrade my-nodejs-app my-nodejs-app-chart\/\n\n<\/code><\/pre>\n<p>Helm, bu komutla yeni de\u011fi\u015fiklikleri g\u00fcvenli bir \u015fekilde k\u00fcmenize uygular (rolling update stratejisi kullanarak). E\u011fer bir sorunla kar\u015f\u0131la\u015f\u0131rsan\u0131z, \u00f6nceki s\u00fcr\u00fcme kolayca geri d\u00f6nebilirsiniz:<\/p>\n<pre><code>\nhelm history my-nodejs-app # Ge\u00e7mi\u015f s\u00fcr\u00fcmleri listeler\nhelm rollback my-nodejs-app [REV\u0130ZYON_NUMARASI] # Belirli bir revizyona geri d\u00f6ner\n\n<\/code><\/pre>\n<p>Bu yetenekler, \u00fcretim ortam\u0131nda g\u00fcvenli ve kontroll\u00fc da\u011f\u0131t\u0131mlar yapman\u0131z\u0131 sa\u011flar.<\/p>\n<h3>Ad\u0131m 5: Manuel \u00d6l\u00e7eklendirme (Gerekti\u011finde)<\/h3>\n<p>Otomatik \u00f6l\u00e7eklendirme genellikle tercih edilen y\u00f6ntem olsa da, baz\u0131 durumlarda anl\u0131k y\u00fck art\u0131\u015flar\u0131 i\u00e7in manuel olarak \u00f6l\u00e7eklendirme yapman\u0131z gerekebilir. <span class=\"code-inline\">kubectl scale<\/span> komutunu kullanarak bir Deployment&#8217;\u0131n replica say\u0131s\u0131n\u0131 manuel olarak de\u011fi\u015ftirebilirsiniz:<\/p>\n<pre><code>\nkubectl scale deployment\/my-nodejs-app-chart --replicas=5\n\n<\/code><\/pre>\n<p>Bu komut, <span class=\"code-inline\">my-nodejs-app-chart<\/span> adl\u0131 Deployment&#8217;\u0131n pod say\u0131s\u0131n\u0131 an\u0131nda 5&#8217;e \u00e7\u0131karacakt\u0131r. Ancak unutmay\u0131n ki HPA etkinse, manuel \u00f6l\u00e7eklendirme HPA&#8217;n\u0131n otomatik ayarlamalar\u0131yla \u00e7ak\u0131\u015fabilir. Genellikle HPA varken manuel m\u00fcdahaleden ka\u00e7\u0131n\u0131lmal\u0131d\u0131r.<\/p>\n<p>Node.js uygulaman\u0131z\u0131 Kubernetes&#8217;e Helm ile da\u011f\u0131tmak ve \u00f6l\u00e7eklendirmek, uygulaman\u0131z\u0131n performans\u0131n\u0131 ve eri\u015filebilirli\u011fini art\u0131rman\u0131n yan\u0131 s\u0131ra operasyonel y\u00fck\u00fc de \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r. Bu g\u00fc\u00e7l\u00fc kombinasyon sayesinde, uygulaman\u0131z\u0131n gelecekteki b\u00fcy\u00fcme ihtiya\u00e7lar\u0131na kolayca uyum sa\u011flayabilirsiniz.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Senaryolar\u0131nda Performans Optimizasyonu ve \u0130zleme \u0130pu\u00e7lar\u0131 Nelerdir?<\/h2>\n<p>Node.js uygulamalar\u0131n\u0131 Kubernetes ve Helm ile \u00f6l\u00e7eklendirmek, y\u00fcksek performans ve eri\u015filebilirlik sa\u011flaman\u0131n \u00f6nemli bir ad\u0131m\u0131d\u0131r. Ancak sadece da\u011f\u0131tmak yeterli de\u011fildir; ger\u00e7ek d\u00fcnya senaryolar\u0131nda uygulaman\u0131z\u0131n en iyi \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flamak i\u00e7in s\u00fcrekli optimizasyon ve dikkatli izleme stratejilerine ihtiyac\u0131n\u0131z vard\u0131r. Bu b\u00f6l\u00fcmde, performans optimizasyonu i\u00e7in ipu\u00e7lar\u0131n\u0131 ve etkili izleme yakla\u015f\u0131mlar\u0131n\u0131 inceleyece\u011fiz.<\/p>\n<h3>Kaynak Limitleri ve \u0130steklerini Do\u011fru Ayarlama<\/h3>\n<p>Kubernetes&#8217;te her pod i\u00e7in CPU ve bellek kaynak istekleri (requests) ve limitleri (limits) tan\u0131mlamak kritik \u00f6neme sahiptir. <span class=\"code-inline\">requests<\/span>, Kubernetes&#8217;in pod&#8217;u bir d\u00fc\u011f\u00fcme yerle\u015ftirirken (scheduling) garantilemesi gereken minimum kaynak miktar\u0131n\u0131 belirtir. <span class=\"code-inline\">limits<\/span> ise bir pod&#8217;un kullanabilece\u011fi maksimum kaynak miktar\u0131n\u0131 belirler. Bu de\u011ferler olmadan, pod&#8217;lar\u0131n\u0131z d\u00fc\u011f\u00fcm kaynaklar\u0131n\u0131 a\u015f\u0131r\u0131 kullanabilir ve di\u011fer pod&#8217;lar\u0131n performans\u0131n\u0131 etkileyebilir veya d\u00fc\u011f\u00fcm\u00fcn \u00e7\u00f6kmesine neden olabilir.<\/p>\n<pre><code>\n# values.yaml dosyas\u0131ndan \u00f6rnek\nresources:\n  limits:\n    cpu: 500m # 0.5 CPU \u00e7ekirde\u011fi (a\u015farsa k\u0131s\u0131tlan\u0131r)\n    memory: 512Mi # 512 Megabayt bellek (a\u015farsa sonland\u0131r\u0131l\u0131r)\n  requests:\n    cpu: 200m # 0.2 CPU \u00e7ekirde\u011fi (garanti edilen)\n    memory: 256Mi # 256 Megabayt bellek (garanti edilen)\n\n<\/code><\/pre>\n<p>Node.js uygulamalar\u0131 genellikle CPU yerine I\/O yo\u011fun olabilir. Bu nedenle, uygulaman\u0131z\u0131n ger\u00e7ek d\u00fcnya y\u00fck\u00fc alt\u0131nda ne kadar CPU ve bellek t\u00fcketti\u011fini izleyerek bu de\u011ferleri hassas bir \u015fekilde ayarlamak \u00f6nemlidir. Yanl\u0131\u015f ayarlar, gereksiz yere kaynak israf\u0131na veya performans darbo\u011fazlar\u0131na yol a\u00e7abilir.<\/p>\n<h3>Liveness ve Readiness Problar\u0131 ile Sa\u011fl\u0131k Kontrol\u00fc<\/h3>\n<p>Kubernetes, pod&#8217;lar\u0131n\u0131z\u0131n sa\u011fl\u0131\u011f\u0131n\u0131 izlemek i\u00e7in <span class=\"code-inline\">livenessProbe<\/span> ve <span class=\"code-inline\">readinessProbe<\/span> ad\u0131 verilen mekanizmalar sunar. Bu problar\u0131 do\u011fru yap\u0131land\u0131rmak, uygulaman\u0131z\u0131n kararl\u0131l\u0131\u011f\u0131 i\u00e7in hayati \u00f6neme sahiptir:<\/p>\n<ul>\n<li><strong>Liveness Probe:<\/strong> Bir kapsay\u0131c\u0131n\u0131n \u00e7al\u0131\u015f\u0131r durumda olup olmad\u0131\u011f\u0131n\u0131 kontrol eder. E\u011fer probe ba\u015far\u0131s\u0131z olursa, Kubernetes kapsay\u0131c\u0131y\u0131 yeniden ba\u015flat\u0131r. Node.js uygulaman\u0131zda, bu genellikle uygulaman\u0131n ana sunucusunun hala yan\u0131t verip vermedi\u011fini kontrol eden bir HTTP endpoint&#8217;i (<span class=\"code-inline\">\/healthz<\/span> gibi) olabilir.<\/li>\n<li><strong>Readiness Probe:<\/strong> Bir kapsay\u0131c\u0131n\u0131n trafi\u011fi kabul etmeye haz\u0131r olup olmad\u0131\u011f\u0131n\u0131 kontrol eder. E\u011fer probe ba\u015far\u0131s\u0131z olursa, Kubernetes bu kapsay\u0131c\u0131ya trafik y\u00f6nlendirmeyi durdurur ve haz\u0131r hale gelene kadar bekler. Bu, uygulaman\u0131z\u0131n ba\u015flatma s\u0131ras\u0131nda veritaban\u0131 ba\u011flant\u0131s\u0131 kurmas\u0131 veya \u00f6nbelle\u011fi doldurmas\u0131 gibi uzun s\u00fcren i\u015flemler i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<\/li>\n<\/ul>\n<pre><code>\n# deployment.yaml dosyas\u0131ndan \u00f6rnek\nlivenessProbe:\n  httpGet:\n    path: \/healthz\n    port: http\n  initialDelaySeconds: 5 # Kapsay\u0131c\u0131 ba\u015flad\u0131ktan sonra ilk kontrol i\u00e7in bekleme s\u00fcresi\n  periodSeconds: 10 # Kontroller aras\u0131ndaki s\u00fcre\n  timeoutSeconds: 3 # Kontrol\u00fcn zaman a\u015f\u0131m\u0131 s\u00fcresi\n  failureThreshold: 3 # Ka\u00e7 ba\u015far\u0131s\u0131zl\u0131ktan sonra yeniden ba\u015flat\u0131laca\u011f\u0131\nreadinessProbe:\n  httpGet:\n    path: \/ready\n    port: http\n  initialDelaySeconds: 5\n  periodSeconds: 5\n  timeoutSeconds: 3\n  failureThreshold: 1\n\n<\/code><\/pre>\n<p>Bu problar\u0131 dikkatlice yap\u0131land\u0131rmak, uygulaman\u0131z\u0131n sadece \u00e7al\u0131\u015f\u0131r durumda olmas\u0131n\u0131 de\u011fil, ayn\u0131 zamanda sa\u011fl\u0131kl\u0131 bir \u015fekilde hizmet vermesini de sa\u011flar.<\/p>\n<h3>\u0130zleme ve G\u00fcnl\u00fck Kayd\u0131 (Monitoring &#038; Logging)<\/h3>\n<p>Uygulaman\u0131z\u0131n performans\u0131n\u0131 ve sa\u011fl\u0131\u011f\u0131n\u0131 s\u00fcrekli olarak izlemek, potansiyel sorunlar\u0131 proaktif bir \u015fekilde tespit etmek i\u00e7in vazge\u00e7ilmezdir. Kubernetes ekosisteminde pop\u00fcler izleme ara\u00e7lar\u0131 \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Prometheus:<\/strong> Metrik toplama ve depolama i\u00e7in kullan\u0131lan a\u00e7\u0131k kaynakl\u0131 bir sistemdir. Node.js uygulaman\u0131zdan \u00f6zel metrikler (\u00f6rne\u011fin istek say\u0131s\u0131, yan\u0131t s\u00fcreleri, hata oranlar\u0131) toplayabilir.<\/li>\n<li><strong>Grafana:<\/strong> Prometheus ile toplanan metrikleri g\u00f6rselle\u015ftirmek i\u00e7in kullan\u0131l\u0131r. \u00d6zelle\u015ftirilebilir panolar arac\u0131l\u0131\u011f\u0131yla uygulaman\u0131z\u0131n performans\u0131n\u0131 anl\u0131k olarak takip edebilirsiniz.<\/li>\n<\/ul>\n<p>G\u00fcnl\u00fck kayd\u0131 (logging) ise, uygulaman\u0131z\u0131n i\u00e7 i\u015fleyi\u015fini anlamak ve sorunlar\u0131 ay\u0131klamak i\u00e7in kritik \u00f6neme sahiptir. Node.js uygulaman\u0131z\u0131n standart \u00e7\u0131kt\u0131ya (stdout) ve standart hataya (stderr) g\u00fcnl\u00fck yazmas\u0131n\u0131 sa\u011flamal\u0131s\u0131n\u0131z. Kubernetes, bu g\u00fcnl\u00fckleri otomatik olarak toplar. Bu g\u00fcnl\u00fckleri merkezi bir yerde toplamak ve analiz etmek i\u00e7in ELK Stack (Elasticsearch, Logstash, Kibana) veya Loki gibi \u00e7\u00f6z\u00fcmleri kullanabilirsiniz.<\/p>\n<h3>Frontend ve Kullan\u0131c\u0131 Deneyimi Optimizasyonu (Mobil Uyumluluk)<\/h3>\n<p>Bir Node.js uygulamas\u0131n\u0131n backend&#8217;ini Kubernetes ile \u00f6l\u00e7eklendirmek, uygulaman\u0131n genel performans\u0131n\u0131n sadece bir par\u00e7as\u0131d\u0131r. Kullan\u0131c\u0131 deneyimi, frontend&#8217;in h\u0131z\u0131 ve duyarl\u0131l\u0131\u011f\u0131 ile de yak\u0131ndan ilgilidir. Uygulaman\u0131z\u0131n y\u00fcksek performansl\u0131 bir backend&#8217;e sahip olmas\u0131, frontend&#8217;in farkl\u0131 cihazlarda (masa\u00fcst\u00fc, tablet, mobil) sorunsuz \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flamaz.<\/p>\n<p><strong>Mobil uyumluluk ve duyarl\u0131 tasar\u0131m (responsive design)<\/strong>, g\u00fcn\u00fcm\u00fcz web uygulamalar\u0131 i\u00e7in bir zorunluluktur. Kullan\u0131c\u0131lar\u0131n b\u00fcy\u00fck bir k\u0131sm\u0131 mobil cihazlardan eri\u015fim sa\u011flad\u0131\u011f\u0131 i\u00e7in, uygulaman\u0131z\u0131n ekran boyutuna ve cihaz \u00f6zelliklerine g\u00f6re kendini otomatik olarak ayarlamas\u0131 gerekir. Bu, CSS <span class=\"code-inline\">media queries<\/span> gibi tekniklerle sa\u011flan\u0131r:<\/p>\n<pre><code>\n\/* \u00d6rnek bir media query kullan\u0131m\u0131 *\/\n@media screen and (max-width: 768px) {\n  .container {\n    width: 100%;\n    padding: 15px;\n  }\n  .sidebar {\n    display: none; \/* Mobil cihazlarda kenar \u00e7ubu\u011funu gizle *\/\n  }\n}\n\n<\/code><\/pre>\n<p>Bu t\u00fcr <span class=\"code-inline\">media queries<\/span>, taray\u0131c\u0131n\u0131n geni\u015fli\u011fine g\u00f6re farkl\u0131 stil kurallar\u0131n\u0131n uygulanmas\u0131n\u0131 sa\u011flar. Node.js backend&#8217;iniz ne kadar h\u0131zl\u0131 olursa olsun, e\u011fer frontend&#8217;iniz mobil cihazlarda yava\u015f y\u00fckleniyor veya k\u00f6t\u00fc g\u00f6r\u00fcn\u00fcyor ise, kullan\u0131c\u0131 deneyimi olumsuz etkilenecektir. Dolay\u0131s\u0131yla, backend \u00f6l\u00e7eklendirme \u00e7abalar\u0131n\u0131z\u0131, frontend optimizasyonlar\u0131 ve duyarl\u0131 tasar\u0131m prensipleriyle desteklemek b\u00fct\u00fcnsel bir yakla\u015f\u0131m sunar.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Node.js uygulaman\u0131zda \u00f6nbellekleme (caching) stratejilerini uygulay\u0131n. Redis veya Memcached gibi in-memory veritabanlar\u0131n\u0131 kullanarak s\u0131k eri\u015filen verileri \u00f6nbelle\u011fe almak, veritaban\u0131 y\u00fck\u00fcn\u00fc azalt\u0131r ve yan\u0131t s\u00fcrelerini \u00f6nemli \u00f6l\u00e7\u00fcde h\u0131zland\u0131r\u0131r. Bu da HPA&#8217;n\u0131n tetiklenme s\u0131kl\u0131\u011f\u0131n\u0131 azaltarak maliyet optimizasyonuna katk\u0131da bulunabilir.\n<\/div>\n<p>Ger\u00e7ek d\u00fcnya senaryolar\u0131nda Node.js uygulamalar\u0131n\u0131z\u0131n Kubernetes \u00fczerinde ba\u015far\u0131l\u0131 bir \u015fekilde \u00f6l\u00e7eklenmesi ve \u00e7al\u0131\u015fmas\u0131 i\u00e7in bu optimizasyon ve izleme ipu\u00e7lar\u0131n\u0131 uygulamak kritik \u00f6neme sahiptir. S\u00fcrekli iyile\u015ftirme ve proaktif y\u00f6netim, uygulaman\u0131z\u0131n her zaman en iyi performans\u0131 sunmas\u0131n\u0131 sa\u011flar.<\/p>\n<h2>Sonu\u00e7: Node.js Uygulamalar\u0131n\u0131z \u0130\u00e7in \u00d6l\u00e7eklenebilir Bir Gelecek<\/h2>\n<p>Bu makale boyunca, Node.js uygulamalar\u0131n\u0131z\u0131 Kubernetes ve Helm kullanarak nas\u0131l \u00f6l\u00e7eklendirebilece\u011finizi ad\u0131m ad\u0131m inceledik. Modern web d\u00fcnyas\u0131nda, de\u011fi\u015fen kullan\u0131c\u0131 taleplerine h\u0131zl\u0131 ve esnek bir \u015fekilde yan\u0131t verebilmek, bir uygulaman\u0131n ba\u015far\u0131s\u0131 i\u00e7in temel bir gerekliliktir. Node.js&#8217;in performans potansiyelini Kubernetes&#8217;in g\u00fc\u00e7l\u00fc kapsay\u0131c\u0131 d\u00fczenleme yetenekleri ve Helm&#8217;in da\u011f\u0131t\u0131m kolayl\u0131\u011f\u0131yla birle\u015ftirmek, bu ihtiyac\u0131 kar\u015f\u0131laman\u0131n en etkili yollar\u0131ndan biridir.<\/p>\n<p>Ba\u015flang\u0131\u00e7ta, Node.js uygulaman\u0131z\u0131 Docker kapsay\u0131c\u0131s\u0131na d\u00f6n\u00fc\u015ft\u00fcrerek ta\u015f\u0131nabilir ve tutarl\u0131 bir \u00e7al\u0131\u015fma ortam\u0131 sa\u011flad\u0131k. Ard\u0131ndan, Helm&#8217;in sundu\u011fu &#8220;chart&#8221; yap\u0131s\u0131 ile uygulaman\u0131z\u0131n t\u00fcm Kubernetes kaynaklar\u0131n\u0131 (Deployment, Service, Ingress, HPA) tek bir paket halinde nas\u0131l tan\u0131mlayaca\u011f\u0131m\u0131z\u0131 ve yap\u0131land\u0131raca\u011f\u0131m\u0131z\u0131 \u00f6\u011frendik. \u00d6zellikle <span class=\"code-inline\">values.yaml<\/span> dosyas\u0131n\u0131n esnekli\u011fi sayesinde, farkl\u0131 ortamlar i\u00e7in kolayca \u00f6zelle\u015ftirilebilir da\u011f\u0131t\u0131mlar olu\u015fturabildik. Son olarak, uygulaman\u0131z\u0131 Kubernetes k\u00fcmesine da\u011f\u0131tma, otomatik \u00f6l\u00e7eklendirme (HPA) mekanizmalar\u0131n\u0131 etkinle\u015ftirme ve performans optimizasyonu ile izleme i\u00e7in kritik ipu\u00e7lar\u0131n\u0131 ele ald\u0131k. Bu s\u00fcre\u00e7, uygulaman\u0131z\u0131n yaln\u0131zca anl\u0131k y\u00fckleri y\u00f6netmesini sa\u011flamakla kalmaz, ayn\u0131 zamanda gelecekteki b\u00fcy\u00fcme ve de\u011fi\u015fikliklere de kolayca uyum sa\u011flamas\u0131na olanak tan\u0131r.<\/p>\n<p>Unutmay\u0131n ki teknoloji s\u00fcrekli geli\u015fiyor ve en iyi uygulamalar zamanla de\u011fi\u015febilir. Bu nedenle, Kubernetes ve Helm ekosistemindeki yenilikleri takip etmek, uygulaman\u0131z\u0131n performans\u0131n\u0131 ve g\u00fcvenli\u011fini s\u00fcrekli olarak iyile\u015ftirmek i\u00e7in \u00f6nemlidir. Kaynak limitlerini ve isteklerini do\u011fru ayarlamak, liveness ve readiness problar\u0131 ile sa\u011fl\u0131k kontrollerini titizlikle yap\u0131land\u0131rmak, Prometheus ve Grafana gibi ara\u00e7larla s\u00fcrekli izleme yapmak ve merkezi g\u00fcnl\u00fck kayd\u0131 sistemleri kullanmak, uygulaman\u0131z\u0131n istikrarl\u0131 ve y\u00fcksek performansl\u0131 \u00e7al\u0131\u015fmas\u0131n\u0131 garanti alt\u0131na alacakt\u0131r. Node.js uygulamalar\u0131n\u0131z\u0131 Kubernetes ve Helm ile \u00f6l\u00e7eklendirmek, yaln\u0131zca teknik bir ba\u015far\u0131 de\u011fil, ayn\u0131 zamanda i\u015f s\u00fcreklili\u011fi ve m\u00fc\u015fteri memnuniyeti a\u00e7\u0131s\u0131ndan da stratejik bir yat\u0131r\u0131md\u0131r. Bu g\u00fc\u00e7l\u00fc kombinasyonla, uygulamalar\u0131n\u0131z\u0131n gelece\u011fe haz\u0131r oldu\u011fundan emin olabilirsiniz.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<ol>\n<li>\n        <strong>Kubernetes&#8217;te Node.js uygulamalar\u0131 i\u00e7in neden Helm kullanmal\u0131y\u0131m?<\/strong><\/p>\n<p>Helm, Kubernetes uygulamalar\u0131n\u0131 paketlemek, da\u011f\u0131tmak ve y\u00f6netmek i\u00e7in bir paket y\u00f6neticisidir. Node.js uygulaman\u0131z i\u00e7in bir Helm chart olu\u015fturmak, Kubernetes kaynaklar\u0131n\u0131 (Deployment, Service, Ingress, HPA) tek bir \u015fablon seti halinde birle\u015ftirir. Bu, da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini basitle\u015ftirir, tekrarlanabilirli\u011fi art\u0131r\u0131r, yap\u0131land\u0131rma y\u00f6netimini kolayla\u015ft\u0131r\u0131r ve s\u00fcr\u00fcm kontrol\u00fc ile geri alma (rollback) yetenekleri sunar. \u00d6zellikle karma\u015f\u0131k uygulamalar ve CI\/CD s\u00fcre\u00e7leri i\u00e7in vazge\u00e7ilmezdir.<\/p>\n<\/li>\n<li>\n        <strong>Horizontal Pod Autoscaler (HPA) ve Vertical Pod Autoscaler (VPA) aras\u0131ndaki fark nedir?<\/strong><\/p>\n<p>HPA (Horizontal Pod Autoscaler), pod&#8217;lar\u0131n CPU veya bellek kullan\u0131m\u0131na (veya \u00f6zel metriklere) g\u00f6re otomatik olarak yeni pod&#8217;lar ekleyerek veya mevcut pod&#8217;lar\u0131 azaltarak yatay \u00f6l\u00e7eklendirme yapar. VPA (Vertical Pod Autoscaler) ise, mevcut pod&#8217;lar\u0131n CPU ve bellek kaynak isteklerini (requests) ve limitlerini (limits) otomatik olarak ayarlayarak dikey \u00f6l\u00e7eklendirme yapar. HPA, de\u011fi\u015fen trafi\u011fe yan\u0131t verirken, VPA kaynak optimizasyonuna odaklan\u0131r. Genellikle HPA ve VPA birlikte kullan\u0131lmaz, \u00e7\u00fcnk\u00fc VPA&#8217;n\u0131n yapt\u0131\u011f\u0131 de\u011fi\u015fiklikler HPA&#8217;n\u0131n hesaplamalar\u0131n\u0131 etkileyebilir. \u00c7o\u011fu senaryoda HPA tercih edilir.<\/p>\n<\/li>\n<li>\n        <strong>Node.js uygulamam i\u00e7in Docker imaj\u0131 olu\u015ftururken nelere dikkat etmeliyim?<\/strong><\/p>\n<p>Docker imaj\u0131 olu\u015ftururken \u015funlara dikkat etmelisiniz: K\u00fc\u00e7\u00fck boyutlu bir temel imaj kullan\u0131n (\u00f6rne\u011fin <span class=\"code-inline\">node:18-alpine<\/span>). <span class=\"code-inline\">.dockerignore<\/span> dosyas\u0131n\u0131 kullanarak gereksiz dosyalar\u0131n (\u00f6rne\u011fin <span class=\"code-inline\">node_modules<\/span>, <span class=\"code-inline\">.git<\/span>) imaja dahil edilmesini engelleyin. Ba\u011f\u0131ml\u0131l\u0131klar\u0131 ayr\u0131 bir katmanda y\u00fckleyin (<span class=\"code-inline\">COPY package*.json &#038;&#038; npm install<\/span>), bu katman \u00f6nbelleklemesini optimize eder. Yaln\u0131zca \u00fcretim ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00fckleyin (<span class=\"code-inline\">npm install &#8211;production<\/span>). Son olarak, g\u00fcvenlik i\u00e7in root olmayan bir kullan\u0131c\u0131yla \u00e7al\u0131\u015ft\u0131r\u0131n ve multi-stage build kullanarak nihai imaj\u0131n boyutunu k\u00fc\u00e7\u00fclt\u00fcn.<\/p>\n<\/li>\n<li>\n        <strong>Kubernetes&#8217;te Node.js uygulamas\u0131n\u0131n performans\u0131n\u0131 nas\u0131l izleyebilirim?<\/strong><\/p>\n<p>Node.js uygulaman\u0131z\u0131n performans\u0131n\u0131 izlemek i\u00e7in Prometheus ve Grafana gibi ara\u00e7lar\u0131 kullanabilirsiniz. Uygulaman\u0131zdan CPU, bellek kullan\u0131m\u0131, istek say\u0131s\u0131, yan\u0131t s\u00fcreleri ve hata oranlar\u0131 gibi metrikleri toplayarak Prometheus&#8217;a g\u00f6nderebilirsiniz. Grafana ile bu metrikleri g\u00f6rselle\u015ftiren \u00f6zelle\u015ftirilebilir panolar olu\u015fturarak uygulaman\u0131z\u0131n sa\u011fl\u0131\u011f\u0131n\u0131 ve performans\u0131n\u0131 anl\u0131k olarak takip edebilirsiniz. Ayr\u0131ca, uygulaman\u0131z\u0131n g\u00fcnl\u00fcklerini merkezi bir g\u00fcnl\u00fck kayd\u0131 sisteminde (ELK Stack, Loki) toplayarak sorunlar\u0131 ay\u0131klayabilir ve davran\u0131\u015f analizleri yapabilirsiniz.<\/p>\n<\/li>\n<li>\n        <strong>Node.js uygulamamda neden liveness ve readiness problar\u0131 kullanmal\u0131y\u0131m?<\/strong><\/p>\n<p>Liveness ve readiness problar\u0131, Kubernetes&#8217;in pod&#8217;lar\u0131n\u0131z\u0131n sa\u011fl\u0131\u011f\u0131n\u0131 ve trafi\u011fi kabul etmeye haz\u0131r olup olmad\u0131\u011f\u0131n\u0131 anlamas\u0131 i\u00e7in kritik \u00f6neme sahiptir. Liveness probe, uygulaman\u0131z\u0131n hala \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olur ve ba\u015far\u0131s\u0131z olursa pod&#8217;u yeniden ba\u015flat\u0131r. Readiness probe ise, uygulaman\u0131z\u0131n trafi\u011fi i\u015flemeye haz\u0131r oldu\u011funu bildirir; bu sayede Kubernetes, uygulaman\u0131z\u0131n ba\u015flatma veya kendini iyile\u015ftirme a\u015famas\u0131nda oldu\u011fu durumlarda ona trafik y\u00f6nlendirmez. Bu problar, uygulaman\u0131z\u0131n y\u00fcksek eri\u015filebilirli\u011fini ve kararl\u0131l\u0131\u011f\u0131n\u0131 sa\u011flamak i\u00e7in vazge\u00e7ilmezdir.<\/p>\n<\/li>\n<\/ol>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Node.js Uygulamalar\u0131n\u0131 Kubernetes ve Helm ile Nas\u0131l \u00d6l\u00e7eklendirirsiniz? Modern web uygulamalar\u0131 geli\u015ftirirken kar\u015f\u0131la\u015f\u0131lan en b\u00fcy\u00fck zorluklardan biri, de\u011fi\u015fen&hellip;","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":[136],"tags":[],"class_list":{"0":"post-38727","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-node-js","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>Node.js Uygulama \u00d6l\u00e7eklendirme Neden Bu Kadar \u00d6nemli?<\/title>\n<meta name=\"description\" content=\"Modern web uygulamalar\u0131 geli\u015ftirirken kar\u015f\u0131la\u015f\u0131lan en b\u00fcy\u00fck zorluklardan biri, de\u011fi\u015fen kullan\u0131c\u0131 trafi\u011fine g\u00f6re uygulaman\u0131n performans\u0131n\u0131 ve eri\u015filebilirli\u011fini korumakt\u0131r. Node.js tabanl\u0131 uygulamalar\u0131n\u0131z\u0131n y\u00fcksek talepleri kar\u015f\u0131layabilmesi ve maliyet etkin bir \u015fekilde \u00e7al\u0131\u015fabilmesi i\u00e7in do\u011fru \u00f6l\u00e7eklendirme stratejilerine ihtiyac\u0131n\u0131z var. Peki, Node.js uygulamalar\u0131n\u0131z\u0131 Kubernetes&#039;in g\u00fcc\u00fc ve Helm&#039;in kolayl\u0131\u011f\u0131yla nas\u0131l otomatik olarak \u00f6l\u00e7eklendirebilirsiniz? Bu makale, bu karma\u015f\u0131k s\u00fcreci ad\u0131m ad\u0131m a\u00e7\u0131klayarak, uygulaman\u0131z\u0131n her zaman en iyi performans\u0131 sunmas\u0131n\u0131 sa\u011flaman\u0131za yard\u0131mc\u0131 olacak.\" \/>\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\/node-js-uygulama-olceklendirme-neden-bu-kadar-onemli\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Node.js Uygulama \u00d6l\u00e7eklendirme Neden Bu Kadar \u00d6nemli?\" \/>\n<meta property=\"og:description\" content=\"Modern web uygulamalar\u0131 geli\u015ftirirken kar\u015f\u0131la\u015f\u0131lan en b\u00fcy\u00fck zorluklardan biri, de\u011fi\u015fen kullan\u0131c\u0131 trafi\u011fine g\u00f6re uygulaman\u0131n performans\u0131n\u0131 ve eri\u015filebilirli\u011fini korumakt\u0131r. Node.js tabanl\u0131 uygulamalar\u0131n\u0131z\u0131n y\u00fcksek talepleri kar\u015f\u0131layabilmesi ve maliyet etkin bir \u015fekilde \u00e7al\u0131\u015fabilmesi i\u00e7in do\u011fru \u00f6l\u00e7eklendirme stratejilerine ihtiyac\u0131n\u0131z var. Peki, Node.js uygulamalar\u0131n\u0131z\u0131 Kubernetes&#039;in g\u00fcc\u00fc ve Helm&#039;in kolayl\u0131\u011f\u0131yla nas\u0131l otomatik olarak \u00f6l\u00e7eklendirebilirsiniz? Bu makale, bu karma\u015f\u0131k s\u00fcreci ad\u0131m ad\u0131m a\u00e7\u0131klayarak, uygulaman\u0131z\u0131n her zaman en iyi performans\u0131 sunmas\u0131n\u0131 sa\u011flaman\u0131za yard\u0131mc\u0131 olacak.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulama-olceklendirme-neden-bu-kadar-onemli\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-06T09:23:31+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=\"34 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulama-olceklendirme-neden-bu-kadar-onemli\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulama-olceklendirme-neden-bu-kadar-onemli\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Node.js Uygulama \u00d6l\u00e7eklendirme Neden Bu Kadar \u00d6nemli?\",\"datePublished\":\"2026-02-06T09:23:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulama-olceklendirme-neden-bu-kadar-onemli\/\"},\"wordCount\":5818,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Node.js\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulama-olceklendirme-neden-bu-kadar-onemli\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulama-olceklendirme-neden-bu-kadar-onemli\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulama-olceklendirme-neden-bu-kadar-onemli\/\",\"name\":\"Node.js Uygulama \u00d6l\u00e7eklendirme Neden Bu Kadar \u00d6nemli?\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-02-06T09:23:31+00:00\",\"description\":\"Modern web uygulamalar\u0131 geli\u015ftirirken kar\u015f\u0131la\u015f\u0131lan en b\u00fcy\u00fck zorluklardan biri, de\u011fi\u015fen kullan\u0131c\u0131 trafi\u011fine g\u00f6re uygulaman\u0131n performans\u0131n\u0131 ve eri\u015filebilirli\u011fini korumakt\u0131r. Node.js tabanl\u0131 uygulamalar\u0131n\u0131z\u0131n y\u00fcksek talepleri kar\u015f\u0131layabilmesi ve maliyet etkin bir \u015fekilde \u00e7al\u0131\u015fabilmesi i\u00e7in do\u011fru \u00f6l\u00e7eklendirme stratejilerine ihtiyac\u0131n\u0131z var. Peki, Node.js uygulamalar\u0131n\u0131z\u0131 Kubernetes'in g\u00fcc\u00fc ve Helm'in kolayl\u0131\u011f\u0131yla nas\u0131l otomatik olarak \u00f6l\u00e7eklendirebilirsiniz? Bu makale, bu karma\u015f\u0131k s\u00fcreci ad\u0131m ad\u0131m a\u00e7\u0131klayarak, uygulaman\u0131z\u0131n her zaman en iyi performans\u0131 sunmas\u0131n\u0131 sa\u011flaman\u0131za yard\u0131mc\u0131 olacak.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulama-olceklendirme-neden-bu-kadar-onemli\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulama-olceklendirme-neden-bu-kadar-onemli\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-uygulama-olceklendirme-neden-bu-kadar-onemli\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Node.js Uygulama \u00d6l\u00e7eklendirme Neden Bu Kadar \u00d6nemli?\"}]},{\"@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":"Node.js Uygulama \u00d6l\u00e7eklendirme Neden Bu Kadar \u00d6nemli?","description":"Modern web uygulamalar\u0131 geli\u015ftirirken kar\u015f\u0131la\u015f\u0131lan en b\u00fcy\u00fck zorluklardan biri, de\u011fi\u015fen kullan\u0131c\u0131 trafi\u011fine g\u00f6re uygulaman\u0131n performans\u0131n\u0131 ve eri\u015filebilirli\u011fini korumakt\u0131r. Node.js tabanl\u0131 uygulamalar\u0131n\u0131z\u0131n y\u00fcksek talepleri kar\u015f\u0131layabilmesi ve maliyet etkin bir \u015fekilde \u00e7al\u0131\u015fabilmesi i\u00e7in do\u011fru \u00f6l\u00e7eklendirme stratejilerine ihtiyac\u0131n\u0131z var. Peki, Node.js uygulamalar\u0131n\u0131z\u0131 Kubernetes'in g\u00fcc\u00fc ve Helm'in kolayl\u0131\u011f\u0131yla nas\u0131l otomatik olarak \u00f6l\u00e7eklendirebilirsiniz? Bu makale, bu karma\u015f\u0131k s\u00fcreci ad\u0131m ad\u0131m a\u00e7\u0131klayarak, uygulaman\u0131z\u0131n her zaman en iyi performans\u0131 sunmas\u0131n\u0131 sa\u011flaman\u0131za yard\u0131mc\u0131 olacak.","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\/node-js-uygulama-olceklendirme-neden-bu-kadar-onemli\/","og_locale":"tr_TR","og_type":"article","og_title":"Node.js Uygulama \u00d6l\u00e7eklendirme Neden Bu Kadar \u00d6nemli?","og_description":"Modern web uygulamalar\u0131 geli\u015ftirirken kar\u015f\u0131la\u015f\u0131lan en b\u00fcy\u00fck zorluklardan biri, de\u011fi\u015fen kullan\u0131c\u0131 trafi\u011fine g\u00f6re uygulaman\u0131n performans\u0131n\u0131 ve eri\u015filebilirli\u011fini korumakt\u0131r. Node.js tabanl\u0131 uygulamalar\u0131n\u0131z\u0131n y\u00fcksek talepleri kar\u015f\u0131layabilmesi ve maliyet etkin bir \u015fekilde \u00e7al\u0131\u015fabilmesi i\u00e7in do\u011fru \u00f6l\u00e7eklendirme stratejilerine ihtiyac\u0131n\u0131z var. Peki, Node.js uygulamalar\u0131n\u0131z\u0131 Kubernetes'in g\u00fcc\u00fc ve Helm'in kolayl\u0131\u011f\u0131yla nas\u0131l otomatik olarak \u00f6l\u00e7eklendirebilirsiniz? Bu makale, bu karma\u015f\u0131k s\u00fcreci ad\u0131m ad\u0131m a\u00e7\u0131klayarak, uygulaman\u0131z\u0131n her zaman en iyi performans\u0131 sunmas\u0131n\u0131 sa\u011flaman\u0131za yard\u0131mc\u0131 olacak.","og_url":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulama-olceklendirme-neden-bu-kadar-onemli\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-02-06T09:23:31+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"34 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulama-olceklendirme-neden-bu-kadar-onemli\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulama-olceklendirme-neden-bu-kadar-onemli\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Node.js Uygulama \u00d6l\u00e7eklendirme Neden Bu Kadar \u00d6nemli?","datePublished":"2026-02-06T09:23:31+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulama-olceklendirme-neden-bu-kadar-onemli\/"},"wordCount":5818,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Node.js"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/node-js-uygulama-olceklendirme-neden-bu-kadar-onemli\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulama-olceklendirme-neden-bu-kadar-onemli\/","url":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulama-olceklendirme-neden-bu-kadar-onemli\/","name":"Node.js Uygulama \u00d6l\u00e7eklendirme Neden Bu Kadar \u00d6nemli?","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-02-06T09:23:31+00:00","description":"Modern web uygulamalar\u0131 geli\u015ftirirken kar\u015f\u0131la\u015f\u0131lan en b\u00fcy\u00fck zorluklardan biri, de\u011fi\u015fen kullan\u0131c\u0131 trafi\u011fine g\u00f6re uygulaman\u0131n performans\u0131n\u0131 ve eri\u015filebilirli\u011fini korumakt\u0131r. Node.js tabanl\u0131 uygulamalar\u0131n\u0131z\u0131n y\u00fcksek talepleri kar\u015f\u0131layabilmesi ve maliyet etkin bir \u015fekilde \u00e7al\u0131\u015fabilmesi i\u00e7in do\u011fru \u00f6l\u00e7eklendirme stratejilerine ihtiyac\u0131n\u0131z var. Peki, Node.js uygulamalar\u0131n\u0131z\u0131 Kubernetes'in g\u00fcc\u00fc ve Helm'in kolayl\u0131\u011f\u0131yla nas\u0131l otomatik olarak \u00f6l\u00e7eklendirebilirsiniz? Bu makale, bu karma\u015f\u0131k s\u00fcreci ad\u0131m ad\u0131m a\u00e7\u0131klayarak, uygulaman\u0131z\u0131n her zaman en iyi performans\u0131 sunmas\u0131n\u0131 sa\u011flaman\u0131za yard\u0131mc\u0131 olacak.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulama-olceklendirme-neden-bu-kadar-onemli\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/node-js-uygulama-olceklendirme-neden-bu-kadar-onemli\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-uygulama-olceklendirme-neden-bu-kadar-onemli\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Node.js Uygulama \u00d6l\u00e7eklendirme Neden Bu Kadar \u00d6nemli?"}]},{"@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\/38727","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=38727"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38727\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=38727"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=38727"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=38727"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}