{"id":31304,"date":"2025-10-08T12:02:25","date_gmt":"2025-10-08T09:02:25","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/azure-kubernetes-service-akse-azure-pipelines-ile-uygulama-dagitimi-rehberi\/"},"modified":"2025-10-08T12:02:25","modified_gmt":"2025-10-08T09:02:25","slug":"azure-kubernetes-service-akse-azure-pipelines-ile-uygulama-dagitimi-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/azure-kubernetes-service-akse-azure-pipelines-ile-uygulama-dagitimi-rehberi\/","title":{"rendered":"Azure Kubernetes Service (AKS)&#8217;e Azure Pipelines ile Uygulama Da\u011f\u0131t\u0131m\u0131 Rehberi"},"content":{"rendered":"<p>Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde uygulamalar\u0131n h\u0131zl\u0131, g\u00fcvenilir ve otomatik bir \u015fekilde da\u011f\u0131t\u0131lmas\u0131 kritik bir \u00f6neme sahiptir. Bu kapsaml\u0131 rehber, Azure Kubernetes Service (AKS) \u00fczerine Azure Pipelines kullanarak Continuous Integration\/Continuous Delivery (CI\/CD) s\u00fcre\u00e7lerinin nas\u0131l kurulaca\u011f\u0131n\u0131 ad\u0131m ad\u0131m ele almaktad\u0131r. Bu y\u00f6ntemle yaz\u0131l\u0131m geli\u015ftiriciler, \u00fcretim ortam\u0131na kadar uzanan da\u011f\u0131t\u0131m ak\u0131\u015flar\u0131n\u0131 otomatize edebilir ve operasyonel verimlili\u011fi \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilirler.<\/p>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn rekabet\u00e7i i\u015f d\u00fcnyas\u0131nda, i\u015fletmelerin m\u00fc\u015fterilerine h\u0131zl\u0131 bir \u015fekilde de\u011fer sunmas\u0131 hayati \u00f6neme sahiptir. Bu durum, yaz\u0131l\u0131m geli\u015ftirme ekipleri \u00fczerinde s\u00fcrekli entegrasyon (CI) ve s\u00fcrekli da\u011f\u0131t\u0131m (CD) pratiklerini benimseme bask\u0131s\u0131 yaratmaktad\u0131r. Peki, bu s\u00fcreci en verimli ve esnek \u015fekilde nas\u0131l y\u00f6netebiliriz? Cevap genellikle Azure Kubernetes Service (AKS) ve Azure Pipelines gibi g\u00fc\u00e7l\u00fc bulut tabanl\u0131 ara\u00e7lar\u0131n entegrasyonunda yatmaktad\u0131r. Bu iki teknoloji, modern DevOps k\u00fclt\u00fcr\u00fcn\u00fcn temel ta\u015flar\u0131n\u0131 olu\u015fturarak, uygulamalar\u0131n geli\u015ftirme a\u015famas\u0131ndan \u00fcretime kadar olan yolculu\u011funu sorunsuz ve otomatik hale getirir.<\/p>\n<p>\u00d6ncelikle, konteynerizasyonun y\u00fckseli\u015fiyle birlikte karma\u015f\u0131k uygulamalar\u0131n da\u011f\u0131t\u0131m\u0131 ve y\u00f6netimi olduk\u00e7a kolayla\u015fm\u0131\u015ft\u0131r. Kubernetes, konteynerle\u015ftirilmi\u015f i\u015f y\u00fcklerini ve hizmetlerini y\u00f6netmek i\u00e7in a\u00e7\u0131k kaynakl\u0131, portatif ve geni\u015fletilebilir bir platform sunar. Uygulamalar\u0131n \u00f6l\u00e7eklenmesinden, hatalara kar\u015f\u0131 direncine, kaynak kullan\u0131m\u0131n\u0131n optimizasyonundan, da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinin standartla\u015fmas\u0131na kadar bir\u00e7ok avantaj sa\u011flar. Ancak Kubernetes&#8217;in kendisi karma\u015f\u0131k olabilir; i\u015fte bu noktada Azure Kubernetes Service (AKS) devreye girer. AKS, Kubernetes&#8217;i y\u00f6netilen bir hizmet olarak sunarak, altyap\u0131 y\u00f6netimi y\u00fck\u00fcn\u00fc Azure&#8217;a b\u0131rak\u0131r ve geli\u015ftiricilerin sadece uygulamalar\u0131na odaklanmas\u0131n\u0131 sa\u011flar. Bu sayede, operasyonel maliyetler azal\u0131r, g\u00fcvenlik g\u00fcncellemeleri otomatikle\u015fir ve k\u00fcmelerin bak\u0131m\u0131 basitle\u015fir. \u00d6rne\u011fin, b\u00fcy\u00fck bir e-ticaret platformu, yo\u011fun talep d\u00f6nemlerinde otomatik \u00f6l\u00e7eklenebilirlik sa\u011flamak i\u00e7in AKS&#8217;i tercih ederek, insan m\u00fcdahalesi olmadan binlerce konteyneri sorunsuz bir \u015fekilde y\u00f6netebilir.<\/p>\n<p>\u0130kinci olarak, Azure Pipelines, herhangi bir dil veya platform i\u00e7in CI\/CD i\u015f ak\u0131\u015flar\u0131 olu\u015fturman\u0131z\u0131 sa\u011flayan kapsaml\u0131 bir hizmettir. Kod de\u011fi\u015fikliklerinin otomatik olarak derlenmesini, test edilmesini ve da\u011f\u0131t\u0131lmas\u0131n\u0131 sa\u011flayarak, geli\u015ftiricilerin daha h\u0131zl\u0131 yinelemeler yapmas\u0131na ve daha az hata ile kar\u015f\u0131la\u015fmas\u0131na olanak tan\u0131r. Bir yaz\u0131l\u0131m ekibi, yeni bir \u00f6zellik geli\u015ftirirken, kodu her de\u011fi\u015ftirdi\u011finde otomatik testlerin \u00e7al\u0131\u015fmas\u0131n\u0131 ve ba\u015far\u0131l\u0131 olursa uygulaman\u0131n AKS \u00fczerindeki test ortam\u0131na da\u011f\u0131t\u0131lmas\u0131n\u0131 Azure Pipelines ile sa\u011flayabilir. Bu durum, manuel da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinin ortadan kalkmas\u0131yla hata oranlar\u0131n\u0131 d\u00fc\u015f\u00fcr\u00fcr ve da\u011f\u0131t\u0131m s\u00fcrelerini dakikalara indirir. Ayr\u0131ca, Azure Pipelines&#8217;\u0131n YAML tabanl\u0131 tan\u0131mlar\u0131 sayesinde, CI\/CD s\u00fcre\u00e7leri kod olarak versiyonlanabilir (Infrastructure as Code mant\u0131\u011f\u0131yla), bu da \u015feffafl\u0131\u011f\u0131 ve tekrarlanabilirli\u011fi art\u0131r\u0131r. Geli\u015ftirme, test ve \u00fcretim ortamlar\u0131 aras\u0131ndaki tutarl\u0131l\u0131\u011f\u0131 sa\u011flamak, b\u00fcy\u00fck \u00f6l\u00e7ekli projeler i\u00e7in olmazsa olmaz bir gerekliliktir.<\/p>\n<p>Bu iki teknolojinin birle\u015fimi, geli\u015ftirme s\u00fcre\u00e7lerini h\u0131zland\u0131rman\u0131n yan\u0131 s\u0131ra, uygulama kalitesini ve operasyonel g\u00fcvenilirli\u011fi de art\u0131r\u0131r. Azure Pipelines&#8217;\u0131n esnekli\u011fi sayesinde, Docker g\u00f6r\u00fcnt\u00fcleri olu\u015fturulabilir, Container Registry&#8217;ye itilebilir ve ard\u0131ndan Kubernetes manifest dosyalar\u0131 kullan\u0131larak AKS&#8217;e da\u011f\u0131t\u0131labilir. Bu entegrasyon, modern bulut yerel uygulama mimarileri i\u00e7in standart bir uygulama haline gelmi\u015ftir. Sonu\u00e7 olarak, AKS ve Azure Pipelines ile da\u011f\u0131t\u0131m yapmak, sadece teknik bir tercih de\u011fil, ayn\u0131 zamanda i\u015f s\u00fcre\u00e7lerini optimize etme, pazar h\u0131z\u0131na ayak uydurma ve rekabet avantaj\u0131 elde etme stratejisinin de \u00f6nemli bir par\u00e7as\u0131d\u0131r. Bu rehber boyunca, bu g\u00fc\u00e7l\u00fc entegrasyonun nas\u0131l ad\u0131m ad\u0131m kurulaca\u011f\u0131n\u0131 ve kullan\u0131laca\u011f\u0131n\u0131 detayl\u0131 bir \u015fekilde inceleyece\u011fiz.<\/p>\n<h2>AKS ve Azure Pipelines Nedir? Temel Bilgilerle Konuya Giri\u015f<\/h2>\n<p>Uygulama geli\u015ftirme ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini ele al\u0131rken, s\u0131kl\u0131kla kar\u015f\u0131m\u0131za \u00e7\u0131kan iki kilit teknoloji Azure Kubernetes Service (AKS) ve Azure Pipelines&#8217;t\u0131r. Bu b\u00f6l\u00fcmde, konuya tamamen yabanc\u0131 okuyucular i\u00e7in bu temel kavramlar\u0131 a\u00e7\u0131klayarak sa\u011flam bir zemin olu\u015fturaca\u011f\u0131z. Modern bulut yerel mimarilerinin temelini anlamak, bu ara\u00e7lar\u0131 etkin bir \u015fekilde kullanman\u0131n ilk ad\u0131m\u0131d\u0131r.<\/p>\n<p>\u00d6ncelikle, <strong>Kubernetes<\/strong> nedir? Basit\u00e7e ifade etmek gerekirse, Kubernetes, konteynerle\u015ftirilmi\u015f uygulamalar\u0131n da\u011f\u0131t\u0131m\u0131n\u0131, \u00f6l\u00e7eklendirmesini ve y\u00f6netimini otomatikle\u015ftiren a\u00e7\u0131k kaynakl\u0131 bir platformdur. Konteynerler (\u00f6rne\u011fin Docker konteynerleri), uygulamalar\u0131 ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 izole edilmi\u015f, ta\u015f\u0131nabilir birimler halinde paketleyerek, farkl\u0131 ortamlarda tutarl\u0131 bir \u015fekilde \u00e7al\u0131\u015fmalar\u0131n\u0131 sa\u011flar. Kubernetes ise bu konteynerleri binlerce sunucuda (d\u00fc\u011f\u00fcmlerde) y\u00f6neten bir &#8220;orkestrat\u00f6rd\u00fcr&#8221;. Bir orkestra \u015fefi gibi, hangi konteynerin nerede \u00e7al\u0131\u015faca\u011f\u0131n\u0131, ne zaman \u00f6l\u00e7eklenece\u011fini, hatal\u0131 konteynerlerin nas\u0131l yeniden ba\u015flat\u0131laca\u011f\u0131n\u0131 ve uygulamalar\u0131n nas\u0131l internete a\u00e7\u0131laca\u011f\u0131n\u0131 denetler. Pod&#8217;lar (bir veya daha fazla konteyneri bar\u0131nd\u0131ran en k\u00fc\u00e7\u00fck da\u011f\u0131t\u0131labilir birim), Da\u011f\u0131t\u0131mlar (Deployment&#8217;lar, pod&#8217;lar\u0131n nas\u0131l \u00e7al\u0131\u015faca\u011f\u0131n\u0131 ve \u00f6l\u00e7eklenece\u011fini tan\u0131mlar) ve Hizmetler (Service&#8217;ler, pod&#8217;lara d\u0131\u015far\u0131dan veya i\u00e7eriden eri\u015fimi sa\u011flar) Kubernetes&#8217;in temel yap\u0131 ta\u015flar\u0131d\u0131r. Mikroservis tabanl\u0131 uygulamalar i\u00e7in vazge\u00e7ilmez bir ara\u00e7t\u0131r, \u00e7\u00fcnk\u00fc her mikroservisin kendi konteynerinde ba\u011f\u0131ms\u0131z olarak \u00e7al\u0131\u015fmas\u0131n\u0131 ve y\u00f6netilmesini sa\u011flar.<\/p>\n<p>Peki, <strong>Azure Kubernetes Service (AKS)<\/strong> nedir? AKS, Microsoft Azure&#8217;un sundu\u011fu y\u00f6netilen bir Kubernetes hizmetidir. Kubernetes&#8217;in karma\u015f\u0131k altyap\u0131 y\u00f6netimini Azure&#8217;a b\u0131rakarak, geli\u015ftiricilerin ve DevOps ekiplerinin Kubernetes&#8217;in sundu\u011fu t\u00fcm avantajlardan yararlanmas\u0131n\u0131 sa\u011flar. AKS ile ana d\u00fc\u011f\u00fcmlerin (master nodes) bak\u0131m\u0131, yamalanmas\u0131 ve y\u00fckseltilmesi gibi operasyonel y\u00fckler Azure taraf\u0131ndan \u00fcstlenilir. Bu da ekiplerin sadece uygulama geli\u015ftirme ve da\u011f\u0131t\u0131m stratejilerine odaklanmas\u0131n\u0131 m\u00fcmk\u00fcn k\u0131lar. \u00d6rne\u011fin, bir uygulamay\u0131 AKS&#8217;e da\u011f\u0131tt\u0131\u011f\u0131n\u0131zda, Azure sizin i\u00e7in k\u00fcmenin kontrol d\u00fczlemini (API sunucusu, zamanlay\u0131c\u0131 vb.) y\u00f6netir, b\u00f6ylece siz sadece \u00e7al\u0131\u015fan d\u00fc\u011f\u00fcmleri ve uygulamalar\u0131n\u0131z\u0131 d\u00fc\u015f\u00fcn\u00fcrs\u00fcn\u00fcz. Ayr\u0131ca, AKS, Azure Active Directory ile entegrasyon, Azure \u0130zleyici (Monitor) ile izleme ve Azure Sanal A\u011flar (VNet) ile a\u011f entegrasyonu gibi di\u011fer Azure hizmetleriyle sorunsuz bir \u015fekilde \u00e7al\u0131\u015f\u0131r. Otomatik \u00f6l\u00e7ekleme yetenekleri sayesinde, uygulaman\u0131z\u0131n trafi\u011fi artt\u0131\u011f\u0131nda otomatik olarak daha fazla kaynak tahsis edebilir ve trafik azald\u0131\u011f\u0131nda kaynaklar\u0131 geri \u00e7ekerek maliyetleri optimize edebilir. Bu esneklik, \u00f6zellikle de\u011fi\u015fken i\u015f y\u00fcklerine sahip uygulamalar i\u00e7in b\u00fcy\u00fck bir avantajd\u0131r.<\/p>\n<p>\u015eimdi gelelim <strong>Azure Pipelines<\/strong>&#8216;a. Azure Pipelines, Microsoft Azure DevOps hizmetinin bir par\u00e7as\u0131 olarak sunulan bulut tabanl\u0131 bir s\u00fcrekli entegrasyon ve s\u00fcrekli da\u011f\u0131t\u0131m (CI\/CD) hizmetidir. Geli\u015ftiricilerin kodlar\u0131n\u0131 derlemesini, test etmesini ve da\u011f\u0131tmas\u0131n\u0131 otomatikle\u015ftiren g\u00fc\u00e7l\u00fc ve esnek bir platformdur. Azure Pipelines ile herhangi bir dil (Node.js, Python, Java, .NET, Go vb.) veya platform (Linux, macOS, Windows konteynerleri dahil) i\u00e7in CI\/CD i\u015f ak\u0131\u015flar\u0131 olu\u015fturabilirsiniz. YAML tabanl\u0131 pipeline tan\u0131mlar\u0131 kullan\u0131r, bu da da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizin kod olarak versiyonlanmas\u0131n\u0131 ve Git depolar\u0131nda saklanmas\u0131n\u0131 sa\u011flar (Infrastructure as Code prensibi). Bu sayede, da\u011f\u0131t\u0131m ak\u0131\u015flar\u0131n\u0131z da uygulaman\u0131z\u0131n kodu gibi g\u00f6zden ge\u00e7irilebilir, test edilebilir ve s\u00fcr\u00fcm kontrol\u00fc alt\u0131nda tutulabilir. \u00d6rne\u011fin, bir geli\u015ftirici kodda bir de\u011fi\u015fiklik yapt\u0131\u011f\u0131nda, Azure Pipelines otomatik olarak bu kodu \u00e7eker, derler, bir Docker g\u00f6r\u00fcnt\u00fcs\u00fc olu\u015fturur, testleri \u00e7al\u0131\u015ft\u0131r\u0131r ve e\u011fer her \u015fey yolundaysa bu g\u00f6r\u00fcnt\u00fcy\u00fc bir konteyner kay\u0131t defterine (\u00f6rne\u011fin Azure Container Registry) g\u00f6nderir. Bu s\u00fcre\u00e7, &#8220;S\u00fcrekli Entegrasyon&#8221; olarak adland\u0131r\u0131l\u0131r. Ard\u0131ndan, &#8220;S\u00fcrekli Da\u011f\u0131t\u0131m&#8221; a\u015famas\u0131nda, bu yeni g\u00f6r\u00fcnt\u00fc otomatik olarak AKS k\u00fcmesine da\u011f\u0131t\u0131l\u0131r. Bu otomasyon, insan hatas\u0131n\u0131 minimize eder, geli\u015ftirme d\u00f6ng\u00fclerini h\u0131zland\u0131r\u0131r ve yaz\u0131l\u0131m\u0131n pazara sunulma s\u00fcresini (Time-to-Market) \u00f6nemli \u00f6l\u00e7\u00fcde k\u0131salt\u0131r.<\/p>\n<p>\u00d6zetle, AKS, konteynerle\u015ftirilmi\u015f uygulamalar\u0131n\u0131z i\u00e7in g\u00fc\u00e7l\u00fc, y\u00f6netilen ve \u00f6l\u00e7eklenebilir bir \u00e7al\u0131\u015ft\u0131rma ortam\u0131 sunarken; Azure Pipelines, bu uygulamalar\u0131n geli\u015ftirme a\u015famas\u0131ndan AKS&#8217;e kadar olan t\u00fcm da\u011f\u0131t\u0131m s\u00fcrecini otomatikle\u015ftiren bir k\u00f6pr\u00fc g\u00f6revi g\u00f6r\u00fcr. Bu iki arac\u0131n entegrasyonu, modern DevOps yakla\u015f\u0131mlar\u0131n\u0131n temelini olu\u015fturur ve ekiplerin daha verimli, g\u00fcvenilir ve esnek bir \u015fekilde yaz\u0131l\u0131m geli\u015ftirmesine olanak tan\u0131r. Konteynerizasyon, otomasyon ve bulut altyap\u0131s\u0131n\u0131n birle\u015fimi, \u015firketlerin dijital d\u00f6n\u00fc\u015f\u00fcm yolculu\u011funda \u00f6nemli bir avantaj sa\u011flar.<\/p>\n<h2>AKS&#8217;e Da\u011f\u0131t\u0131m \u00d6ncesi Gerekli Ad\u0131mlar ve Ortam Kurulumu Nas\u0131l Yap\u0131l\u0131r?<\/h2>\n<p>Azure Kubernetes Service (AKS) \u00fczerine uygulama da\u011f\u0131t\u0131m\u0131na ba\u015flamadan \u00f6nce, gerekli t\u00fcm ara\u00e7lar\u0131n ve servislerin do\u011fru bir \u015fekilde yap\u0131land\u0131r\u0131lmas\u0131 hayati \u00f6neme sahiptir. Bu \u00f6n haz\u0131rl\u0131k ad\u0131mlar\u0131, sorunsuz bir CI\/CD s\u00fcreci i\u00e7in temel olu\u015fturur ve potansiyel aksakl\u0131klar\u0131 en aza indirir. Bu b\u00f6l\u00fcmde, bir AKS k\u00fcmesi olu\u015fturmaktan, Azure DevOps projesi kurmaya ve gerekli ba\u011flant\u0131lar\u0131 yap\u0131land\u0131rmaya kadar t\u00fcm ad\u0131mlar\u0131 detayl\u0131 bir \u015fekilde ele alaca\u011f\u0131z.<\/p>\n<h3>Azure Subscription ve Azure CLI Kurulumu<\/h3>\n<p>\u00d6ncelikle, bir Azure hesab\u0131 ve aktif bir aboneli\u011finizin olmas\u0131 gerekmektedir. E\u011fer yoksa, <a href=\"https:\/\/azure.microsoft.com\/tr-tr\/free\/\">Azure \u00dccretsiz Hesab\u0131<\/a> olu\u015fturarak ba\u015flayabilirsiniz. Ard\u0131ndan, Azure kaynaklar\u0131n\u0131 komut sat\u0131r\u0131ndan y\u00f6netmek i\u00e7in Azure CLI&#8217;\u0131 (Command Line Interface) bilgisayar\u0131n\u0131za kurman\u0131z gerekmektedir. Azure CLI, Windows, macOS ve Linux \u00fczerinde \u00e7al\u0131\u015fabilen platformlar aras\u0131 bir ara\u00e7t\u0131r. Kurulum talimatlar\u0131n\u0131 <a href=\"https:\/\/docs.microsoft.com\/tr-tr\/cli\/azure\/install-azure-cli\">Azure CLI belgeleri<\/a> \u00fczerinden bulabilirsiniz. Kurulumdan sonra, terminalinizi a\u00e7arak <code>az login<\/code> komutu ile Azure hesab\u0131n\u0131za giri\u015f yap\u0131n. Bu komut, sizi web taray\u0131c\u0131n\u0131z \u00fczerinden Azure portal\u0131na y\u00f6nlendirecek ve kimlik do\u011frulama i\u015flemini tamamlayacakt\u0131r.<\/p>\n<h3>AKS K\u00fcmesi Olu\u015fturma<\/h3>\n<p>Uygulamalar\u0131m\u0131z\u0131 \u00e7al\u0131\u015ft\u0131raca\u011f\u0131m\u0131z Kubernetes k\u00fcmesini olu\u015fturmam\u0131z gerekiyor. Bu i\u015flem i\u00e7in bir kaynak grubu ve ard\u0131ndan bu kaynak grubunun i\u00e7ine bir AKS k\u00fcmesi tan\u0131mlayaca\u011f\u0131z. Kaynak grubu, Azure kaynaklar\u0131n\u0131z\u0131 mant\u0131ksal olarak d\u00fczenlemenizi sa\u011flar.<\/p>\n<pre><code class=\"language-bash\"># Kaynak grubu olu\u015fturma\naz group create --name myAKSResourceGroup --location eastus\n\n# AKS k\u00fcmesi olu\u015fturma\naz aks create --resource-group myAKSResourceGroup --name myAKSCluster --node-count 1 --enable-addons monitoring --generate-ssh-keys --kubernetes-version 1.28.3\n\n# AKS k\u00fcmesine ba\u011flanmak i\u00e7in kimlik bilgilerini alma\naz aks get-credentials --resource-group myAKSResourceGroup --name myAKSCluster\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki komutlar s\u0131ras\u0131yla <code>myAKSResourceGroup<\/code> ad\u0131nda bir kaynak grubu olu\u015fturur, i\u00e7ine <code>myAKSCluster<\/code> ad\u0131nda tek d\u00fc\u011f\u00fcml\u00fc bir AKS k\u00fcmesi kurar ve izleme eklentisini etkinle\u015ftirir. Son komut ise <code>kubectl<\/code> arac\u0131n\u0131n AKS k\u00fcmenizle ileti\u015fim kurmas\u0131n\u0131 sa\u011flayacak kimlik bilgilerini (<code>kubeconfig<\/code>) yerel makinenize indirir. Art\u0131k <code>kubectl get nodes<\/code> komutunu \u00e7al\u0131\u015ft\u0131rarak k\u00fcmenizin durumunu kontrol edebilirsiniz.<\/p>\n<h3>Azure Container Registry (ACR) Olu\u015fturma<\/h3>\n<p>Konteynerle\u015ftirilmi\u015f uygulamalar\u0131m\u0131z\u0131n Docker g\u00f6r\u00fcnt\u00fclerini depolamak i\u00e7in bir konteyner kay\u0131t defterine ihtiyac\u0131m\u0131z var. Azure Container Registry (ACR), Docker g\u00f6r\u00fcnt\u00fclerini ve Open Container Initiative (OCI) yap\u0131tlar\u0131n\u0131 bulutta depolamak ve y\u00f6netmek i\u00e7in y\u00f6netilen bir hizmettir. Azure Pipelines, olu\u015fturdu\u011fu Docker g\u00f6r\u00fcnt\u00fclerini buraya itecektir.<\/p>\n<pre><code class=\"language-bash\"># ACR olu\u015fturma\naz acr create --resource-group myAKSResourceGroup --name myACRRegistry --sku Basic --admin-enabled true\n\n# ACR giri\u015f sunucusu ad\u0131n\u0131 (login server) almak (pipeline'da kullan\u0131lacak)\naz acr show --name myACRRegistry --query loginServer --output tsv\n<\/pre>\n<p><\/code><\/p>\n<p>Bu komutlar, <code>myACRRegistry<\/code> ad\u0131nda temel bir ACR \u00f6rne\u011fi olu\u015fturur ve y\u00f6netici kullan\u0131c\u0131s\u0131n\u0131 etkinle\u015ftirir. <code>loginServer<\/code> \u00e7\u0131kt\u0131s\u0131, Docker g\u00f6r\u00fcnt\u00fclerini itmek ve \u00e7ekmek i\u00e7in kullanaca\u011f\u0131m\u0131z tam nitelikli kay\u0131t defteri ad\u0131n\u0131 sa\u011flayacakt\u0131r (\u00f6rn. <code>myacraregistry.azurecr.io<\/code>).<\/p>\n<h3>Azure DevOps Organizasyonu ve Projesi Olu\u015fturma<\/h3>\n<p>CI\/CD s\u00fcre\u00e7lerimizi y\u00f6netece\u011fimiz Azure Pipelines i\u00e7in bir Azure DevOps organizasyonu ve projesi olu\u015fturmam\u0131z gerekiyor. <a href=\"https:\/\/dev.azure.com\/\">Azure DevOps Portal\u0131na<\/a> gidin ve bir organizasyon olu\u015fturun veya mevcut bir organizasyonu kullan\u0131n. Ard\u0131ndan, yeni bir proje olu\u015fturun (\u00f6rn. <code>my-aks-app<\/code>). Bu proje, kaynak kodunuzu (Azure Repos), pipeline tan\u0131mlar\u0131n\u0131z\u0131 ve di\u011fer DevOps artefaktlar\u0131n\u0131z\u0131 bar\u0131nd\u0131racakt\u0131r.<\/p>\n<h3>Servis Ba\u011flant\u0131s\u0131 (Service Connection) Kurulumu<\/h3>\n<p>Azure Pipelines'\u0131n Azure kaynaklar\u0131n\u0131zla (AKS, ACR) etkile\u015fime ge\u00e7ebilmesi i\u00e7in bir servis ba\u011flant\u0131s\u0131 olu\u015fturman\u0131z gerekmektedir. Bu ba\u011flant\u0131, Pipeline'\u0131n Azure aboneli\u011finizde kimlik do\u011frulamas\u0131 yapmas\u0131n\u0131 sa\u011flar.<\/p>\n<ol>\n<li>Azure DevOps projenize gidin.<\/li>\n<li>Sol men\u00fcden <code>Project settings<\/code> (Proje ayarlar\u0131) se\u00e7ene\u011fine t\u0131klay\u0131n.<\/li>\n<li><code>Pipelines<\/code> alt\u0131nda <code>Service connections<\/code> (Servis ba\u011flant\u0131lar\u0131) se\u00e7ene\u011fini se\u00e7in.<\/li>\n<li><code>New service connection<\/code> (Yeni servis ba\u011flant\u0131s\u0131) butonuna t\u0131klay\u0131n.<\/li>\n<li><code>Azure Resource Manager<\/code> tipini se\u00e7in ve <code>Next<\/code> (\u0130leri).<\/li>\n<li><code>Service principal (automatic)<\/code> veya <code>Service principal (manual)<\/code> se\u00e7ene\u011fini tercih edin. Otomatik se\u00e7enek genellikle daha kolayd\u0131r.<\/li>\n<li>Aboneli\u011finizi ve kaynak grubunuzu (\u00f6rn. <code>myAKSResourceGroup<\/code>) se\u00e7in.<\/li>\n<li>Servis ba\u011flant\u0131n\u0131za a\u00e7\u0131klay\u0131c\u0131 bir ad verin (\u00f6rn. <code>AzureSubscriptionConnection<\/code>).<\/li>\n<li><code>Grant access permission to all pipelines<\/code> (T\u00fcm pipeline'lara eri\u015fim izni ver) kutucu\u011funu i\u015faretleyin (basitlik ad\u0131na, \u00fcretim ortamlar\u0131nda daha k\u0131s\u0131tl\u0131 izinler d\u00fc\u015f\u00fcnebilirsiniz).<\/li>\n<li><code>Save<\/code> (Kaydet) diyerek ba\u011flant\u0131y\u0131 olu\u015fturun.<\/li>\n<\/ol>\n<p><mark>Uzman \u0130pucu:<\/mark> \u00dcretim ortamlar\u0131nda, servis ba\u011flant\u0131lar\u0131 i\u00e7in en az ayr\u0131cal\u0131k ilkesini (Least Privilege Principle) uygulay\u0131n. Yani, sadece belirli kaynak gruplar\u0131na veya aboneliklere eri\u015fimi olan ve sadece AKS'e da\u011f\u0131t\u0131m i\u00e7in gerekli izinlere sahip bir servis ilkesi kullan\u0131n. Bu, g\u00fcvenlik risklerini \u00f6nemli \u00f6l\u00e7\u00fcde azaltacakt\u0131r.<\/p>\n<p>T\u00fcm bu ad\u0131mlar\u0131 tamamlad\u0131ktan sonra, Azure ortam\u0131n\u0131z ve Azure DevOps projeniz, uygulaman\u0131z\u0131 AKS'e da\u011f\u0131tmaya haz\u0131rd\u0131r. Bir sonraki a\u015famada, \u00f6rnek bir uygulaman\u0131n Docker g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc olu\u015fturup Kubernetes manifest dosyalar\u0131n\u0131 haz\u0131rlayaca\u011f\u0131z. Bu \u00f6n haz\u0131rl\u0131k, CI\/CD s\u00fcrecinin ba\u015far\u0131l\u0131 bir \u015fekilde otomatize edilmesi i\u00e7in sa\u011flam bir temel olu\u015fturur ve geli\u015ftirme ekiplerinin uygulamalar\u0131n\u0131 daha h\u0131zl\u0131 ve g\u00fcvenilir bir \u015fekilde pazara sunmas\u0131na yard\u0131mc\u0131 olur.<\/p>\n<h2>\u00d6rnek Bir Uygulaman\u0131n Docker G\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc Olu\u015fturma<\/h2>\n<p>Art\u0131k AKS k\u00fcmemiz ve Azure Container Registry'miz (ACR) haz\u0131r oldu\u011funa g\u00f6re, da\u011f\u0131t\u0131m\u0131n\u0131 yapaca\u011f\u0131m\u0131z \u00f6rnek bir uygulamay\u0131 ele alabiliriz. Bu b\u00f6l\u00fcmde, basit bir .NET Core Web API uygulamas\u0131n\u0131n Docker g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc nas\u0131l olu\u015fturaca\u011f\u0131m\u0131z\u0131 ve Kubernetes'te \u00e7al\u0131\u015facak hale getirecek manifest dosyalar\u0131n\u0131 nas\u0131l haz\u0131rlayaca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. Bu \u00f6rnek, modern mikroservis mimarilerinin temelini olu\u015fturan konteynerizasyon s\u00fcrecini anlaman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<p>Senaryomuz i\u00e7in, basit bir \"Merhaba D\u00fcnya\" mesaj\u0131 d\u00f6nd\u00fcren bir .NET Core Web API uygulamas\u0131 kullanaca\u011f\u0131z. Bu uygulama, herhangi bir karma\u015f\u0131k veritaban\u0131 ba\u011flant\u0131s\u0131 veya harici ba\u011f\u0131ml\u0131l\u0131k gerektirmemesi nedeniyle konuyu basitle\u015ftirmek i\u00e7in idealdir. Tabii ki, ayn\u0131 prensipler daha karma\u015f\u0131k uygulamalar i\u00e7in de ge\u00e7erlidir.<\/p>\n<p>\u0130lk olarak, yerel makinenizde basit bir .NET Core Web API projesi olu\u015fturun. \u00d6rne\u011fin, Visual Studio Code'u veya komut sat\u0131r\u0131n\u0131 kullanarak a\u015fa\u011f\u0131daki komutla yeni bir proje ba\u015flatabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">dotnet new webapi -n MyWebApp\ncd MyWebApp\n<\/pre>\n<p><\/code><\/p>\n<p>Bu, <code>MyWebApp<\/code> ad\u0131nda yeni bir Web API projesi olu\u015fturacakt\u0131r. \u015eimdi, bu uygulamay\u0131 bir Docker konteyneri i\u00e7inde \u00e7al\u0131\u015ft\u0131rmak i\u00e7in bir <code>Dockerfile<\/code> olu\u015fturmam\u0131z gerekiyor. Projenizin ana dizininde (<code>MyWebApp<\/code> klas\u00f6r\u00fcn\u00fcn i\u00e7inde) <code>Dockerfile<\/code> ad\u0131nda bir dosya olu\u015fturun ve i\u00e7ine a\u015fa\u011f\u0131daki i\u00e7eri\u011fi yap\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-dockerfile\"># ASP.NET Core SDK g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc kullanarak uygulamay\u0131 derle\nFROM mcr.microsoft.com\/dotnet\/sdk:8.0 AS build\nWORKDIR \/src\nCOPY [\"MyWebApp.csproj\", \".\/\"]\nRUN dotnet restore \"MyWebApp.csproj\"\nCOPY . .\nWORKDIR \"\/src\/.\"\nRUN dotnet build \"MyWebApp.csproj\" -c Release -o \/app\/build\n\n# Yay\u0131nlama a\u015famas\u0131\nFROM build AS publish\nRUN dotnet publish \"MyWebApp.csproj\" -c Release -o \/app\/publish \/p:UseAppHost=false\n\n# \u00c7al\u0131\u015ft\u0131rma a\u015famas\u0131 (daha k\u00fc\u00e7\u00fck ve g\u00fcvenli runtime g\u00f6r\u00fcnt\u00fcs\u00fc)\nFROM mcr.microsoft.com\/dotnet\/aspnet:8.0 AS final\nWORKDIR \/app\nCOPY --from=publish \/app\/publish .\nENTRYPOINT [\"dotnet\", \"MyWebApp.dll\"]\n<\/pre>\n<p><\/code><\/p>\n<p>Bu <code>Dockerfile<\/code>, \u00e7ok a\u015famal\u0131 bir derleme stratejisi kullan\u0131r. \u0130lk a\u015fama (<code>build<\/code>), uygulaman\u0131n derlenmesi ve yay\u0131nlanmas\u0131 i\u00e7in gerekli SDK'y\u0131 i\u00e7erir. \u0130kinci a\u015fama (<code>publish<\/code>), uygulaman\u0131n da\u011f\u0131t\u0131ma haz\u0131r hale getirilmi\u015f \u00e7\u0131kt\u0131s\u0131n\u0131 olu\u015fturur. Son a\u015fama (<code>final<\/code>) ise sadece uygulaman\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in gerekli olan daha k\u00fc\u00e7\u00fck ve g\u00fcvenli ASP.NET Core \u00e7al\u0131\u015fma zaman\u0131 g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc kullan\u0131r. Bu yakla\u015f\u0131m, ortaya \u00e7\u0131kan Docker g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fcn boyutunu \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r ve g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 minimize eder. <code>COPY<\/code> komutlar\u0131, proje dosyalar\u0131n\u0131 konteynere kopyalar ve <code>dotnet restore<\/code>, <code>dotnet build<\/code>, <code>dotnet publish<\/code> komutlar\u0131 da uygulamay\u0131 derleme ve yay\u0131nlama i\u015flemlerini ger\u00e7ekle\u015ftirir.<\/p>\n<p>Uygulamam\u0131z konteynerize edilmeye haz\u0131r oldu\u011funa g\u00f6re, bunu Kubernetes k\u00fcmemizde da\u011f\u0131tmak i\u00e7in Kubernetes manifest dosyalar\u0131n\u0131 haz\u0131rlamam\u0131z gerekiyor. Genellikle bir <code>Deployment<\/code> ve bir <code>Service<\/code> nesnesi tan\u0131mlar\u0131z. Projenizin k\u00f6k dizininde <code>kubernetes<\/code> ad\u0131nda bir klas\u00f6r olu\u015fturun ve i\u00e7ine <code>deployment.yaml<\/code> ve <code>service.yaml<\/code> ad\u0131nda iki dosya ekleyin.<\/p>\n<p><code>kubernetes\/deployment.yaml<\/code> dosyas\u0131n\u0131n i\u00e7eri\u011fi:<\/p>\n<pre><code class=\"language-yaml\">apiVersion: apps\/v1\nkind: Deployment\nmetadata:\n  name: mywebapp-deployment\n  labels:\n    app: mywebapp\nspec:\n  replicas: 2 # Uygulaman\u0131n 2 kopyas\u0131n\u0131 \u00e7al\u0131\u015ft\u0131r\n  selector:\n    matchLabels:\n      app: mywebapp\n  template:\n    metadata:\n      labels:\n        app: mywebapp\n    spec:\n      containers:\n      - name: mywebapp\n        image: REPLACE_IMAGE_NAME:REPLACE_IMAGE_TAG # Azure Pipelines taraf\u0131ndan doldurulacak\n        ports:\n        - containerPort: 80\n        resources:\n          requests:\n            memory: \"64Mi\"\n            cpu: \"250m\"\n          limits:\n            memory: \"128Mi\"\n            cpu: \"500m\"\n      imagePullSecrets:\n      - name: acr-secret # ACR'den g\u00f6r\u00fcnt\u00fc \u00e7ekmek i\u00e7in secret\n<\/pre>\n<p><\/code><\/p>\n<p>Bu <code>deployment.yaml<\/code> dosyas\u0131, <code>mywebapp<\/code> etiketine sahip pod'lar\u0131n iki kopyas\u0131n\u0131 \u00e7al\u0131\u015ft\u0131racak bir da\u011f\u0131t\u0131m tan\u0131mlar. <code>image<\/code> alan\u0131, Azure Pipelines taraf\u0131ndan derlenen Docker g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fcn ad\u0131yla ve etiketiyle doldurulacakt\u0131r. <code>resources<\/code> k\u0131sm\u0131, konteynerlerin ne kadar CPU ve bellek kullanabilece\u011fini belirler. <code>imagePullSecrets<\/code> ise, Azure Container Registry gibi \u00f6zel bir kay\u0131t defterinden g\u00f6r\u00fcnt\u00fc \u00e7ekerken kimlik do\u011frulamas\u0131 i\u00e7in kullan\u0131l\u0131r. Bu secret'\u0131 daha sonra pipeline'da olu\u015fturaca\u011f\u0131z.<\/p>\n<p><code>kubernetes\/service.yaml<\/code> dosyas\u0131n\u0131n i\u00e7eri\u011fi:<\/p>\n<pre><code class=\"language-yaml\">apiVersion: v1\nkind: Service\nmetadata:\n  name: mywebapp-service\nspec:\n  selector:\n    app: mywebapp # Bu servis, 'mywebapp' etiketine sahip pod'lar\u0131 hedefler\n  ports:\n    - protocol: TCP\n      port: 80 # Servisin d\u0131\u015far\u0131dan dinleyece\u011fi port\n      targetPort: 80 # Pod'un i\u00e7indeki konteynerin dinleyece\u011fi port\n  type: LoadBalancer # D\u0131\u015far\u0131dan eri\u015filebilir bir LoadBalancer olu\u015fturur\n<\/pre>\n<p><\/code><\/p>\n<p>Bu <code>service.yaml<\/code> dosyas\u0131, <code>mywebapp-deployment<\/code> taraf\u0131ndan olu\u015fturulan pod'lara trafik y\u00f6nlendiren bir <code>LoadBalancer<\/code> tipi servis tan\u0131mlar. <code>LoadBalancer<\/code> tipi, Azure'da otomatik olarak bir genel IP adresi atayarak uygulamam\u0131z\u0131n internet \u00fczerinden eri\u015filebilir olmas\u0131n\u0131 sa\u011flar. <code>port<\/code> ve <code>targetPort<\/code> ayarlar\u0131, trafi\u011fin d\u0131\u015far\u0131dan servise ve oradan da konteynere nas\u0131l y\u00f6nlendirilece\u011fini belirtir.<\/p>\n<p>Bu dosyalar\u0131 haz\u0131rlad\u0131ktan sonra, projenizin dizin yap\u0131s\u0131 a\u015fa\u011f\u0131daki gibi g\u00f6r\u00fcnmelidir:<\/p>\n<pre><code>MyWebApp\/\n\u251c\u2500\u2500 Controllers\/\n\u251c\u2500\u2500 Pages\/\n\u251c\u2500\u2500 ... (Di\u011fer .NET Core dosyalar\u0131)\n\u251c\u2500\u2500 MyWebApp.csproj\n\u251c\u2500\u2500 Dockerfile\n\u2514\u2500\u2500 kubernetes\/\n    \u251c\u2500\u2500 deployment.yaml\n    \u2514\u2500\u2500 service.yaml\n<\/pre>\n<p><\/code><\/p>\n<p>T\u00fcm bu ad\u0131mlar, uygulaman\u0131z\u0131n konteynerle\u015ftirilmesi ve Kubernetes ortam\u0131nda da\u011f\u0131t\u0131ma haz\u0131r hale getirilmesi i\u00e7in temel te\u015fkil eder. <code>Dockerfile<\/code> uygulamay\u0131 ta\u015f\u0131nabilir ve izole edilebilir bir birim haline getirirken, Kubernetes manifest dosyalar\u0131 bu birimin AKS k\u00fcmesi i\u00e7inde nas\u0131l konu\u015flanaca\u011f\u0131n\u0131, \u00f6l\u00e7eklenece\u011fini ve eri\u015filebilir olaca\u011f\u0131n\u0131 tan\u0131mlar. Bir sonraki b\u00f6l\u00fcmde, Azure Pipelines kullanarak bu Docker g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc nas\u0131l derleyece\u011fimizi ve Azure Container Registry'ye nas\u0131l g\u00f6nderece\u011fimizi ele alaca\u011f\u0131z. Bu sayede, kod de\u011fi\u015fikliklerinizin otomatik olarak da\u011f\u0131t\u0131ma haz\u0131r artefaktlara d\u00f6n\u00fc\u015fme s\u00fcrecini otomatikle\u015ftirece\u011fiz.<\/p>\n<h2>Uygulaman\u0131n S\u00fcrekli Entegrasyonu (CI): Azure Pipeline ile Docker G\u00f6r\u00fcnt\u00fcs\u00fc Nas\u0131l Olu\u015fturulur ve ACR'ye G\u00f6nderilir?<\/h2>\n<p>Uygulamam\u0131z\u0131n kodunu ve Kubernetes manifestlerini haz\u0131rlad\u0131\u011f\u0131m\u0131za g\u00f6re, \u015fimdi s\u00fcrekli entegrasyon (CI) s\u00fcrecini Azure Pipelines ile otomatikle\u015ftirebiliriz. CI, geli\u015ftiricilerin kod de\u011fi\u015fikliklerini s\u0131k s\u0131k merkezi bir depoya birle\u015ftirdi\u011fi ve bu de\u011fi\u015fikliklerin otomatik olarak derlendi\u011fi ve test edildi\u011fi bir yaz\u0131l\u0131m geli\u015ftirme prati\u011fidir. Bu b\u00f6l\u00fcmde, bir .NET Core uygulamas\u0131n\u0131 Docker g\u00f6r\u00fcnt\u00fcs\u00fc haline getirip, Azure Container Registry'ye (ACR) nas\u0131l g\u00f6nderece\u011fimizi detayl\u0131 bir Azure Pipeline (YAML) \u00f6rne\u011fiyle a\u00e7\u0131klayaca\u011f\u0131z.<\/p>\n<p>Azure DevOps projenizin <code>Repos<\/code> k\u0131sm\u0131nda, projenizi (\u00f6rne\u011fin, <code>MyWebApp<\/code>) bar\u0131nd\u0131ran bir Git deposu olu\u015fturdu\u011funuzu ve yukar\u0131da haz\u0131rlad\u0131\u011f\u0131m\u0131z <code>Dockerfile<\/code> ile <code>kubernetes<\/code> klas\u00f6r\u00fcn\u00fc bu depoya y\u00fckledi\u011finizi varsay\u0131yoruz. \u015eimdi, depoda <code>azure-pipelines.yml<\/code> ad\u0131nda yeni bir dosya olu\u015ftural\u0131m. Bu dosya, CI s\u00fcrecimizi tan\u0131mlayacakt\u0131r.<\/p>\n<pre><code class=\"language-yaml\"># azure-pipelines.yml\ntrigger:\n- master # master branch'ine yap\u0131lan her push bu pipeline'\u0131 tetikleyecek\n\nvariables:\n  # ACR ad\u0131n\u0131z (\u00f6nceki ad\u0131mda olu\u015fturdu\u011fumuz)\n  acrServiceConnection: 'AzureSubscriptionConnection' # Servis ba\u011flant\u0131s\u0131 ad\u0131m\u0131z\n  azureSubscription: 'myAKSResourceGroup' # Kaynak grubumuzun ad\u0131\n  acrName: 'myACRRegistry' # ACR ad\u0131m\u0131z\n  imageRepository: 'mywebapp' # Docker g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fcn ad\u0131\n  dockerfilePath: '$(Build.SourcesDirectory)\/Dockerfile' # Dockerfile yolu\n  tag: '$(Build.BuildId)' # G\u00f6r\u00fcnt\u00fc etiketi olarak Build ID'yi kullan\n\nstages:\n- stage: Build\n  displayName: Build and Push Docker Image\n  jobs:\n  - job: BuildAndPush\n    displayName: Build and Push\n    pool:\n      vmImage: 'ubuntu-latest' # Linux tabanl\u0131 bir agent kullan\n\n    steps:\n    - task: DockerInstaller@0\n      displayName: 'Install Docker'\n      inputs:\n        dockerVersion: 'latest' # En son Docker s\u00fcr\u00fcm\u00fcn\u00fc y\u00fckle\n\n    - task: Docker@2\n      displayName: 'Build and Push an image to ACR'\n      inputs:\n        command: 'buildAndPush'\n        repository: '$(imageRepository)'\n        dockerfile: '$(dockerfilePath)'\n        containerRegistry: '$(acrServiceConnection)' # Servis ba\u011flant\u0131m\u0131z\u0131 kullan\n        tags: |\n          $(tag)\n          latest\n        buildContext: '$(Build.SourcesDirectory)' # Dockerfile'\u0131n bulundu\u011fu dizin\n\n    - task: PublishBuildArtifacts@1\n      displayName: 'Publish Artifacts'\n      inputs:\n        PathtoPublish: '$(Build.SourcesDirectory)\/kubernetes'\n        ArtifactName: 'kubernetes_manifests'\n        publishLocation: 'Container'\n<\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi bu YAML dosyas\u0131n\u0131 ad\u0131m ad\u0131m inceleyelim:<\/p>\n<ul>\n<li><code>trigger: - master<\/code>: Bu k\u0131s\u0131m, <code>master<\/code> branch'ine yap\u0131lan her bir kod de\u011fi\u015fikli\u011finin (push) bu pipeline'\u0131 otomatik olarak tetiklemesini sa\u011flar. Bu, s\u00fcrekli entegrasyonun temelidir; her de\u011fi\u015fiklik derlenir ve test edilir.<\/li>\n<li><code>variables<\/code>: Burada pipeline'da kullanaca\u011f\u0131m\u0131z de\u011fi\u015fkenleri tan\u0131mlar\u0131z. <code>acrName<\/code>, <code>imageRepository<\/code>, <code>dockerfilePath<\/code> gibi de\u011ferler, pipeline'\u0131n okunabilirli\u011fini art\u0131r\u0131r ve bak\u0131m\u0131 kolayla\u015ft\u0131r\u0131r. <code>tag: &#039;$(Build.BuildId)&#039;<\/code> ifadesi, her derleme i\u00e7in benzersiz bir etiket olu\u015fturur (Azure DevOps taraf\u0131ndan otomatik olarak atanan bir kimlik). Ayr\u0131ca <code>latest<\/code> etiketi de ekliyoruz.<\/li>\n<li><code>stages<\/code>: Pipeline'\u0131 mant\u0131ksal a\u015famalara ay\u0131rmam\u0131z\u0131 sa\u011flar. Burada sadece bir <code>Build<\/code> a\u015famam\u0131z var. Daha sonra CD i\u00e7in ba\u015fka a\u015famalar ekleyece\u011fiz.<\/li>\n<li><code>jobs<\/code>: Bir a\u015fama i\u00e7inde \u00e7al\u0131\u015facak i\u015fleri tan\u0131mlar. <code>BuildAndPush<\/code> i\u015fi, Docker g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc olu\u015fturup ACR'ye g\u00f6ndermekten sorumludur.<\/li>\n<li><code>pool: vmImage: &#039;ubuntu-latest&#039;<\/code>: Bu i\u015fin \u00e7al\u0131\u015faca\u011f\u0131 ajan\u0131 (sunucuyu) belirtir. <code>ubuntu-latest<\/code>, Azure DevOps taraf\u0131ndan sa\u011flanan Ubuntu tabanl\u0131 bir sanal makinedir.<\/li>\n<li><code>steps<\/code>: \u0130\u015fin i\u00e7inde \u00e7al\u0131\u015ft\u0131r\u0131lacak ad\u0131mlar\u0131 tan\u0131mlar.\n<ul>\n<li><code>DockerInstaller@0<\/code>: Bu g\u00f6rev, Azure DevOps arac\u0131s\u0131na Docker'\u0131 kurar. Bu genellikle CI\/CD s\u00fcre\u00e7lerinde konteyner g\u00f6r\u00fcnt\u00fcleri olu\u015fturmak i\u00e7in gereklidir.<\/li>\n<li><code>Docker@2<\/code>: Bu, Docker komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in \u00f6zel bir Azure Pipelines g\u00f6revidir.\n<ul>\n<li><code>command: &#039;buildAndPush&#039;<\/code>: Hem Docker g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc derler hem de belirtilen kay\u0131t defterine g\u00f6nderir.<\/li>\n<li><code>repository: &#039;$(imageRepository)&#039;<\/code>: Docker g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fcn ad\u0131n\u0131 belirtir (\u00f6rn. <code>mywebapp<\/code>).<\/li>\n<li><code>dockerfile: &#039;$(dockerfilePath)&#039;<\/code>: <code>Dockerfile<\/code>'\u0131n yolunu g\u00f6sterir.<\/li>\n<li><code>containerRegistry: &#039;$(acrServiceConnection)&#039;<\/code>: \u00d6nceki ad\u0131mda olu\u015fturdu\u011fumuz Azure Resource Manager servis ba\u011flant\u0131s\u0131n\u0131n ad\u0131n\u0131 kullan\u0131r. Bu ba\u011flant\u0131 sayesinde Azure Pipelines, ACR'ye kimlik do\u011frulamas\u0131 yaparak eri\u015febilir.<\/li>\n<li><code>tags: | $(tag) latest<\/code>: Olu\u015fturulan g\u00f6r\u00fcnt\u00fcye <code>Build.BuildId<\/code> ve <code>latest<\/code> etiketlerini ekler.<\/li>\n<li><code>buildContext: &#039;$(Build.SourcesDirectory)&#039;<\/code>: Docker'\u0131n derleme ba\u011flam\u0131n\u0131 belirtir. T\u00fcm kaynak kodunun bulundu\u011fu k\u00f6k dizini i\u015faret eder.<\/li>\n<\/ul>\n<\/li>\n<li><code>PublishBuildArtifacts@1<\/code>: Bu g\u00f6rev, <code>kubernetes<\/code> klas\u00f6r\u00fcm\u00fczdeki YAML manifest dosyalar\u0131n\u0131 bir derleme artefakt\u0131 olarak yay\u0131nlar. Bu, CD a\u015famas\u0131nda bu dosyalar\u0131 kullanmam\u0131z\u0131 sa\u011flar. Bu artefaktlar, Azure DevOps'ta derleme \u00f6zet sayfas\u0131nda g\u00f6r\u00fclebilir ve indirilebilir.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><mark>Uzman \u0130pucu:<\/mark> Docker g\u00f6r\u00fcnt\u00fclerinizin boyutunu optimize etmek, hem derleme s\u00fcrelerini k\u0131salt\u0131r hem de da\u011f\u0131t\u0131m h\u0131z\u0131n\u0131 art\u0131r\u0131r. \u00c7ok a\u015famal\u0131 derlemeler (multi-stage builds) ve gereksiz dosyalar\u0131 <code>.dockerignore<\/code> ile hari\u00e7 tutmak bu konuda etkili y\u00f6ntemlerdir. Ayr\u0131ca, g\u00fcvenlik taramalar\u0131 i\u00e7in Docker g\u00f6r\u00fcnt\u00fclerinizin kalite ve g\u00fcvenlik denetimlerini CI a\u015famas\u0131na entegre etmeyi d\u00fc\u015f\u00fcnebilirsiniz. \u00d6rne\u011fin, \u00fc\u00e7\u00fcnc\u00fc taraf bir ara\u00e7 (Aqua Security, Clair gibi) veya Azure Container Registry'nin yerle\u015fik g\u00fcvenlik \u00f6zellikleri (Defender for Cloud) kullan\u0131labilir.<\/p>\n<p>Bu <code>azure-pipelines.yml<\/code> dosyas\u0131n\u0131 depomuza kaydettikten sonra, Azure DevOps Pipelines b\u00f6l\u00fcm\u00fcnde yeni bir pipeline olu\u015fturup bu YAML dosyas\u0131n\u0131 se\u00e7erek \u00e7al\u0131\u015ft\u0131rabiliriz. \u0130lk \u00e7al\u0131\u015ft\u0131rmada, Azure DevOps kodu \u00e7ekecek, Docker g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc derleyecek, ACR'ye g\u00f6nderecek ve Kubernetes manifest dosyalar\u0131n\u0131 bir artefakt olarak yay\u0131nlayacakt\u0131r. Bu ba\u015far\u0131l\u0131 CI s\u00fcreci, bir sonraki a\u015fama olan s\u00fcrekli da\u011f\u0131t\u0131m (CD) i\u00e7in temel bir ad\u0131md\u0131r. Uygulaman\u0131z art\u0131k konteynerle\u015ftirilmi\u015f ve da\u011f\u0131t\u0131ma haz\u0131r bir halde beklemektedir.<\/p>\n<h2>Uygulaman\u0131n S\u00fcrekli Da\u011f\u0131t\u0131m\u0131 (CD): Azure Pipeline ile AKS'e Otomatik Da\u011f\u0131t\u0131m Nas\u0131l Yap\u0131l\u0131r?<\/h2>\n<p>S\u00fcrekli Entegrasyon (CI) a\u015famas\u0131nda Docker g\u00f6r\u00fcnt\u00fcm\u00fcz\u00fc ba\u015far\u0131yla olu\u015fturup Azure Container Registry'ye (ACR) g\u00f6nderdik ve Kubernetes manifest dosyalar\u0131m\u0131z\u0131 bir artefakt olarak yay\u0131nlad\u0131k. \u015eimdi s\u0131ra S\u00fcrekli Da\u011f\u0131t\u0131m (CD) a\u015famas\u0131nda: Bu g\u00f6r\u00fcnt\u00fcy\u00fc Azure Kubernetes Service (AKS) k\u00fcmemize otomatik olarak da\u011f\u0131tmak. Bu b\u00f6l\u00fcmde, <code>azure-pipelines.yml<\/code> dosyam\u0131z\u0131 geni\u015fleterek, AKS'e da\u011f\u0131t\u0131m g\u00f6revini nas\u0131l ekleyece\u011fimizi ve bu s\u00fcreci nas\u0131l otomatikle\u015ftirece\u011fimizi detayl\u0131 bir \u015fekilde inceleyece\u011fiz.<\/p>\n<p>CD a\u015famas\u0131, CI a\u015famas\u0131n\u0131n \u00e7\u0131kt\u0131s\u0131 olan derlenmi\u015f ve test edilmi\u015f kodun, bir ortamda (test, haz\u0131rl\u0131k veya \u00fcretim) otomatik olarak yay\u0131nlanmas\u0131 s\u00fcrecidir. Bu, insan m\u00fcdahalesini en aza indirir, hatalar\u0131 azalt\u0131r ve uygulaman\u0131n pazara sunulma s\u00fcresini \u00f6nemli \u00f6l\u00e7\u00fcde h\u0131zland\u0131r\u0131r.<\/p>\n<p><code>azure-pipelines.yml<\/code> dosyam\u0131z\u0131 g\u00fcncelleyerek, <code>Deploy<\/code> ad\u0131nda yeni bir stage ekleyece\u011fiz. Bu stage, bir \u00f6nceki <code>Build<\/code> stage'inden ba\u011f\u0131ms\u0131z olarak veya ba\u015far\u0131l\u0131 bir <code>Build<\/code> sonras\u0131 tetiklenecek \u015fekilde yap\u0131land\u0131r\u0131labilir. Basitlik ad\u0131na, \u015fimdilik ayn\u0131 pipeline i\u00e7inde ayr\u0131 bir stage olarak ele alaca\u011f\u0131z:<\/p>\n<pre><code class=\"language-yaml\"># azure-pipelines.yml (CI a\u015famas\u0131na ek olarak)\n# ... (\u00f6nceki CI kodlar\u0131: trigger, variables, Build stage)\n\n- stage: Deploy\n  displayName: Deploy to AKS\n  dependsOn: Build # Bu stage, Build stage'i ba\u015far\u0131yla tamamland\u0131\u011f\u0131nda \u00e7al\u0131\u015f\u0131r\n  jobs:\n  - job: DeployJob\n    displayName: Deploy to AKS\n    pool:\n      vmImage: 'ubuntu-latest'\n    \n    variables:\n      # Kubernetes manifest dosya yolu\n      kubernetesManifestPath: '$(Pipeline.Workspace)\/kubernetes_manifests' \n      imagePullSecretName: 'acr-secret' # ACR secret ad\u0131\n\n    steps:\n    - task: DownloadPipelineArtifact@2\n      inputs:\n        artifact: 'kubernetes_manifests'\n        path: '$(kubernetesManifestPath)'\n      displayName: 'Download Kubernetes Manifests'\n\n    - task: AzureCLI@2\n      displayName: 'Create\/Update imagePullSecret for ACR'\n      inputs:\n        azureSubscription: '$(acrServiceConnection)'\n        scriptType: 'bash'\n        scriptLocation: 'inlineScript'\n        inlineScript: |\n          # ACR login server'\u0131 al\u0131n\n          ACR_LOGIN_SERVER=$(az acr show --name $(acrName) --query loginServer --output tsv)\n          \n          # ACR admin kullan\u0131c\u0131 ad\u0131 ve \u015fifresini al\u0131n\n          ACR_USERNAME=$(az acr credential show --name $(acrName) --query \"username\" --output tsv)\n          ACR_PASSWORD=$(az acr credential show --name $(acrName) --query \"passwords[0].value\" --output tsv)\n          \n          # Kubernetes secret'\u0131n\u0131 olu\u015fturun veya g\u00fcncelleyin\n          kubectl create secret docker-registry $(imagePullSecretName) \\\n            --docker-server=$ACR_LOGIN_SERVER \\\n            --docker-username=$ACR_USERNAME \\\n            --docker-password=$ACR_PASSWORD \\\n            --namespace default --dry-run=client -o yaml | kubectl apply -f -\n          \n          echo \"ACR secret '$(imagePullSecretName)' created\/updated in 'default' namespace.\"\n\n    - task: KubernetesManifest@1\n      displayName: Deploy to Kubernetes cluster\n      inputs:\n        action: deploy\n        kubernetesServiceConnection: '$(acrServiceConnection)' # Servis ba\u011flant\u0131m\u0131z\n        namespace: 'default' # Da\u011f\u0131t\u0131m yap\u0131lacak namespace\n        manifests: |\n          $(kubernetesManifestPath)\/deployment.yaml\n          $(kubernetesManifestPath)\/service.yaml\n        containers: |\n          $(acrName).azurecr.io\/$(imageRepository):$(tag) # Do\u011fru g\u00f6r\u00fcnt\u00fc ad\u0131n\u0131 ve etiketini kullan\n        imagePullSecrets: '$(imagePullSecretName)' # G\u00f6r\u00fcnt\u00fc \u00e7ekme secret'\u0131n\u0131 belirt\n        # rollOutRestart: true # Da\u011f\u0131t\u0131mdan sonra t\u00fcm pod'lar\u0131 yeniden ba\u015flat\n<\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi bu yeni <code>Deploy<\/code> stage'ini detayl\u0131ca inceleyelim:<\/p>\n<ul>\n<li><code>stage: Deploy<\/code>: Bu, da\u011f\u0131t\u0131m s\u00fcrecini temsil eden yeni a\u015famam\u0131zd\u0131r.<\/li>\n<li><code>dependsOn: Build<\/code>: Bu, <code>Deploy<\/code> stage'inin yaln\u0131zca <code>Build<\/code> stage'i ba\u015far\u0131yla tamamland\u0131\u011f\u0131nda \u00e7al\u0131\u015faca\u011f\u0131n\u0131 garanti eder. Bu, CI\/CD ak\u0131\u015f\u0131nda mant\u0131ksal bir s\u0131ralama sa\u011flar.<\/li>\n<li><code>jobs: - job: DeployJob<\/code>: Bu a\u015famadaki da\u011f\u0131t\u0131m g\u00f6revini tan\u0131mlayan bir i\u015ftir.<\/li>\n<li><code>pool: vmImage: &#039;ubuntu-latest&#039;<\/code>: Da\u011f\u0131t\u0131m i\u00e7in de ayn\u0131 Ubuntu tabanl\u0131 ajan\u0131 kullan\u0131yoruz.<\/li>\n<li><code>variables<\/code>: Bu a\u015famaya \u00f6zel de\u011fi\u015fkenler tan\u0131ml\u0131yoruz. <code>kubernetesManifestPath<\/code>, CI a\u015famas\u0131nda yay\u0131mlad\u0131\u011f\u0131m\u0131z artefaktlar\u0131n indirilece\u011fi yolu belirtir. <code>imagePullSecretName<\/code> ise ACR'den g\u00f6r\u00fcnt\u00fc \u00e7ekerken kullan\u0131lacak secret ad\u0131d\u0131r.<\/li>\n<li><code>steps<\/code>:\n<ul>\n<li><code>DownloadPipelineArtifact@2<\/code>: Bu g\u00f6rev, \u00f6nceki <code>Build<\/code> stage'inde <code>PublishBuildArtifacts<\/code> g\u00f6reviyle yay\u0131mlad\u0131\u011f\u0131m\u0131z <code>kubernetes_manifests<\/code> artefakt\u0131n\u0131 indirir. Bu artefakt, <code>deployment.yaml<\/code> ve <code>service.yaml<\/code> dosyalar\u0131m\u0131z\u0131 i\u00e7erir.<\/li>\n<li><code>AzureCLI@2 - Create\/Update imagePullSecret for ACR<\/code>: Bu kritik ad\u0131m, AKS'in \u00f6zel kay\u0131t defterinizden (ACR) Docker g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc \u00e7ekebilmesi i\u00e7in gerekli olan <code>imagePullSecrets<\/code>'\u0131 olu\u015fturur veya g\u00fcnceller.\n<ul>\n<li><code>az acr show<\/code> ve <code>az acr credential show<\/code> komutlar\u0131 ile ACR'nin giri\u015f sunucusunu, y\u00f6netici kullan\u0131c\u0131 ad\u0131n\u0131 ve \u015fifresini al\u0131r\u0131z.<\/li>\n<li><code>kubectl create secret docker-registry<\/code> komutu, bu bilgileri kullanarak Kubernetes'te bir <code>docker-registry<\/code> tipinde secret olu\u015fturur. <code>--dry-run=client -o yaml | kubectl apply -f -<\/code> yap\u0131s\u0131, secret'\u0131 \u00f6nce YAML olarak olu\u015fturup sonra <code>kubectl apply<\/code> ile uygulamam\u0131z\u0131 sa\u011flar, bu da idempotency (tekrar \u00e7al\u0131\u015ft\u0131r\u0131labilir olma) sa\u011flar. E\u011fer secret zaten varsa, g\u00fcncellenir.<\/li>\n<li>Bu secret, <code>default<\/code> namespace'inde olu\u015fturulur. E\u011fer uygulaman\u0131z farkl\u0131 bir namespace kullan\u0131yorsa, <code>--namespace<\/code> de\u011ferini de\u011fi\u015ftirmeyi unutmay\u0131n.<\/li>\n<\/ul>\n<\/li>\n<li><code>KubernetesManifest@1 - Deploy to Kubernetes cluster<\/code>: Bu, AKS'e da\u011f\u0131t\u0131m yapman\u0131n ana g\u00f6revidir.\n<ul>\n<li><code>action: deploy<\/code>: Da\u011f\u0131t\u0131m eylemini belirtir.<\/li>\n<li><code>kubernetesServiceConnection: &#039;$(acrServiceConnection)&#039;<\/code>: \u00d6nceki ad\u0131mlarda olu\u015fturdu\u011fumuz Azure Resource Manager servis ba\u011flant\u0131s\u0131n\u0131 kullan\u0131r. Bu ba\u011flant\u0131, Pipeline'\u0131n AKS k\u00fcmesine komutlar g\u00f6ndermesini sa\u011flar.<\/li>\n<li><code>namespace: &#039;default&#039;<\/code>: Uygulaman\u0131n hangi Kubernetes namespace'ine da\u011f\u0131t\u0131laca\u011f\u0131n\u0131 belirtir.<\/li>\n<li><code>manifests<\/code>: Da\u011f\u0131t\u0131lacak Kubernetes manifest dosyalar\u0131n\u0131n yollar\u0131n\u0131 belirtir. Burada indirilen <code>deployment.yaml<\/code> ve <code>service.yaml<\/code> dosyalar\u0131n\u0131 kullan\u0131yoruz.<\/li>\n<li><code>containers: | $(acrName).azurecr.io\/$(imageRepository):$(tag)<\/code>: Bu k\u0131s\u0131m \u00e7ok \u00f6nemlidir. Kubernetes da\u011f\u0131t\u0131m manifestimizdeki <code>image<\/code> alan\u0131n\u0131 dinamik olarak g\u00fcnceller. <code>REPLACE_IMAGE_NAME:REPLACE_IMAGE_TAG<\/code> placeholder'\u0131n\u0131, CI a\u015famas\u0131nda olu\u015fturdu\u011fumuz ve ACR'ye g\u00f6nderdi\u011fimiz Docker g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fcn tam yolu ve etiketiyle de\u011fi\u015ftirir.<\/li>\n<li><code>imagePullSecrets: &#039;$(imagePullSecretName)&#039;<\/code>: Da\u011f\u0131t\u0131m s\u0131ras\u0131nda kullan\u0131lacak <code>imagePullSecrets<\/code>'\u0131 belirtir, b\u00f6ylece AKS, ACR'den g\u00f6r\u00fcnt\u00fcy\u00fc \u00e7ekebilir.<\/li>\n<li><code>rollOutRestart: true<\/code>: (Yorum sat\u0131r\u0131nda) Da\u011f\u0131t\u0131m tamamland\u0131ktan sonra pod'lar\u0131n yeniden ba\u015flat\u0131lmas\u0131n\u0131 sa\u011flar. Yeni konfig\u00fcrasyonlar\u0131n hemen uygulanmas\u0131 i\u00e7in faydal\u0131 olabilir.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><mark>Uzman \u0130pucu:<\/mark> Daha karma\u015f\u0131k da\u011f\u0131t\u0131m senaryolar\u0131 i\u00e7in Helm Charts kullanmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz. Helm, Kubernetes uygulamalar\u0131n\u0131 y\u00f6netmek i\u00e7in bir paket y\u00f6neticisidir. Bir uygulaman\u0131n t\u00fcm Kubernetes kaynaklar\u0131n\u0131 tek bir \"Chart\" i\u00e7inde paketlemenizi ve kolayca da\u011f\u0131tman\u0131z\u0131, y\u00fckseltmenizi ve geri alman\u0131z\u0131 sa\u011flar. Azure Pipelines, Helm g\u00f6revlerini de destekler. Ayr\u0131ca, da\u011f\u0131t\u0131m stratejileri olarak Canary Da\u011f\u0131t\u0131mlar\u0131 (yeni s\u00fcr\u00fcm\u00fc k\u00fc\u00e7\u00fck bir kullan\u0131c\u0131 grubuna da\u011f\u0131t\u0131p g\u00f6zlemleme) veya Blue\/Green Da\u011f\u0131t\u0131mlar\u0131 (eski ve yeni s\u00fcr\u00fcm\u00fc ayn\u0131 anda \u00e7al\u0131\u015ft\u0131r\u0131p trafik y\u00f6nlendirme) gibi daha geli\u015fmi\u015f y\u00f6ntemleri ke\u015ffetmek, kesintisiz g\u00fcncellemeler ve daha az riskli da\u011f\u0131t\u0131mlar i\u00e7in \u00f6nemlidir. Bu stratejiler, <code>KubernetesManifest@1<\/code> g\u00f6revinin sundu\u011fu <code>strategy<\/code> parametresi ile veya daha karma\u015f\u0131k senaryolarda ba\u011f\u0131ms\u0131z ara\u00e7larla (\u00f6rne\u011fin Istio, Linkerd) entegre edilerek uygulanabilir.<\/p>\n<p>Bu <code>azure-pipelines.yml<\/code> dosyas\u0131n\u0131 depomuza kaydettikten sonra, her kod de\u011fi\u015fikli\u011finde (veya manuel tetiklemeyle), uygulamam\u0131z otomatik olarak derlenecek, Docker g\u00f6r\u00fcnt\u00fcs\u00fc olu\u015fturulacak, ACR'ye g\u00f6nderilecek ve ard\u0131ndan AKS k\u00fcmemize da\u011f\u0131t\u0131lacakt\u0131r. Bu, modern DevOps'un g\u00fcc\u00fcn\u00fc sergileyen tam otomatik bir CI\/CD ak\u0131\u015f\u0131d\u0131r. Uygulaman\u0131z\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fc boyunca tutarl\u0131l\u0131k, h\u0131z ve g\u00fcvenilirlik sa\u011flar. Art\u0131k, da\u011f\u0131t\u0131m s\u00fcreci otomatize edildi\u011fi i\u00e7in geli\u015ftiriciler, yeni \u00f6zelliklere odaklanabilirken, operasyon ekipleri de daha az manuel m\u00fcdahale ile ortamlar\u0131 y\u00f6netebilir.<\/p>\n<h2>AKS ve Azure Pipelines Entegrasyonunda \u0130leri D\u00fczey Uygulamalar Nelerdir?<\/h2>\n<p>Temel bir CI\/CD ak\u0131\u015f\u0131n\u0131 kurup uygulamam\u0131z\u0131 AKS'e da\u011f\u0131tt\u0131k. Ancak Azure Kubernetes Service ve Azure Pipelines entegrasyonu, daha karma\u015f\u0131k ve g\u00fcvenli senaryolar i\u00e7in bir\u00e7ok ileri d\u00fczey yetenek sunar. Bu b\u00f6l\u00fcmde, deneyimli kullan\u0131c\u0131lar i\u00e7in uygulamalar\u0131n y\u00f6netimini, g\u00fcvenli\u011fini ve izlenebilirli\u011fini art\u0131racak ipu\u00e7lar\u0131n\u0131 ve p\u00fcf noktalar\u0131n\u0131 ele alaca\u011f\u0131z. Bu ileri d\u00fczey uygulamalar, b\u00fcy\u00fck \u00f6l\u00e7ekli ve kurumsal projelerde ba\u015far\u0131l\u0131 bir da\u011f\u0131t\u0131m stratejisi olu\u015fturman\u0131n anahtar\u0131d\u0131r.<\/p>\n<h3>Helm Charts ile Da\u011f\u0131t\u0131m Y\u00f6netimi<\/h3>\n<p>Kubernetes manifest dosyalar\u0131, k\u00fc\u00e7\u00fck uygulamalar i\u00e7in yeterli olabilirken, karma\u015f\u0131k mikroservis mimarileri ve farkl\u0131 ortamlar i\u00e7in y\u00f6netimi zorla\u015fabilir. \u0130\u015fte burada <a href=\"https:\/\/helm.sh\/\">Helm<\/a> devreye girer. Helm, Kubernetes i\u00e7in bir paket y\u00f6neticisidir. Uygulamalar\u0131n t\u00fcm Kubernetes kaynaklar\u0131n\u0131 (Deployment, Service, Ingress, ConfigMap vb.) tek bir paket (Chart) i\u00e7inde birle\u015ftirmenizi sa\u011flar. Bu Chart'lar, de\u011ferleri (\u00f6rne\u011fin, g\u00f6r\u00fcnt\u00fc etiketi, replika say\u0131s\u0131, ortam de\u011fi\u015fkenleri) parametrele\u015ftirmeye olanak tan\u0131r, b\u00f6ylece ayn\u0131 Chart'\u0131 farkl\u0131 ortamlara (geli\u015ftirme, test, \u00fcretim) kolayca uyarlayabilirsiniz.<\/p>\n<pre><code class=\"language-yaml\"># azure-pipelines.yml i\u00e7inde Helm ile da\u011f\u0131t\u0131m \u00f6rne\u011fi\n- task: HelmInstaller@1\n  displayName: 'Install Helm'\n  inputs:\n    helmVersion: 'latest'\n\n- task: HelmDeploy@0\n  displayName: 'Deploy Helm Chart to AKS'\n  inputs:\n    command: 'upgrade'\n    chartType: 'FilePath'\n    chartPath: '$(Pipeline.Workspace)\/helm_charts\/mywebapp' # Helm Chart'\u0131n yolu\n    releaseName: 'mywebapp-release' # Helm s\u00fcr\u00fcm\u00fcn\u00fcn ad\u0131\n    namespace: 'default'\n    # G\u00f6r\u00fcnt\u00fc etiketini ve di\u011fer de\u011ferleri override etme\n    values: |\n      image.tag=$(tag)\n      image.repository=$(acrName).azurecr.io\/$(imageRepository)\n      replicaCount=3\n    arguments: '--install --atomic' # E\u011fer yoksa kur, ba\u015far\u0131l\u0131 olmazsa rollback yap\n    # Kubernetes servis ba\u011flant\u0131s\u0131 zaten tan\u0131ml\u0131 olmal\u0131\n    # kubernetesServiceConnection: '$(acrServiceConnection)'\n<\/pre>\n<p><\/code><\/p>\n<p>Helm, s\u00fcr\u00fcm kontrol\u00fc, kolay geri alma (rollback) ve ba\u011f\u0131ml\u0131l\u0131k y\u00f6netimi gibi \u00f6zellikler sunarak, Kubernetes da\u011f\u0131t\u0131mlar\u0131n\u0131z\u0131 \u00e7ok daha y\u00f6netilebilir hale getirir. Azure Pipelines, <code>HelmInstaller@1<\/code> ve <code>HelmDeploy@0<\/code> gibi \u00f6zel g\u00f6revlerle Helm entegrasyonunu kolayla\u015ft\u0131r\u0131r.<\/p>\n<h3>Ortam Bazl\u0131 Da\u011f\u0131t\u0131mlar (Geli\u015ftirme, Test, \u00dcretim)<\/h3>\n<p>Ger\u00e7ek d\u00fcnya senaryolar\u0131nda, uygulamalar\u0131 do\u011frudan \u00fcretime da\u011f\u0131tmadan \u00f6nce farkl\u0131 ortamlarda test etmek istenir. Azure Pipelines, <code>environments<\/code> ve <code>stages<\/code> \u00f6zellikleri ile bu senaryoyu kolayca y\u00f6netmenizi sa\u011flar. Her ortam (Dev, Test, Prod) i\u00e7in ayr\u0131 bir stage tan\u0131mlayabilir, onay kap\u0131lar\u0131 (approval gates) ekleyebilir ve belirli kullan\u0131c\u0131lar\u0131n veya gruplar\u0131n onay\u0131 olmadan bir da\u011f\u0131t\u0131m\u0131n bir sonraki ortama ge\u00e7mesini engelleyebilirsiniz. Bu, da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinize ek bir g\u00fcvenlik katman\u0131 ekler.<\/p>\n<pre><code class=\"language-yaml\"># Farkl\u0131 ortamlar i\u00e7in pipeline tan\u0131m\u0131\nstages:\n- stage: Build\n  # ... (Build stage kodlar\u0131)\n\n- stage: DeployToDev\n  displayName: 'Deploy to Development'\n  dependsOn: Build\n  environment: 'Development' # Ortam tan\u0131m\u0131\n  jobs:\n  - deployment: DeployDev\n    # ... (Dev ortam\u0131na da\u011f\u0131t\u0131m ad\u0131mlar\u0131)\n\n- stage: DeployToProd\n  displayName: 'Deploy to Production'\n  dependsOn: DeployToDev\n  condition: succeeded('DeployToDev') # Dev ba\u015far\u0131l\u0131ysa \u00e7al\u0131\u015ft\u0131r\n  environment: 'Production'\n  jobs:\n  - deployment: DeployProd\n    # ... (Prod ortam\u0131na da\u011f\u0131t\u0131m ad\u0131mlar\u0131)\n<\/pre>\n<p><\/code><\/p>\n<p>Bu yap\u0131da, Production ortam\u0131na da\u011f\u0131t\u0131mdan \u00f6nce manuel bir onay ad\u0131m\u0131 ekleyebilir, g\u00fcvenlik taramalar\u0131 \u00e7al\u0131\u015ft\u0131rabilir veya performans testleri yapabilirsiniz.<\/p>\n<h3>Azure Key Vault Entegrasyonu ile Hassas Veri Y\u00f6netimi<\/h3>\n<p>Uygulamalar genellikle veritaban\u0131 ba\u011flant\u0131 dizeleri, API anahtarlar\u0131 veya di\u011fer hassas bilgileri saklamak zorundad\u0131r. Bu t\u00fcr bilgileri do\u011frudan kodda veya Kubernetes manifestlerinde saklamak b\u00fcy\u00fck bir g\u00fcvenlik riskidir. Azure Key Vault, \u015fifreleri, anahtarlar\u0131 ve sertifikalar\u0131 g\u00fcvenli bir \u015fekilde depolamak ve bunlara eri\u015fimi kontrol etmek i\u00e7in kullan\u0131lan bulut tabanl\u0131 bir hizmettir. Azure Pipelines, Key Vault ile entegrasyonu kolayla\u015ft\u0131r\u0131r.<\/p>\n<pre><code class=\"language-yaml\"># Azure Key Vault'tan secret \u00e7ekme\nvariables:\n  - group: MySecrets # Azure DevOps de\u011fi\u015fken gruplar\u0131na eklenen Key Vault group\n# MySecrets group'u i\u00e7inde \"DbConnection\" ad\u0131nda bir secret oldu\u011fu varsay\u0131l\u0131r.\n\nsteps:\n- task: KubernetesManifest@1\n  inputs:\n    # ...\n    # A\u015fa\u011f\u0131daki gibi, uygulama i\u00e7indeki bir de\u011fi\u015fken olarak kullanabiliriz\n    # veya Kubernetes secret'\u0131 olarak deploy edebiliriz.\n- script: echo \"Database Connection String: $(DbConnection)\"\n  displayName: 'Display DB Connection (only for demo, avoid in prod)'\n<\/pre>\n<p><\/code><\/p>\n<p>Key Vault'tan \u00e7ekilen secret'lar\u0131 Kubernetes secret'lar\u0131 olarak AKS'e da\u011f\u0131tabilir veya Pod'lara ortam de\u011fi\u015fkenleri olarak enjekte edebilirsiniz. Bu, hassas verilerinizi g\u00fcvende tutman\u0131n ve merkezi olarak y\u00f6netmenin en iyi yoludur.<\/p>\n<h3>Monitoring ve Logging (Azure Monitor, Log Analytics)<\/h3>\n<p>Da\u011f\u0131t\u0131lan uygulamalar\u0131n performans\u0131n\u0131 ve sa\u011fl\u0131\u011f\u0131n\u0131 s\u00fcrekli olarak izlemek, sorunlar\u0131 proaktif olarak tespit etmek ve \u00e7\u00f6zmek i\u00e7in hayati \u00f6neme sahiptir. AKS, Azure Monitor ve Log Analytics ile derinlemesine entegrasyon sunar. AKS k\u00fcmesi olu\u015ftururken <code>--enable-addons monitoring<\/code> parametresini kullanarak veya sonradan etkinle\u015ftirerek, konteynerlerinizden, pod'lar\u0131n\u0131zdan ve d\u00fc\u011f\u00fcmlerinizden metrikleri ve g\u00fcnl\u00fckleri otomatik olarak toplayabilirsiniz. Azure Pipelines, bu izleme verilerini kullanarak da\u011f\u0131t\u0131m sonras\u0131 sa\u011fl\u0131k kontrolleri yapabilir. \u00d6rne\u011fin, yeni bir s\u00fcr\u00fcm da\u011f\u0131t\u0131ld\u0131ktan sonra CPU veya bellek kullan\u0131m\u0131nda ani bir art\u0131\u015f olup olmad\u0131\u011f\u0131n\u0131 kontrol edebilir ve anormal bir durum varsa otomatik olarak geri alma (rollback) i\u015flemini tetikleyebilir.<\/p>\n<h3>G\u00fcvenlik (RBAC, Azure Policy)<\/h3>\n<p>AKS'in g\u00fcvenlik \u00f6zellikleri, kurumsal d\u00fczeyde uygulamalar i\u00e7in vazge\u00e7ilmezdir. Azure Active Directory (AAD) tabanl\u0131 Role-Based Access Control (RBAC) entegrasyonu sayesinde, hangi kullan\u0131c\u0131n\u0131n veya servisin Kubernetes k\u00fcmesinde hangi kaynaklara eri\u015febilece\u011fini detayl\u0131 bir \u015fekilde kontrol edebilirsiniz. Azure Policy ise, AKS k\u00fcmelerinizdeki g\u00fcvenlik ve uyumluluk politikalar\u0131n\u0131 zorunlu k\u0131lman\u0131z\u0131 sa\u011flar. \u00d6rne\u011fin, sadece belirli bir kay\u0131t defterinden g\u00f6r\u00fcnt\u00fc \u00e7ekilmesini veya sadece onaylanm\u0131\u015f g\u00f6r\u00fcnt\u00fclerin kullan\u0131lmas\u0131n\u0131 zorunlu k\u0131labilirsiniz. Azure Pipelines'\u0131n servis ba\u011flant\u0131lar\u0131 da bu RBAC prensiplerine uygun olarak minimum ayr\u0131cal\u0131k ilkesiyle yap\u0131land\u0131r\u0131lmal\u0131d\u0131r.<\/p>\n<h3>GitOps Yakla\u015f\u0131mlar\u0131 (Flux CD, Argo CD)<\/h3>\n<p>Geli\u015fmi\u015f senaryolarda, Kubernetes da\u011f\u0131t\u0131mlar\u0131n\u0131 y\u00f6netmek i\u00e7in GitOps yakla\u015f\u0131mlar\u0131 pop\u00fclerlik kazanmaktad\u0131r. GitOps, da\u011f\u0131t\u0131m state'ini (istenilen durumu) Git depolar\u0131nda tutarak, de\u011fi\u015fikliklerin deklaratif ve versiyon kontrol\u00fc alt\u0131nda olmas\u0131n\u0131 sa\u011flar. Flux CD veya Argo CD gibi ara\u00e7lar, Git deposundaki de\u011fi\u015fiklikleri s\u00fcrekli olarak izler ve Kubernetes k\u00fcmenizin durumunu bu depodaki tan\u0131ma e\u015fitlemeye \u00e7al\u0131\u015f\u0131r. Azure Pipelines, bu GitOps ara\u00e7lar\u0131n\u0131 tetikleyerek veya bunlarla entegre olarak, CI a\u015famas\u0131n\u0131 y\u00f6netirken, CD'yi GitOps operat\u00f6rlerine devredebilir. Bu, da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinin denetlenebilirli\u011fini ve g\u00fcvenilirli\u011fini art\u0131r\u0131r.<\/p>\n<p><mark>Uzman \u0130pucu:<\/mark> Mobil uyumlu HTML tasar\u0131m\u0131, i\u00e7eri\u011finizin farkl\u0131 cihazlarda (telefon, tablet) d\u00fczg\u00fcn g\u00f6r\u00fcnt\u00fclenmesi i\u00e7in \u00f6nemlidir. Bu makale saf HTML \u00e7\u0131kt\u0131s\u0131 verdi\u011finden, CSS media query \u00f6rnekleri do\u011frudan dahil edilemez. Ancak, uygulaman\u0131z\u0131n web aray\u00fcz\u00fcn\u00fc tasarlarken <code>viewport<\/code> meta etiketini kullanmak (<code><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><\/code>), esnek bir grid sistemi uygulamak ve g\u00f6rselleri \u00f6l\u00e7eklenebilir hale getirmek (<code>max-width: 100%; height: auto;<\/code>) mobil uyumluluk i\u00e7in at\u0131labilecek ilk ad\u0131mlard\u0131r. CSS'te <code>@media<\/code> kurallar\u0131n\u0131 kullanarak farkl\u0131 ekran boyutlar\u0131na \u00f6zel stiller tan\u0131mlayabilirsiniz (\u00f6rn. <code>@media (max-width: 768px) { ... }<\/code>).<\/p>\n<p>Bu ileri d\u00fczey uygulamalar, AKS ve Azure Pipelines entegrasyonunuzu daha olgun, g\u00fcvenli ve verimli hale getirmenize yard\u0131mc\u0131 olacakt\u0131r. Her bir konu ba\u015fl\u0131\u011f\u0131, kendi i\u00e7inde derinlemesine bilgi gerektirse de, bu genel bak\u0131\u015f, DevOps yolculu\u011funuzda bir sonraki ad\u0131mlar\u0131 belirlemeniz i\u00e7in bir yol haritas\u0131 sunar. Otomasyonu, g\u00fcvenli\u011fi ve izlenebilirli\u011fi bir araya getirerek, modern bulut uygulamalar\u0131n\u0131 ba\u015far\u0131l\u0131 bir \u015fekilde y\u00f6netebilirsiniz.<\/p>\n<h2>B\u00fcy\u00fck \u00d6l\u00e7ekli Bir \u015eirketin Mikroservis Da\u011f\u0131t\u0131m Yolculu\u011fu: Bir Vaka Analizi<\/h2>\n<p>Bir e-ticaret devinin, \"GlobalMarket\" ad\u0131nda, on y\u0131ldan uzun s\u00fcredir monolitik bir yap\u0131 \u00fczerinde \u00e7al\u0131\u015fan ve pazar\u0131n h\u0131zla de\u011fi\u015fen taleplerine ayak uydurmakta zorlanan bir platformu oldu\u011funu hayal edin. Yeni \u00f6zelliklerin devreye al\u0131nmas\u0131 haftalar s\u00fcr\u00fcyor, da\u011f\u0131t\u0131mlar genellikle kesintilere yol a\u00e7\u0131yor ve geli\u015ftirme ekipleri farkl\u0131 mod\u00fcller \u00fczerinde birbirlerinin i\u015fini engelliyordu. GlobalMarket, bu sorunlar\u0131 \u00e7\u00f6zmek ve rekabet avantaj\u0131n\u0131 geri kazanmak i\u00e7in platformunu mikroservis mimarisine ta\u015f\u0131maya ve DevOps k\u00fclt\u00fcr\u00fcn\u00fc benimsemeye karar verdi. Bu d\u00f6n\u00fc\u015f\u00fcm yolculu\u011funda Azure Kubernetes Service (AKS) ve Azure Pipelines kritik rol oynad\u0131.<\/p>\n<h3>Mevcut Durum ve Zorluklar<\/h3>\n<p>GlobalMarket'in eski platformu, b\u00fcy\u00fck bir Java uygulamas\u0131yd\u0131 ve t\u00fcm i\u015f mant\u0131\u011f\u0131 tek bir kod taban\u0131nda yer al\u0131yordu. Bu monolitik yap\u0131, a\u015fa\u011f\u0131daki zorluklar\u0131 beraberinde getiriyordu:<\/p>\n<ul>\n<li><strong>Yava\u015f Da\u011f\u0131t\u0131mlar:<\/strong> Uygulaman\u0131n k\u00fc\u00e7\u00fck bir b\u00f6l\u00fcm\u00fcndeki bir de\u011fi\u015fiklik bile t\u00fcm uygulaman\u0131n yeniden derlenip da\u011f\u0131t\u0131lmas\u0131n\u0131 gerektiriyordu, bu da haftal\u0131k da\u011f\u0131t\u0131m d\u00f6ng\u00fcleri anlam\u0131na geliyordu.<\/li>\n<li><strong>\u00d6l\u00e7eklenebilirlik Sorunlar\u0131:<\/strong> Sadece belirli bir mod\u00fcl (\u00f6rne\u011fin sepet) yo\u011fun talep g\u00f6rse bile, t\u00fcm uygulaman\u0131n \u00f6l\u00e7eklenmesi gerekiyordu, bu da kaynak israf\u0131na yol a\u00e7\u0131yordu.<\/li>\n<li><strong>Geli\u015ftirici Verimlili\u011fi:<\/strong> B\u00fcy\u00fck kod taban\u0131, farkl\u0131 ekiplerin e\u015f zamanl\u0131 \u00e7al\u0131\u015fmas\u0131n\u0131 zorla\u015ft\u0131r\u0131yordu. Bir ekip bir mod\u00fclde de\u011fi\u015fiklik yaparken, di\u011fer ekiplerin i\u015fleri etkilenebiliyordu.<\/li>\n<li><strong>G\u00fcvenilirlik ve Kurtarma:<\/strong> T\u00fcm uygulama tek bir hata noktas\u0131nda oldu\u011fu i\u00e7in, bir mod\u00fcldeki hata t\u00fcm platformu \u00e7\u00f6kertme potansiyeli ta\u015f\u0131yordu. Geri alma (rollback) s\u00fcre\u00e7leri karma\u015f\u0131kt\u0131.<\/li>\n<\/ul>\n<h3>D\u00f6n\u00fc\u015f\u00fcm Yolculu\u011fu ve \u00c7\u00f6z\u00fcmler<\/h3>\n<p>GlobalMarket, bu zorluklar\u0131 a\u015fmak i\u00e7in platformunu yakla\u015f\u0131k 50 farkl\u0131 mikroservise ay\u0131rma karar\u0131 ald\u0131. Her mikroservis, kendi i\u015f alan\u0131na odaklanacak ve ba\u011f\u0131ms\u0131z olarak geli\u015ftirilip da\u011f\u0131t\u0131labilecekti. Bu yeni mimari i\u00e7in bulut tabanl\u0131 bir konteyner orkestrasyon platformu ve g\u00fc\u00e7l\u00fc bir CI\/CD sistemi gerekiyordu.<\/p>\n<ol>\n<li><strong>AKS'e Ge\u00e7i\u015f:<\/strong> GlobalMarket, mikroservislerini \u00e7al\u0131\u015ft\u0131rmak i\u00e7in Azure Kubernetes Service'i (AKS) se\u00e7ti. AKS'in y\u00f6netilen hizmet yap\u0131s\u0131 sayesinde, GlobalMarket'in operasyon ekipleri Kubernetes ana d\u00fc\u011f\u00fcmlerinin y\u00f6netimiyle u\u011fra\u015fmak yerine, uygulamalar\u0131n da\u011f\u0131t\u0131m\u0131na ve sa\u011fl\u0131\u011f\u0131na odaklanabildi. AKS'in otomatik \u00f6l\u00e7ekleme yetenekleri, Kara Cuma gibi yo\u011fun talep d\u00f6nemlerinde platformun sorunsuz \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flarken, bo\u015f zamanlarda kaynaklar\u0131 optimize ederek maliyet tasarrufu sa\u011flad\u0131.<\/li>\n<li><strong>Azure Pipelines ile CI\/CD:<\/strong> Her mikroservis i\u00e7in ayr\u0131 bir Git deposu olu\u015fturuldu ve her depo i\u00e7in Azure Pipelines'da YAML tabanl\u0131 CI\/CD pipeline'lar\u0131 tan\u0131mland\u0131. Bu pipeline'lar, her kod de\u011fi\u015fikli\u011finde a\u015fa\u011f\u0131daki ad\u0131mlar\u0131 otomatik olarak ger\u00e7ekle\u015ftiriyordu:\n<ul>\n<li><strong>Derleme ve Test:<\/strong> Mikroservisin kodu derleniyor, birim ve entegrasyon testleri \u00e7al\u0131\u015ft\u0131r\u0131l\u0131yordu.<\/li>\n<li><strong>Docker G\u00f6r\u00fcnt\u00fcs\u00fc Olu\u015fturma:<\/strong> Ba\u015far\u0131l\u0131 testlerin ard\u0131ndan, mikroservisin bir Docker g\u00f6r\u00fcnt\u00fcs\u00fc olu\u015fturuluyordu. \u00c7ok a\u015famal\u0131 derlemeler kullan\u0131larak g\u00f6r\u00fcnt\u00fc boyutlar\u0131 minimize ediliyordu.<\/li>\n<li><strong>ACR'ye G\u00f6nderme:<\/strong> Olu\u015fturulan Docker g\u00f6r\u00fcnt\u00fcs\u00fc, Azure Container Registry (ACR) \u00fczerine g\u00f6nderiliyordu. ACR'nin entegre g\u00fcvenlik taramalar\u0131, g\u00f6r\u00fcnt\u00fclerde bilinen g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 tespit etmeye yard\u0131mc\u0131 oluyordu.<\/li>\n<li><strong>Helm ile Da\u011f\u0131t\u0131m:<\/strong> Her mikroservis i\u00e7in bir Helm Chart olu\u015fturulmu\u015ftu. Azure Pipelines, ACR'deki yeni g\u00f6r\u00fcnt\u00fcy\u00fc kullanarak Helm Chart'\u0131 AKS'e da\u011f\u0131t\u0131yordu. Helm'in parametrele\u015ftirme \u00f6zelli\u011fi sayesinde, ayn\u0131 Chart geli\u015ftirme, test ve \u00fcretim ortamlar\u0131na kolayca uyarlanabiliyordu.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Ortam Bazl\u0131 Da\u011f\u0131t\u0131m ve Onay Kap\u0131lar\u0131:<\/strong> GlobalMarket, da\u011f\u0131t\u0131m s\u00fcrecini Geli\u015ftirme, Test, Haz\u0131rl\u0131k (Staging) ve \u00dcretim (Production) olmak \u00fczere d\u00f6rt a\u015famal\u0131 bir yakla\u015f\u0131mla tasarlad\u0131. Her ortam aras\u0131nda otomatik testler ve manuel onay kap\u0131lar\u0131 eklenerek, uygulaman\u0131n kalitesi ve g\u00fcvenli\u011fi garanti alt\u0131na al\u0131nd\u0131. \u00d6rne\u011fin, Haz\u0131rl\u0131k ortam\u0131na da\u011f\u0131t\u0131mdan sonra otomatik performans testleri \u00e7al\u0131\u015ft\u0131r\u0131l\u0131yor, \u00dcretim ortam\u0131na ge\u00e7i\u015f ise Operasyon Ekibi Lideri'nin onay\u0131yla ger\u00e7ekle\u015fiyordu.<\/li>\n<li><strong>Azure Key Vault Entegrasyonu:<\/strong> Veritaban\u0131 ba\u011flant\u0131 dizeleri, API anahtarlar\u0131 gibi hassas bilgiler Azure Key Vault'ta saklan\u0131yordu. Azure Pipelines, bu secret'lar\u0131 g\u00fcvenli bir \u015fekilde \u00e7ekip Kubernetes Secret'lar\u0131 olarak AKS'e da\u011f\u0131t\u0131yordu, b\u00f6ylece hassas veriler asla kod depolar\u0131nda yer alm\u0131yordu.<\/li>\n<li><strong>\u0130zleme ve G\u00f6zlemlenebilirlik:<\/strong> AKS k\u00fcmeleri ve mikroservisler, Azure Monitor ve Log Analytics ile entegre edildi. Bu sayede, performans metrikleri, g\u00fcnl\u00fckler ve hatalar merkezi olarak toplan\u0131p analiz edilebiliyordu. Operasyon ekipleri, Prometheus ve Grafana gibi ara\u00e7larla bu verileri g\u00f6rselle\u015ftirerek, olas\u0131 sorunlar\u0131 proaktif olarak tespit edebiliyordu.<\/li>\n<\/ol>\n<h3>Elde Edilen Kazan\u0131mlar<\/h3>\n<p>Bu d\u00f6n\u00fc\u015f\u00fcm\u00fcn ard\u0131ndan GlobalMarket, \u00f6nemli kazan\u0131mlar elde etti:<\/p>\n<ul>\n<li><strong>H\u0131zlanan Da\u011f\u0131t\u0131mlar:<\/strong> Yeni \u00f6zelliklerin pazara sunulma s\u00fcresi haftalardan saatlere indi. Geli\u015ftiriciler, ba\u011f\u0131ms\u0131z olarak \u00f6zellikler \u00fczerinde \u00e7al\u0131\u015f\u0131p, kodlar\u0131n\u0131 birka\u00e7 saat i\u00e7inde \u00fcretime da\u011f\u0131tabiliyorlard\u0131.<\/li>\n<li><strong>Artan G\u00fcvenilirlik:<\/strong> Mikroservislerin izole yap\u0131s\u0131 ve otomatik geri alma yetenekleri sayesinde, bir servisteki hata t\u00fcm platformu etkilemiyordu. Hata oranlar\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde azald\u0131.<\/li>\n<li><strong>Kaynak Verimlili\u011fi:<\/strong> AKS'in otomatik \u00f6l\u00e7ekleme \u00f6zelli\u011fi sayesinde, sadece ihtiya\u00e7 duyulan mikroservisler \u00f6l\u00e7eklenerek, bulut maliyetlerinde belirgin bir azalma sa\u011fland\u0131.<\/li>\n<li><strong>Geli\u015ftirici Otonomisi ve Verimlili\u011fi:<\/strong> Ekipler, kendi mikroservisleri \u00fczerinde tam otonomiye sahip oldu, bu da yenilik\u00e7ili\u011fi te\u015fvik etti ve geli\u015ftirici verimlili\u011fini art\u0131rd\u0131.<\/li>\n<\/ul>\n<p>GlobalMarket'in vaka analizi, AKS ve Azure Pipelines entegrasyonunun, b\u00fcy\u00fck ve karma\u015f\u0131k sistemlerin modernizasyonunda nas\u0131l bir kataliz\u00f6r g\u00f6revi g\u00f6rebilece\u011fini a\u00e7\u0131k\u00e7a ortaya koymaktad\u0131r. Bu entegrasyon, yaln\u0131zca teknik bir iyile\u015ftirme de\u011fil, ayn\u0131 zamanda i\u015f s\u00fcre\u00e7lerini ve \u015firket k\u00fclt\u00fcr\u00fcn\u00fc de d\u00f6n\u00fc\u015ft\u00fcren kapsaml\u0131 bir DevOps yolculu\u011funun temelini olu\u015fturmu\u015ftur.<\/p>\n<h2>Azure Pipelines ile AKS Da\u011f\u0131t\u0131m\u0131n\u0131n Gelece\u011fi ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Azure Kubernetes Service (AKS) ve Azure Pipelines entegrasyonu, modern bulut yerel uygulama da\u011f\u0131t\u0131m\u0131 i\u00e7in g\u00fc\u00e7l\u00fc, esnek ve \u00f6l\u00e7eklenebilir bir \u00e7\u00f6z\u00fcm sunmaktad\u0131r. Bu makale boyunca, temel kavramlardan ileri d\u00fczey uygulamalara kadar bu entegrasyonun nas\u0131l kurulaca\u011f\u0131n\u0131 ve y\u00f6netilece\u011fini ad\u0131m ad\u0131m inceledik. G\u00f6rd\u00fck ki, kod de\u011fi\u015fikliklerinin otomatik olarak derlenmesinden, Docker g\u00f6r\u00fcnt\u00fclerinin olu\u015fturulmas\u0131na, Azure Container Registry'ye (ACR) g\u00f6nderilmesinden, son olarak AKS'e g\u00fcvenli ve otomatik bir \u015fekilde da\u011f\u0131t\u0131lmas\u0131na kadar t\u00fcm s\u00fcre\u00e7ler Azure Pipelines ile sorunsuz bir \u015fekilde otomatize edilebilmektedir.<\/p>\n<p>Bu otomasyon, geli\u015ftirme ekiplerinin \u00fcretkenli\u011fini art\u0131r\u0131r, insan hatas\u0131n\u0131 minimize eder, da\u011f\u0131t\u0131m h\u0131z\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r ve yaz\u0131l\u0131m\u0131n pazara sunulma s\u00fcresini (Time-to-Market) k\u0131salt\u0131r. AKS'in y\u00f6netilen hizmet yap\u0131s\u0131, operasyonel y\u00fck\u00fc Azure'a devrederek ekiplerin daha \u00e7ok i\u015f de\u011feri katmaya odaklanmas\u0131n\u0131 sa\u011flar. Ayr\u0131ca, Helm gibi ara\u00e7larla entegrasyon, ortam bazl\u0131 da\u011f\u0131t\u0131mlar, Azure Key Vault ile hassas veri y\u00f6netimi ve kapsaml\u0131 izleme yetenekleri, kurumsal d\u00fczeyde uygulama ya\u015fam d\u00f6ng\u00fcs\u00fc y\u00f6netimini daha da g\u00fc\u00e7lendirir.<\/p>\n<p>Gelecekte, bulut yerel teknolojiler ve DevOps pratikleri daha da yayg\u0131nla\u015facak, otomasyonun kapsam\u0131 artacak ve yapay zeka\/makine \u00f6\u011frenimi destekli operasyonlar (AIOps) ile s\u00fcre\u00e7ler daha ak\u0131ll\u0131 hale gelecektir. Azure Pipelines ve AKS gibi platformlar, bu evrimin \u00f6n saflar\u0131nda yer almaya devam edecektir. S\u00fcrekli iyile\u015ftirme, g\u00fcvenlik ve \u00f6l\u00e7eklenebilirlik, her zaman \u00f6ncelikli olmaya devam edecek ve bu ara\u00e7lar, i\u015fletmelerin bu hedeflere ula\u015fmas\u0131na yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<p>Bu g\u00fc\u00e7l\u00fc entegrasyonu benimsemek, sadece teknik bir tercih de\u011fil, ayn\u0131 zamanda \u00e7evikli\u011fi, g\u00fcvenilirli\u011fi ve rekabet g\u00fcc\u00fcn\u00fc art\u0131ran stratejik bir yat\u0131r\u0131md\u0131r. Art\u0131k uygulamalar\u0131n\u0131z\u0131 Azure Kubernetes Service'e Azure Pipelines ile da\u011f\u0131tmak i\u00e7in gereken bilgiye ve kaynaklara sahipsiniz. Bu yolculukta ba\u015far\u0131lar dileriz!<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<p><strong>1. Azure Pipelines ile AKS'e da\u011f\u0131t\u0131m yaparken g\u00fcvenlik i\u00e7in nelere dikkat etmeliyim?<\/strong><\/p>\n<p><strong>Cevap:<\/strong> G\u00fcvenlik, CI\/CD s\u00fcrecinin her a\u015famas\u0131nda \u00f6ncelikli olmal\u0131d\u0131r. Dikkat etmeniz gereken ba\u015fl\u0131ca noktalar \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Servis Ba\u011flant\u0131lar\u0131:<\/strong> Azure DevOps'taki servis ba\u011flant\u0131lar\u0131n\u0131za en az ayr\u0131cal\u0131k ilkesiyle izinler verin. Yaln\u0131zca gerekli kaynaklara (AKS, ACR) eri\u015fim sa\u011flay\u0131n.<\/li>\n<li><strong>Azure Key Vault:<\/strong> Hassas verileri (veritaban\u0131 \u015fifreleri, API anahtarlar\u0131 vb.) do\u011frudan manifestlerde veya pipeline de\u011fi\u015fkenlerinde saklamak yerine Azure Key Vault'ta y\u00f6netin ve pipeline'lar arac\u0131l\u0131\u011f\u0131yla g\u00fcvenli bir \u015fekilde \u00e7ekin.<\/li>\n<li><strong>Docker G\u00f6r\u00fcnt\u00fcs\u00fc G\u00fcvenli\u011fi:<\/strong> Azure Container Registry'nin g\u00fcvenlik taramalar\u0131n\u0131 (Defender for Cloud) etkinle\u015ftirin veya pipeline'a \u00fc\u00e7\u00fcnc\u00fc taraf g\u00fcvenlik taray\u0131c\u0131lar\u0131 entegre edin. Yaln\u0131zca g\u00fcvenilir taban g\u00f6r\u00fcnt\u00fcler kullan\u0131n.<\/li>\n<li><strong>Kubernetes RBAC:<\/strong> AKS'te kullan\u0131c\u0131 ve servis hesaplar\u0131na en az ayr\u0131cal\u0131k ilkesine g\u00f6re Role-Based Access Control (RBAC) rolleri atay\u0131n.<\/li>\n<li><strong>A\u011f G\u00fcvenli\u011fi:<\/strong> AKS k\u00fcmeleriniz i\u00e7in Azure Sanal A\u011flar\u0131 (VNet) kullanarak a\u011f segmentasyonu ve g\u00fcvenlik gruplar\u0131yla eri\u015fim kontrol\u00fc sa\u011flay\u0131n.<\/li>\n<\/ul>\n<p><strong>2. Azure Pipelines'ta da\u011f\u0131t\u0131m sonras\u0131 geri alma (rollback) nas\u0131l yap\u0131l\u0131r?<\/strong><\/p>\n<p><strong>Cevap:<\/strong> Kubernetes'in yerle\u015fik <code>Deployment<\/code> kaynaklar\u0131, geri alma yeteneklerine sahiptir. Azure Pipelines'ta bir da\u011f\u0131t\u0131m ba\u015far\u0131s\u0131z oldu\u011funda veya yeni s\u00fcr\u00fcmde sorunlar tespit edildi\u011finde, genellikle iki y\u00f6ntemle geri alma yapabilirsiniz:<\/p>\n<ul>\n<li><strong><code>kubectl rollout undo<\/code>:<\/strong> Bu komut, \u00f6nceki ba\u015far\u0131l\u0131 s\u00fcr\u00fcme geri d\u00f6nmenizi sa\u011flar. Azure Pipelines'ta <code>Kubernetes@1<\/code> g\u00f6revini kullanarak veya bir <code>AzureCLI@2<\/code> g\u00f6revi i\u00e7inde <code>kubectl rollout undo deployment\/mywebapp-deployment<\/code> komutunu \u00e7al\u0131\u015ft\u0131rarak geri alma i\u015flemi tetiklenebilir.<\/li>\n<li><strong>Pipeline Geri Alma:<\/strong> Azure DevOps'ta, \u00f6nceki ba\u015far\u0131l\u0131 bir derlemenin da\u011f\u0131t\u0131m\u0131n\u0131 yeniden \u00e7al\u0131\u015ft\u0131rarak da geri alma yapabilirsiniz. Bu, pipeline ge\u00e7mi\u015finden belirli bir derlemeyi se\u00e7ip \"Redeploy\" (Yeniden Da\u011f\u0131t) i\u015flevini kullanarak eski g\u00f6r\u00fcnt\u00fcy\u00fc ve manifestleri tekrar AKS'e da\u011f\u0131tman\u0131z\u0131 sa\u011flar.<\/li>\n<\/ul>\n<p><strong>3. Farkl\u0131 ortamlara (Dev, Test, Prod) nas\u0131l da\u011f\u0131t\u0131m yapabilirim?<\/strong><\/p>\n<p><strong>Cevap:<\/strong> Azure Pipelines, farkl\u0131 ortamlara da\u011f\u0131t\u0131m\u0131 y\u00f6netmek i\u00e7in g\u00fc\u00e7l\u00fc \u00f6zellikler sunar:<\/p>\n<ul>\n<li><strong>A\u015famalar (Stages):<\/strong> Pipeline'\u0131n\u0131z\u0131 <code>Build<\/code>, <code>DeployToDev<\/code>, <code>DeployToTest<\/code>, <code>DeployToProd<\/code> gibi ayr\u0131 a\u015famalara ay\u0131r\u0131n. Her a\u015fama, belirli bir ortama da\u011f\u0131t\u0131mdan sorumlu olabilir.<\/li>\n<li><strong>Ortamlar (Environments):<\/strong> Azure DevOps'ta \"Environments\" \u00f6zelli\u011fini kullanarak her da\u011f\u0131t\u0131m ortam\u0131n\u0131 tan\u0131mlay\u0131n. Bu ortamlar \u00fczerinde onay kap\u0131lar\u0131 (approval gates) ve kaynak kontrolleri tan\u0131mlayarak da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi daha g\u00fcvenli hale getirebilirsiniz.<\/li>\n<li><strong>De\u011fi\u015fkenler:<\/strong> Ortam bazl\u0131 farkl\u0131l\u0131klar\u0131 (veritaban\u0131 ba\u011flant\u0131 dizeleri, API URL'leri vb.) y\u00f6netmek i\u00e7in pipeline de\u011fi\u015fkenlerini veya de\u011fi\u015fken gruplar\u0131n\u0131 kullan\u0131n. Helm Charts kullan\u0131yorsan\u0131z, <code>values.yaml<\/code> dosyalar\u0131n\u0131 ortama \u00f6zel olarak yap\u0131land\u0131rabilirsiniz.<\/li>\n<li><strong>Ko\u015fullu Y\u00fcr\u00fctme:<\/strong> Her a\u015faman\u0131n, bir \u00f6nceki a\u015faman\u0131n ba\u015far\u0131s\u0131na veya belirli bir dalda (branch) yap\u0131lan de\u011fi\u015fikliklere ba\u011fl\u0131 olarak \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayabilirsiniz (<code>condition<\/code> ifadesi ile).<\/li>\n<\/ul>\n<p><strong>4. Azure Pipelines ile AKS'e da\u011f\u0131t\u0131m yaparken maliyetleri nas\u0131l optimize edebilirim?<\/strong><\/p>\n<p><strong>Cevap:<\/strong> Maliyet optimizasyonu i\u00e7in birka\u00e7 yakla\u015f\u0131m mevcuttur:<\/p>\n<ul>\n<li><strong>AKS Otomatik \u00d6l\u00e7ekleme:<\/strong> AKS'in yerle\u015fik otomatik \u00f6l\u00e7ekleme \u00f6zelliklerini (Horizontal Pod Autoscaler ve Cluster Autoscaler) kullanarak kaynaklar\u0131 talebe g\u00f6re dinamik olarak art\u0131r\u0131p azalt\u0131n.<\/li>\n<li><strong>Do\u011fru Boyutland\u0131rma:<\/strong> Konteynerleriniz i\u00e7in CPU ve bellek kaynak isteklerini (<code>requests<\/code>) ve limitlerini (<code>limits<\/code>) do\u011fru bir \u015fekilde belirleyin. Gereksiz yere fazla kaynak ay\u0131rmaktan ka\u00e7\u0131n\u0131n.<\/li>\n<li><strong>Kullan\u0131lmayan Kaynaklar\u0131 Kapatma:<\/strong> Geli\u015ftirme ve test ortamlar\u0131n\u0131zdaki AKS k\u00fcmelerini \u00e7al\u0131\u015fma saatleri d\u0131\u015f\u0131nda kapatmay\u0131 veya \u00f6l\u00e7e\u011fini k\u00fc\u00e7\u00fcltmeyi d\u00fc\u015f\u00fcnebilirsiniz.<\/li>\n<li><strong>Verimli Docker G\u00f6r\u00fcnt\u00fcleri:<\/strong> \u00c7ok a\u015famal\u0131 derlemeler ve <code>.dockerignore<\/code> kullanarak Docker g\u00f6r\u00fcnt\u00fclerinizin boyutunu k\u00fc\u00e7\u00fclt\u00fcn. Bu, kay\u0131t defteri depolama maliyetlerini ve a\u011f trafi\u011fini azalt\u0131r.<\/li>\n<li><strong>Spot \u00d6rnekler:<\/strong> AKS'te kesintiye dayan\u0131kl\u0131 i\u015f y\u00fckleri i\u00e7in daha uygun fiyatl\u0131 spot sanal makine \u00f6rneklerini kullanmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz.<\/li>\n<\/ul>\n<p><strong>5. Azure Pipelines, Kubernetes manifest dosyalar\u0131ndaki g\u00f6r\u00fcnt\u00fc etiketlerini otomatik olarak nas\u0131l g\u00fcnceller?<\/strong><\/p>\n<p><strong>Cevap:<\/strong> Azure Pipelines'taki <code>KubernetesManifest@1<\/code> g\u00f6revi, <code>containers<\/code> girdisi arac\u0131l\u0131\u011f\u0131yla bu i\u015flemi otomatik olarak ger\u00e7ekle\u015ftirir. Da\u011f\u0131t\u0131m g\u00f6revine <code>containers<\/code> parametresiyle do\u011fru g\u00f6r\u00fcnt\u00fc ad\u0131n\u0131 ve etiketini sa\u011flad\u0131\u011f\u0131n\u0131zda (\u00f6rne\u011fin, <code>myACRRegistry.azurecr.io\/mywebapp:$(tag)<\/code>), g\u00f6rev, <code>deployment.yaml<\/code> dosyan\u0131zdaki <code>image<\/code> alan\u0131n\u0131 dinamik olarak bu yeni de\u011ferle g\u00fcnceller. Bu sayede, manifest dosyas\u0131n\u0131 manuel olarak de\u011fi\u015ftirmeye gerek kalmaz ve CI\/CD s\u00fcreci tamamen otomatize edilmi\u015f olur. Ayr\u0131ca Helm Charts kullan\u0131yorsan\u0131z, <code>values<\/code> parametresiyle g\u00f6r\u00fcnt\u00fc etiketini ve kay\u0131t defteri bilgilerini kolayca ge\u00e7ersiz k\u0131labilirsiniz.<\/p>\n","protected":false},"excerpt":{"rendered":"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde uygulamalar\u0131n h\u0131zl\u0131, g\u00fcvenilir ve otomatik bir \u015fekilde da\u011f\u0131t\u0131lmas\u0131 kritik bir \u00f6neme sahiptir. Bu kapsaml\u0131&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":[1491],"tags":[],"class_list":{"0":"post-31304","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-kubernetes","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>Azure Kubernetes Service (AKS)&#039;e Azure Pipelines ile Uygulama Da\u011f\u0131t\u0131m\u0131 Rehberi<\/title>\n<meta name=\"description\" content=\"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde uygulamalar\u0131n h\u0131zl\u0131, g\u00fcvenilir ve otomatik bir \u015fekilde da\u011f\u0131t\u0131lmas\u0131 kritik bir \u00f6neme sahiptir. Bu kapsaml\u0131 rehber, Azure Kubernetes Service (AKS) \u00fczerine Azure Pipelines kullanarak Continuous Integration\/Continuous Delivery (CI\/CD) s\u00fcre\u00e7lerinin nas\u0131l kurulaca\u011f\u0131n\u0131 ad\u0131m ad\u0131m ele almaktad\u0131r. Bu y\u00f6ntemle yaz\u0131l\u0131m geli\u015ftiriciler, \u00fcretim ortam\u0131na kadar uzanan da\u011f\u0131t\u0131m ak\u0131\u015flar\u0131n\u0131 otomatize edebilir ve operasyonel verimlili\u011fi \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilirler.\" \/>\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\/azure-kubernetes-service-akse-azure-pipelines-ile-uygulama-dagitimi-rehberi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Azure Kubernetes Service (AKS)&#039;e Azure Pipelines ile Uygulama Da\u011f\u0131t\u0131m\u0131 Rehberi\" \/>\n<meta property=\"og:description\" content=\"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde uygulamalar\u0131n h\u0131zl\u0131, g\u00fcvenilir ve otomatik bir \u015fekilde da\u011f\u0131t\u0131lmas\u0131 kritik bir \u00f6neme sahiptir. Bu kapsaml\u0131 rehber, Azure Kubernetes Service (AKS) \u00fczerine Azure Pipelines kullanarak Continuous Integration\/Continuous Delivery (CI\/CD) s\u00fcre\u00e7lerinin nas\u0131l kurulaca\u011f\u0131n\u0131 ad\u0131m ad\u0131m ele almaktad\u0131r. Bu y\u00f6ntemle yaz\u0131l\u0131m geli\u015ftiriciler, \u00fcretim ortam\u0131na kadar uzanan da\u011f\u0131t\u0131m ak\u0131\u015flar\u0131n\u0131 otomatize edebilir ve operasyonel verimlili\u011fi \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilirler.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/azure-kubernetes-service-akse-azure-pipelines-ile-uygulama-dagitimi-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-08T09:02:25+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=\"46 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/azure-kubernetes-service-akse-azure-pipelines-ile-uygulama-dagitimi-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/azure-kubernetes-service-akse-azure-pipelines-ile-uygulama-dagitimi-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Azure Kubernetes Service (AKS)&#8217;e Azure Pipelines ile Uygulama Da\u011f\u0131t\u0131m\u0131 Rehberi\",\"datePublished\":\"2025-10-08T09:02:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/azure-kubernetes-service-akse-azure-pipelines-ile-uygulama-dagitimi-rehberi\/\"},\"wordCount\":7926,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Kubernetes\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/azure-kubernetes-service-akse-azure-pipelines-ile-uygulama-dagitimi-rehberi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/azure-kubernetes-service-akse-azure-pipelines-ile-uygulama-dagitimi-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/azure-kubernetes-service-akse-azure-pipelines-ile-uygulama-dagitimi-rehberi\/\",\"name\":\"Azure Kubernetes Service (AKS)'e Azure Pipelines ile Uygulama Da\u011f\u0131t\u0131m\u0131 Rehberi\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-08T09:02:25+00:00\",\"description\":\"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde uygulamalar\u0131n h\u0131zl\u0131, g\u00fcvenilir ve otomatik bir \u015fekilde da\u011f\u0131t\u0131lmas\u0131 kritik bir \u00f6neme sahiptir. Bu kapsaml\u0131 rehber, Azure Kubernetes Service (AKS) \u00fczerine Azure Pipelines kullanarak Continuous Integration\/Continuous Delivery (CI\/CD) s\u00fcre\u00e7lerinin nas\u0131l kurulaca\u011f\u0131n\u0131 ad\u0131m ad\u0131m ele almaktad\u0131r. Bu y\u00f6ntemle yaz\u0131l\u0131m geli\u015ftiriciler, \u00fcretim ortam\u0131na kadar uzanan da\u011f\u0131t\u0131m ak\u0131\u015flar\u0131n\u0131 otomatize edebilir ve operasyonel verimlili\u011fi \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilirler.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/azure-kubernetes-service-akse-azure-pipelines-ile-uygulama-dagitimi-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/azure-kubernetes-service-akse-azure-pipelines-ile-uygulama-dagitimi-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/azure-kubernetes-service-akse-azure-pipelines-ile-uygulama-dagitimi-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Azure Kubernetes Service (AKS)&#8217;e Azure Pipelines ile Uygulama Da\u011f\u0131t\u0131m\u0131 Rehberi\"}]},{\"@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":"Azure Kubernetes Service (AKS)'e Azure Pipelines ile Uygulama Da\u011f\u0131t\u0131m\u0131 Rehberi","description":"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde uygulamalar\u0131n h\u0131zl\u0131, g\u00fcvenilir ve otomatik bir \u015fekilde da\u011f\u0131t\u0131lmas\u0131 kritik bir \u00f6neme sahiptir. Bu kapsaml\u0131 rehber, Azure Kubernetes Service (AKS) \u00fczerine Azure Pipelines kullanarak Continuous Integration\/Continuous Delivery (CI\/CD) s\u00fcre\u00e7lerinin nas\u0131l kurulaca\u011f\u0131n\u0131 ad\u0131m ad\u0131m ele almaktad\u0131r. Bu y\u00f6ntemle yaz\u0131l\u0131m geli\u015ftiriciler, \u00fcretim ortam\u0131na kadar uzanan da\u011f\u0131t\u0131m ak\u0131\u015flar\u0131n\u0131 otomatize edebilir ve operasyonel verimlili\u011fi \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilirler.","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\/azure-kubernetes-service-akse-azure-pipelines-ile-uygulama-dagitimi-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"Azure Kubernetes Service (AKS)'e Azure Pipelines ile Uygulama Da\u011f\u0131t\u0131m\u0131 Rehberi","og_description":"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde uygulamalar\u0131n h\u0131zl\u0131, g\u00fcvenilir ve otomatik bir \u015fekilde da\u011f\u0131t\u0131lmas\u0131 kritik bir \u00f6neme sahiptir. Bu kapsaml\u0131 rehber, Azure Kubernetes Service (AKS) \u00fczerine Azure Pipelines kullanarak Continuous Integration\/Continuous Delivery (CI\/CD) s\u00fcre\u00e7lerinin nas\u0131l kurulaca\u011f\u0131n\u0131 ad\u0131m ad\u0131m ele almaktad\u0131r. Bu y\u00f6ntemle yaz\u0131l\u0131m geli\u015ftiriciler, \u00fcretim ortam\u0131na kadar uzanan da\u011f\u0131t\u0131m ak\u0131\u015flar\u0131n\u0131 otomatize edebilir ve operasyonel verimlili\u011fi \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilirler.","og_url":"https:\/\/fatihsoysal.com\/blog\/azure-kubernetes-service-akse-azure-pipelines-ile-uygulama-dagitimi-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-08T09:02:25+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"46 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/azure-kubernetes-service-akse-azure-pipelines-ile-uygulama-dagitimi-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/azure-kubernetes-service-akse-azure-pipelines-ile-uygulama-dagitimi-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Azure Kubernetes Service (AKS)&#8217;e Azure Pipelines ile Uygulama Da\u011f\u0131t\u0131m\u0131 Rehberi","datePublished":"2025-10-08T09:02:25+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/azure-kubernetes-service-akse-azure-pipelines-ile-uygulama-dagitimi-rehberi\/"},"wordCount":7926,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Kubernetes"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/azure-kubernetes-service-akse-azure-pipelines-ile-uygulama-dagitimi-rehberi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/azure-kubernetes-service-akse-azure-pipelines-ile-uygulama-dagitimi-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/azure-kubernetes-service-akse-azure-pipelines-ile-uygulama-dagitimi-rehberi\/","name":"Azure Kubernetes Service (AKS)'e Azure Pipelines ile Uygulama Da\u011f\u0131t\u0131m\u0131 Rehberi","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-08T09:02:25+00:00","description":"Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde uygulamalar\u0131n h\u0131zl\u0131, g\u00fcvenilir ve otomatik bir \u015fekilde da\u011f\u0131t\u0131lmas\u0131 kritik bir \u00f6neme sahiptir. Bu kapsaml\u0131 rehber, Azure Kubernetes Service (AKS) \u00fczerine Azure Pipelines kullanarak Continuous Integration\/Continuous Delivery (CI\/CD) s\u00fcre\u00e7lerinin nas\u0131l kurulaca\u011f\u0131n\u0131 ad\u0131m ad\u0131m ele almaktad\u0131r. Bu y\u00f6ntemle yaz\u0131l\u0131m geli\u015ftiriciler, \u00fcretim ortam\u0131na kadar uzanan da\u011f\u0131t\u0131m ak\u0131\u015flar\u0131n\u0131 otomatize edebilir ve operasyonel verimlili\u011fi \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilirler.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/azure-kubernetes-service-akse-azure-pipelines-ile-uygulama-dagitimi-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/azure-kubernetes-service-akse-azure-pipelines-ile-uygulama-dagitimi-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/azure-kubernetes-service-akse-azure-pipelines-ile-uygulama-dagitimi-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Azure Kubernetes Service (AKS)&#8217;e Azure Pipelines ile Uygulama Da\u011f\u0131t\u0131m\u0131 Rehberi"}]},{"@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\/31304","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=31304"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31304\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31304"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31304"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31304"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}