{"id":41399,"date":"2026-04-24T19:01:04","date_gmt":"2026-04-24T16:01:04","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/kuberneteste-uygulama-yonetimi-helm-ile-tanisin\/"},"modified":"2026-04-24T19:01:04","modified_gmt":"2026-04-24T16:01:04","slug":"kuberneteste-uygulama-yonetimi-helm-ile-tanisin","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/kuberneteste-uygulama-yonetimi-helm-ile-tanisin\/","title":{"rendered":"Kubernetes&#8217;te Uygulama Y\u00f6netimi: Helm ile Tan\u0131\u015f\u0131n"},"content":{"rendered":"<p>&#8220;`html<br \/>\n<body><\/p>\n<h2>Kubernetes&#8217;te Uygulama Y\u00f6netimi: Helm ile Tan\u0131\u015f\u0131n<\/h2>\n<p>Kubernetes ekosisteminde uygulamalar\u0131n\u0131z\u0131 paketlemek, da\u011f\u0131tmak ve y\u00f6netmek karma\u015f\u0131k bir s\u00fcre\u00e7 olabilir. Peki ya t\u00fcm bu s\u00fcreci basitle\u015ftirecek, tekrarlayan g\u00f6revleri otomatikle\u015ftirecek ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi standartla\u015ft\u0131racak bir arac\u0131n\u0131z olsa? \u0130\u015fte bu noktada Helm devreye giriyor. Bu makalede, Kubernetes&#8217;te uygulama y\u00f6netimi konusunu en temelden ba\u015flayarak, ad\u0131m ad\u0131m Helm&#8217;in g\u00fcc\u00fcn\u00fc ke\u015ffedece\u011fiz. Uygulamalar\u0131n\u0131z\u0131 nas\u0131l daha verimli y\u00f6netebilece\u011finizi, tekrarlayan komutlardan kurtulup daha stratejik konulara odaklanabilece\u011finizi \u00f6\u011freneceksiniz. \u00d6zellikle CI\/CD (S\u00fcrekli Entegrasyon\/S\u00fcrekli Da\u011f\u0131t\u0131m) pipeline&#8217;lar\u0131n\u0131zda Helm&#8217;in nas\u0131l bir oyun de\u011fi\u015ftirici olabilece\u011fine dair ipu\u00e7lar\u0131 bulacaks\u0131n\u0131z.<\/p>\n<h2>Helm Nedir ve Neden Kullanmal\u0131y\u0131z?<\/h2>\n<p>G\u00fcn\u00fcm\u00fczde mikroservis mimarileri ve konteyner teknolojileri h\u0131zla yayg\u0131nla\u015f\u0131yor. Bu durum, uygulamalar\u0131n daha mod\u00fcler ve ba\u011f\u0131ms\u0131z hale gelmesini sa\u011flarken, ayn\u0131 zamanda da\u011f\u0131t\u0131m ve y\u00f6netim s\u00fcre\u00e7lerini de bir o kadar karma\u015f\u0131kla\u015ft\u0131r\u0131yor. \u0130\u015fte bu noktada Kubernetes gibi orkestrasyon ara\u00e7lar\u0131 devreye giriyor. Kubernetes, konteynerize edilmi\u015f uygulamalar\u0131n\u0131z\u0131n da\u011f\u0131t\u0131m\u0131n\u0131, \u00f6l\u00e7eklendirilmesini ve y\u00f6netimini otomatikle\u015ftirmemize olanak tan\u0131yor. Ancak, Kubernetes&#8217;in kendi ba\u015f\u0131na sundu\u011fu manifest dosyalar\u0131 (YAML format\u0131nda tan\u0131mlanan kaynaklar), \u00f6zellikle karma\u015f\u0131k uygulamalar i\u00e7in y\u00f6netimi zor ve tekrarlayan bir hale getirebiliyor. Bir uygulaman\u0131n birden fazla servisi, veritaban\u0131, yap\u0131land\u0131rma dosyas\u0131 ve g\u00fcvenlik ayar\u0131 olabilir. Bunlar\u0131n her birini ayr\u0131 ayr\u0131 tan\u0131mlamak ve g\u00fcncellemeleri y\u00f6netmek zaman al\u0131c\u0131 ve hataya a\u00e7\u0131k bir s\u00fcre\u00e7tir.<\/p>\n<p>\u0130\u015fte tam da bu sorunlara \u00e7\u00f6z\u00fcm sunmak i\u00e7in <strong>Helm<\/strong> ortaya \u00e7\u0131k\u0131yor. Helm, Kubernetes i\u00e7in bir paket y\u00f6neticisidir. T\u0131pk\u0131 Linux&#8217;taki APT veya Red Hat&#8217;teki YUM gibi, Helm de Kubernetes uygulamalar\u0131 i\u00e7in paketleme, da\u011f\u0131t\u0131m ve ya\u015fam d\u00f6ng\u00fcs\u00fc y\u00f6netimi sa\u011flar. Helm ile uygulamalar\u0131n\u0131z\u0131 &#8220;Chart&#8221; ad\u0131 verilen paketler halinde tan\u0131mlayabilirsiniz. Bu Chart&#8217;lar, uygulaman\u0131z\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in gereken t\u00fcm Kubernetes kaynaklar\u0131n\u0131 (Deployment, Service, ConfigMap, Secret, PersistentVolume vb.) i\u00e7eren \u015fablonlard\u0131r. Helm&#8217;in en b\u00fcy\u00fck avantajlar\u0131ndan biri, bu \u015fablonlar\u0131 parametrelendirebilmesidir. Yani, ayn\u0131 Chart&#8217;\u0131 farkl\u0131 ortamlar (geli\u015ftirme, test, \u00fcretim) i\u00e7in farkl\u0131 yap\u0131land\u0131rmalarla kolayca da\u011f\u0131tabilirsiniz. \u00d6rne\u011fin, bir veritaban\u0131 ba\u011flant\u0131 dizesini veya bir servis portunu Chart&#8217;\u0131 da\u011f\u0131t\u0131rken belirleyebilirsiniz. Bu, kod tekrar\u0131n\u0131 \u00f6nler ve yap\u0131land\u0131rma y\u00f6netimini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde basitle\u015ftirir.<\/p>\n<p>Helm kullanman\u0131n temel nedenleri \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>Paketleme ve Yeniden Kullan\u0131labilirlik:<\/strong> Uygulamalar\u0131n\u0131z\u0131 ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 tek bir birimde paketleyerek farkl\u0131 ortamlarda kolayca yeniden kullanabilirsiniz.<\/li>\n<li><strong>Parametrelendirme:<\/strong> Chart&#8217;lar\u0131n\u0131z\u0131 farkl\u0131 ortamlar i\u00e7in \u00f6zelle\u015ftirebilirsiniz. Bu, ayn\u0131 uygulaman\u0131n farkl\u0131 yap\u0131land\u0131rmalarla da\u011f\u0131t\u0131lmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><strong>Versiyonlama ve Geri Alma:<\/strong> Helm, da\u011f\u0131t\u0131mlar\u0131n\u0131z\u0131 versiyonlar halinde y\u00f6netir. Bir hata durumunda \u00f6nceki s\u00fcr\u00fcme kolayca geri d\u00f6nebilirsiniz.<\/li>\n<li><strong>Ba\u011f\u0131ml\u0131l\u0131k Y\u00f6netimi:<\/strong> Bir uygulaman\u0131n ba\u015fka bir uygulamaya ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 varsa, Helm bu ba\u011f\u0131ml\u0131l\u0131klar\u0131 otomatik olarak y\u00f6netebilir.<\/li>\n<li><strong>Standartla\u015ft\u0131rma:<\/strong> Uygulama da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi standartla\u015ft\u0131rarak ekip i\u00e7inde tutarl\u0131l\u0131k sa\u011flar ve yeni ekip \u00fcyelerinin s\u00fcrece daha h\u0131zl\u0131 adapte olmas\u0131na yard\u0131mc\u0131 olur.<\/li>\n<li><strong>Community Charts:<\/strong> Helm Hub gibi platformlarda y\u00fczlerce haz\u0131r Chart bulunmaktad\u0131r. Pop\u00fcler veritabanlar\u0131, mesaj kuyruklar\u0131 ve di\u011fer altyap\u0131 bile\u015fenlerini kolayca Kubernetes&#8217;e da\u011f\u0131tabilirsiniz.<\/li>\n<\/ul>\n<p>K\u0131sacas\u0131, Helm, Kubernetes \u00fczerinde uygulama y\u00f6netimi y\u00fck\u00fcn\u00fc \u00f6nemli \u00f6l\u00e7\u00fcde azaltarak geli\u015ftiricilerin ve operasyon ekiplerinin daha verimli \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar. Tekrarlayan ve s\u0131k\u0131c\u0131 g\u00f6revleri otomatikle\u015ftiren Helm, sizlerin daha stratejik ve yenilik\u00e7i projelere odaklanmas\u0131na olanak tan\u0131r.<\/p>\n<h2>Helm Chart&#8217;lar\u0131 Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h2>\n<p>Helm Chart&#8217;lar\u0131, Kubernetes uygulamalar\u0131n\u0131z\u0131n da\u011f\u0131t\u0131m\u0131 i\u00e7in gerekli t\u00fcm bilgileri i\u00e7eren standartla\u015ft\u0131r\u0131lm\u0131\u015f bir dizin yap\u0131s\u0131na sahip paketlerdir. Bir Chart, uygulaman\u0131z\u0131n hangi Kubernetes kaynaklar\u0131na ihtiya\u00e7 duydu\u011funu tan\u0131mlayan \u015fablonlar (templates) ve bu \u015fablonlar\u0131 \u00f6zelle\u015ftirmek i\u00e7in kullan\u0131lan de\u011ferler (values) gibi temel bile\u015fenlerden olu\u015fur. Bu yap\u0131y\u0131 daha iyi anlamak i\u00e7in, bir Helm Chart&#8217;\u0131n\u0131n temel dizin yap\u0131s\u0131n\u0131 inceleyelim:<\/p>\n<pre><code>chart-ad\u0131\/\n    \u251c\u2500\u2500 Chart.yaml         # Chart'\u0131n meta verileri (ad\u0131, s\u00fcr\u00fcm\u00fc, a\u00e7\u0131klamas\u0131 vb.)\n    \u251c\u2500\u2500 values.yaml        # Varsay\u0131lan yap\u0131land\u0131rma de\u011ferleri\n    \u251c\u2500\u2500 charts\/            # Alt-Chart'lar (ba\u011f\u0131ml\u0131l\u0131klar)\n    \u2514\u2500\u2500 templates\/         # Kubernetes manifest \u015fablonlar\u0131\n        \u251c\u2500\u2500 deployment.yaml\n        \u251c\u2500\u2500 service.yaml\n        \u251c\u2500\u2500 ingress.yaml\n        \u2514\u2500\u2500 _helpers.tpl   # Yard\u0131mc\u0131 \u015fablonlar (iste\u011fe ba\u011fl\u0131)\n    <\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi bu bile\u015fenlere daha yak\u0131ndan bakal\u0131m:<\/p>\n<h3>Chart.yaml: Chart'\u0131n Kimlik Kart\u0131<\/h3>\n<p><code>Chart.yaml<\/code> dosyas\u0131, Helm Chart'\u0131n\u0131z\u0131n temel meta verilerini i\u00e7erir. Bu dosya, Chart'\u0131n ad\u0131, s\u00fcr\u00fcm\u00fc, a\u00e7\u0131klamas\u0131, geli\u015ftiricisi ve hangi Kubernetes s\u00fcr\u00fcmleriyle uyumlu oldu\u011fu gibi bilgileri bar\u0131nd\u0131r\u0131r. Bu bilgiler, Helm'in Chart'\u0131 tan\u0131mas\u0131 ve y\u00f6netmesi i\u00e7in kritik \u00f6neme sahiptir. \u00d6rne\u011fin, bir Chart'\u0131n s\u00fcr\u00fcm\u00fcn\u00fc belirterek, belirli bir versiyonu kurabilir veya g\u00fcncelleyebilirsiniz.<\/p>\n<h3>values.yaml: Yap\u0131land\u0131rman\u0131n Kalbi<\/h3>\n<p><code>values.yaml<\/code> dosyas\u0131, Chart'\u0131n\u0131z\u0131n varsay\u0131lan yap\u0131land\u0131rma de\u011ferlerini tan\u0131mlar. Bu dosya, uygulaman\u0131z\u0131n farkl\u0131 ortamlarda nas\u0131l davranaca\u011f\u0131n\u0131 belirleyen anahtar-de\u011fer \u00e7iftlerini i\u00e7erir. \u00d6rne\u011fin, bir web uygulamas\u0131n\u0131n ka\u00e7 replikaya sahip olaca\u011f\u0131n\u0131, hangi portu dinleyece\u011fini, veritaban\u0131 ba\u011flant\u0131 bilgilerini veya harici servislerin adreslerini burada tan\u0131mlayabilirsiniz. Bu de\u011ferler, Chart'\u0131 kurarken veya g\u00fcncellerken \u00fczerine yaz\u0131larak (override edilerek) \u00f6zelle\u015ftirilebilir. Bu, Helm'in esnekli\u011finin temelini olu\u015fturur.<\/p>\n<h3>templates\/ Dizin: Kubernetes Manifest \u015eablonlar\u0131<\/h3>\n<p><code>templates\/<\/code> dizini, uygulaman\u0131z\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in gereken t\u00fcm Kubernetes manifest dosyalar\u0131n\u0131 (Deployment, Service, ConfigMap, Secret, Ingress vb.) bar\u0131nd\u0131r\u0131r. Ancak bu dosyalar, standart YAML dosyalar\u0131 de\u011fil, Go template motoru kullan\u0131larak olu\u015fturulmu\u015f \u015fablonlard\u0131r. Bu \u015fablonlar, <code>values.yaml<\/code> dosyas\u0131ndaki de\u011fi\u015fkenleri kullanarak dinamik olarak olu\u015fturulur. \u00d6rne\u011fin, bir Deployment \u015fablonunda, replika say\u0131s\u0131n\u0131 <code>{{ .Values.replicaCount }}<\/code> gibi bir ifadeyle belirleyebilirsiniz. Helm, bu \u015fablonlar\u0131 <code>values.yaml<\/code> dosyas\u0131ndaki de\u011ferlerle doldurarak ger\u00e7ek Kubernetes manifestlerini olu\u015fturur ve Kubernetes API'sine g\u00f6nderir.<\/p>\n<h3>_helpers.tpl: Tekrar\u0131 \u00d6nleyen Yard\u0131mc\u0131lar<\/h3>\n<p><code>_helpers.tpl<\/code> dosyas\u0131, s\u0131k kullan\u0131lan \u015fablon par\u00e7ac\u0131klar\u0131n\u0131 tan\u0131mlamak i\u00e7in kullan\u0131l\u0131r. Bu, \u00f6zellikle karma\u015f\u0131k Chart'larda kod tekrar\u0131n\u0131 \u00f6nlemeye yard\u0131mc\u0131 olur. \u00d6rne\u011fin, bir servis ad\u0131 veya etiket (label) gibi tekrar eden tan\u0131mlamalar\u0131 bir helper fonksiyonu i\u00e7inde tan\u0131mlayabilir ve farkl\u0131 \u015fablonlarda bu fonksiyonu \u00e7a\u011f\u0131rabilirsiniz. Bu, Chart'\u0131n okunabilirli\u011fini ve bak\u0131m\u0131n\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n<h3>charts\/ Dizin: Ba\u011f\u0131ml\u0131l\u0131k Y\u00f6netimi<\/h3>\n<p><code>charts\/<\/code> dizini, ana Chart'\u0131n\u0131z\u0131n ba\u011f\u0131ml\u0131 oldu\u011fu di\u011fer Chart'lar\u0131 i\u00e7erir. Bu, karma\u015f\u0131k uygulamalar\u0131n, \u00f6rne\u011fin bir web uygulamas\u0131 ile birlikte gelen bir veritaban\u0131 veya mesaj kuyru\u011fu gibi ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00f6netmek i\u00e7in kullan\u0131l\u0131r. Helm, bir ana Chart'\u0131 kurdu\u011funda, <code>charts\/<\/code> dizinindeki t\u00fcm alt-Chart'lar\u0131 da otomatik olarak kurar. Bu \u00f6zellik, uygulamalar\u0131n\u0131z\u0131n t\u00fcm bile\u015fenlerinin birlikte tutarl\u0131 bir \u015fekilde da\u011f\u0131t\u0131lmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Bu yap\u0131 sayesinde Helm, Kubernetes'te uygulamalar\u0131 y\u00f6netmek i\u00e7in g\u00fc\u00e7l\u00fc ve esnek bir \u00e7er\u00e7eve sunar. Tekrarlayan YAML dosyalar\u0131 yazmak yerine, uygulaman\u0131z\u0131n mant\u0131\u011f\u0131n\u0131 ve yap\u0131land\u0131rmas\u0131n\u0131 odaklanabilirsiniz.<\/p>\n<h2>\u0130lk Helm Chart'\u0131n\u0131z\u0131 Olu\u015fturma: Ad\u0131m Ad\u0131m Rehber<\/h2>\n<p>\u015eimdiye kadar Helm'in ne oldu\u011funu ve nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 teorik olarak anlad\u0131k. \u015eimdi s\u0131ra geldi kendi ilk Helm Chart'\u0131m\u0131z\u0131 olu\u015fturmaya. Bu s\u00fcre\u00e7 olduk\u00e7a basittir ve birka\u00e7 temel komutla tamamlanabilir. Bu ad\u0131m ad\u0131m rehber, size yol g\u00f6sterecektir.<\/p>\n<h3>1. Helm Kurulumu<\/h3>\n<p>\u00d6ncelikle bilgisayar\u0131n\u0131zda Helm'in kurulu olmas\u0131 gerekiyor. E\u011fer kurulu de\u011filse, resmi Helm belgelerinden i\u015fletim sisteminize uygun kurulum talimatlar\u0131n\u0131 takip edebilirsiniz. Genellikle tek bir komutla veya bir paket y\u00f6neticisi arac\u0131l\u0131\u011f\u0131yla kolayca kurulabilir.<\/p>\n<h3>2. Yeni Bir Chart Olu\u015fturma<\/h3>\n<p>Yeni bir Helm Chart olu\u015fturmak i\u00e7in <code>helm create<\/code> komutunu kullan\u0131r\u0131z. Bu komut, yukar\u0131da bahsetti\u011fimiz standart dizin yap\u0131s\u0131na sahip bo\u015f bir Chart iskeleti olu\u015fturur. Terminalinizi a\u00e7\u0131n ve \u015fu komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code>helm create my-first-chart<\/pre>\n<p><\/code><\/p>\n<p>Bu komut, <code>my-first-app<\/code> ad\u0131nda yeni bir dizin olu\u015fturacak ve i\u00e7ine standart Helm Chart yap\u0131s\u0131n\u0131 yerle\u015ftirecektir. Bu dizine girdi\u011finizde, <code>Chart.yaml<\/code>, <code>values.yaml<\/code> ve <code>templates\/<\/code> gibi dosyalar\u0131 g\u00f6receksiniz.<\/p>\n<h3>3. Chart'\u0131 Anlama ve D\u00fczenleme<\/h3>\n<p>\u015eimdi <code>my-first-chart<\/code> dizininin i\u00e7ine girerek dosyalar\u0131 inceleyelim:<\/p>\n<h4>Chart.yaml Dosyas\u0131n\u0131 D\u00fczenleme<\/h4>\n<p><code>Chart.yaml<\/code> dosyas\u0131n\u0131 bir metin edit\u00f6r\u00fcyle a\u00e7\u0131n. Varsay\u0131lan olarak \u015funa benzer bir i\u00e7eri\u011fi olacakt\u0131r:<\/p>\n<pre><code>apiVersion: v2\nname: my-first-chart\ndescription: A Helm chart for Kubernetes\ntype: application\nversion: 0.1.0\nappVersion: \"1.16.0\"\n<\/pre>\n<p><\/code><\/p>\n<p>Burada <code>name<\/code>, <code>description<\/code> ve <code>version<\/code> alanlar\u0131n\u0131 kendi projenize uygun \u015fekilde g\u00fcncelleyebilirsiniz. <code>appVersion<\/code> ise uygulaman\u0131z\u0131n kendi s\u00fcr\u00fcm\u00fcn\u00fc belirtir.<\/p>\n<h4>values.yaml Dosyas\u0131n\u0131 D\u00fczenleme<\/h4>\n<p><code>values.yaml<\/code> dosyas\u0131, Chart'\u0131n\u0131z\u0131n yap\u0131land\u0131rma de\u011ferlerini i\u00e7erir. Varsay\u0131lan olarak, bu dosya bir Nginx web sunucusunu da\u011f\u0131tacak \u015fekilde yap\u0131land\u0131r\u0131lm\u0131\u015ft\u0131r. \u0130\u00e7eri\u011fi inceleyerek veya kendi uygulaman\u0131za g\u00f6re d\u00fczenleyerek, \u00f6rne\u011fin replika say\u0131s\u0131n\u0131, imaj ad\u0131n\u0131 veya port numaralar\u0131n\u0131 de\u011fi\u015ftirebilirsiniz:<\/p>\n<pre><code>replicaCount: 1\n\nimage:\n  repository: nginx\n  pullPolicy: IfNotPresent\n  tag: \"\"\n\nimagePullSecrets: []\nnameOverride: \"\"\nfullnameOverride: \"\"\n\nserviceAccount:\n  create: true\n  annotations: {}\n  name: \"\"\n\npodAnnotations: {}\npodLabels: {}\n\npodSecurityContext: {}\n\nsecurityContext: {}\n\nservice:\n  type: ClusterIP\n  port: 80\n\ningress:\n  enabled: false\n  className: \"\"\n  annotations: {}\n  hosts:\n    - host: chart-example.local\n      paths:\n        - path: \/\n          pathType: ImplementationSpecific\n  tls: []\n\nresources: {}\n\nnodeSelector: {}\n\ntolerations: []\n\naffinity: {}\n<\/pre>\n<p><\/code><\/p>\n<p>\u00d6rne\u011fin, replika say\u0131s\u0131n\u0131 3 yapmak isterseniz, <code>replicaCount: 1<\/code> sat\u0131r\u0131n\u0131 <code>replicaCount: 3<\/code> olarak de\u011fi\u015ftirebilirsiniz. Ya da uygulaman\u0131z\u0131n kullanaca\u011f\u0131 Docker imaj\u0131n\u0131 belirtmek isterseniz, <code>image.repository<\/code> ve <code>image.tag<\/code> alanlar\u0131n\u0131 g\u00fcncelleyebilirsiniz.<\/p>\n<h4>templates\/ Dizinindeki \u015eablonlar\u0131 \u0130nceleme<\/h4>\n<p><code>templates\/<\/code> dizinine girin. Burada <code>deployment.yaml<\/code>, <code>service.yaml<\/code> gibi dosyalar g\u00f6receksiniz. Bu dosyalar, Go template syntax'\u0131 ile yaz\u0131lm\u0131\u015f Kubernetes manifest \u015fablonlar\u0131d\u0131r. \u00d6rne\u011fin, <code>deployment.yaml<\/code> dosyas\u0131nda replika say\u0131s\u0131n\u0131 belirten sat\u0131r\u0131 inceleyebilirsiniz:<\/p>\n<pre><code>    replicas: {{ .Values.replicaCount }}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu sat\u0131r, <code>values.yaml<\/code> dosyas\u0131ndaki <code>replicaCount<\/code> de\u011ferini alarak Deployment nesnesinin replika say\u0131s\u0131n\u0131 belirler.<\/p>\n<h3>4. Chart'\u0131 Yerel Olarak Test Etme<\/h3>\n<p>Chart'\u0131n\u0131z\u0131 olu\u015fturduktan sonra, onu ger\u00e7ek bir Kubernetes k\u00fcmesine da\u011f\u0131tmadan \u00f6nce yerel olarak test etmek iyi bir fikirdir. Bunun i\u00e7in <code>helm template<\/code> komutunu kullanabilirsiniz. Bu komut, Chart'\u0131n\u0131z\u0131n <code>values.yaml<\/code> dosyas\u0131ndaki de\u011ferlerle olu\u015fturaca\u011f\u0131 nihai Kubernetes manifestlerini \u00e7\u0131kt\u0131lar:<\/p>\n<pre><code>helm template .\n<\/pre>\n<p><\/code><\/p>\n<p>Bu komutun \u00e7\u0131kt\u0131s\u0131n\u0131 inceleyerek, olu\u015fturulan manifestlerde herhangi bir hata olup olmad\u0131\u011f\u0131n\u0131 kontrol edebilirsiniz. Ayr\u0131ca, <code>helm lint<\/code> komutu ile Chart'\u0131n\u0131z\u0131n yap\u0131s\u0131n\u0131 ve olas\u0131 sorunlar\u0131 kontrol edebilirsiniz:<\/p>\n<pre><code>helm lint .\n<\/pre>\n<p><\/code><\/p>\n<h3>5. Chart'\u0131 Kubernetes K\u00fcmesine Da\u011f\u0131tma<\/h3>\n<p>Her \u015fey yolunda g\u00f6r\u00fcn\u00fcyorsa, art\u0131k Chart'\u0131n\u0131z\u0131 Kubernetes k\u00fcmenize da\u011f\u0131tabilirsiniz. Bunun i\u00e7in <code>helm install<\/code> komutunu kullan\u0131r\u0131z:<\/p>\n<pre><code>helm install my-release .\/my-first-chart\n<\/pre>\n<p><\/code><\/p>\n<p>Burada <code>my-release<\/code>, bu da\u011f\u0131t\u0131m i\u00e7in verece\u011finiz benzersiz isimdir. <code>.\/my-first-chart<\/code> ise olu\u015fturdu\u011funuz Chart'\u0131n yoludur. Bu komut, Chart'\u0131 indirip Kubernetes'e uygulayacakt\u0131r.<\/p>\n<h3>6. Da\u011f\u0131t\u0131m\u0131 G\u00fcncelleme ve Kald\u0131rma<\/h3>\n<p>Uygulaman\u0131zda bir de\u011fi\u015fiklik yapt\u0131\u011f\u0131n\u0131zda, Chart'\u0131 g\u00fcncelleyebilirsiniz. \u00d6rne\u011fin, replika say\u0131s\u0131n\u0131 de\u011fi\u015ftirdiyseniz, <code>values.yaml<\/code> dosyas\u0131n\u0131 g\u00fcncelleyip \u015fu komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code>helm upgrade my-release .\/my-first-chart\n<\/pre>\n<p><\/code><\/p>\n<p>Da\u011f\u0131t\u0131m\u0131 kald\u0131rmak i\u00e7in ise <code>helm uninstall<\/code> komutunu kullanabilirsiniz:<\/p>\n<pre><code>helm uninstall my-release\n<\/pre>\n<p><\/code><\/p>\n<p>Bu ad\u0131mlar\u0131 takip ederek, kendi ilk Helm Chart'\u0131n\u0131z\u0131 ba\u015far\u0131yla olu\u015fturabilir ve Kubernetes k\u00fcmenize da\u011f\u0131tabilirsiniz. Bu, daha karma\u015f\u0131k uygulamalar i\u00e7in temel olu\u015fturacakt\u0131r.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Senaryosu: Bir Web Uygulamas\u0131n\u0131 Helm ile Da\u011f\u0131tma<\/h2>\n<p>\u015eimdiye kadar temel bir Helm Chart olu\u015fturmay\u0131 \u00f6\u011frendik. Ancak ger\u00e7ek d\u00fcnya senaryolar\u0131nda uygulamalar\u0131m\u0131z genellikle daha karma\u015f\u0131kt\u0131r ve birden fazla bile\u015feni i\u00e7erebilir. Bu b\u00f6l\u00fcmde, pop\u00fcler bir web uygulamas\u0131n\u0131 (\u00f6rne\u011fin, bir blog veya e-ticaret sitesi) Helm ile nas\u0131l paketleyip da\u011f\u0131tabilece\u011fimizi inceleyece\u011fiz. Bu senaryo, Helm'in ba\u011f\u0131ml\u0131l\u0131k y\u00f6netimi, yap\u0131land\u0131rma esnekli\u011fi ve versiyonlama gibi \u00f6zelliklerinin nas\u0131l kullan\u0131ld\u0131\u011f\u0131n\u0131 g\u00f6sterecektir.<\/p>\n<h3>Senaryo: Basit Bir Web Uygulamas\u0131 ve Veritaban\u0131<\/h3>\n<p>Diyelim ki, bir Node.js tabanl\u0131 basit bir web uygulamam\u0131z var ve bu uygulama \u00e7al\u0131\u015fmak i\u00e7in bir PostgreSQL veritaban\u0131na ihtiya\u00e7 duyuyor. Geleneksel y\u00f6ntemlerle bu iki bile\u015feni Kubernetes'e da\u011f\u0131tmak, ayr\u0131 ayr\u0131 Deployment, Service ve PersistentVolume tan\u0131mlamalar\u0131 gerektirecektir. Ancak Helm ile bu s\u00fcreci \u00e7ok daha entegre hale getirebiliriz.<\/p>\n<h3>1. Ana Chart ve Ba\u011f\u0131ml\u0131l\u0131k Chart'lar\u0131<\/h3>\n<p>Bu senaryoda, ana Helm Chart'\u0131m\u0131z web uygulamam\u0131z i\u00e7in olacakt\u0131r. PostgreSQL veritaban\u0131 i\u00e7in ise Helm Hub'dan haz\u0131r bir PostgreSQL Chart'\u0131 kullanaca\u011f\u0131z. Bu, Helm'in ba\u011f\u0131ml\u0131l\u0131k y\u00f6netiminin g\u00fcc\u00fcn\u00fc g\u00f6sterir.<\/p>\n<p>\u00d6ncelikle, web uygulamam\u0131z i\u00e7in bir ana Chart olu\u015ftural\u0131m:<\/p>\n<pre><code>helm create my-webapp\n<\/pre>\n<p><\/code><\/p>\n<p>Ard\u0131ndan, <code>my-webapp<\/code> dizininin i\u00e7ine girip <code>Chart.yaml<\/code> dosyas\u0131n\u0131 d\u00fczenleyelim. Buraya, PostgreSQL Chart'\u0131na olan ba\u011f\u0131ml\u0131l\u0131\u011f\u0131m\u0131z\u0131 ekleyece\u011fiz. Bunun i\u00e7in <code>dependencies<\/code> b\u00f6l\u00fcm\u00fcn\u00fc kullan\u0131r\u0131z:<\/p>\n<pre><code>apiVersion: v2\nname: my-webapp\ndescription: A Helm chart for my web application\ntype: application\nversion: 0.1.0\nappVersion: \"1.0.0\"\n\ndependencies:\n  - name: postgresql\n    version: \"10.x.x\" # PostgreSQL Chart'\u0131n\u0131n uygun s\u00fcr\u00fcm\u00fcn\u00fc belirtin\n    repository: \"https:\/\/charts.bitnami.com\/bitnami\"\n    alias: db # Bu ba\u011f\u0131ml\u0131l\u0131\u011fa bir takma ad veriyoruz\n<\/pre>\n<p><\/code><\/p>\n<p>Burada <code>name<\/code>, ba\u011f\u0131ml\u0131 Chart'\u0131n ad\u0131n\u0131; <code>version<\/code>, kullanmak istedi\u011fimiz s\u00fcr\u00fcm aral\u0131\u011f\u0131n\u0131; <code>repository<\/code>, Chart'\u0131n bulundu\u011fu Helm deposunu belirtir. <code>alias: db<\/code> ise bu PostgreSQL ba\u011f\u0131ml\u0131l\u0131\u011f\u0131na \"db\" ad\u0131n\u0131 verir. Bu takma ad, ana Chart'\u0131m\u0131z\u0131n <code>values.yaml<\/code> dosyas\u0131nda bu ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 yap\u0131land\u0131rmak i\u00e7in kullan\u0131lacakt\u0131r.<\/p>\n<h3>2. Ba\u011f\u0131ml\u0131l\u0131klar\u0131 \u00c7ekme<\/h3>\n<p>Ba\u011f\u0131ml\u0131l\u0131klar\u0131 ekledikten sonra, <code>helm dependency update<\/code> komutu ile bu ba\u011f\u0131ml\u0131l\u0131klar\u0131 indirebiliriz:<\/p>\n<pre><code>helm dependency update .\/my-webapp\n<\/pre>\n<p><\/code><\/p>\n<p>Bu komut, <code>my-webapp\/charts\/<\/code> dizinine PostgreSQL Chart'\u0131n\u0131 indirecektir.<\/p>\n<h3>3. Ana Chart'\u0131n Yap\u0131land\u0131rmas\u0131 (values.yaml)<\/h3>\n<p>\u015eimdi, ana Chart'\u0131m\u0131z\u0131n <code>values.yaml<\/code> dosyas\u0131n\u0131 d\u00fczenleyerek web uygulamam\u0131z\u0131n ve PostgreSQL veritaban\u0131n\u0131n yap\u0131land\u0131rmas\u0131n\u0131 yapaca\u011f\u0131z:<\/p>\n<pre><code># Web Uygulamas\u0131 Yap\u0131land\u0131rmas\u0131\nreplicaCount: 3\n\nimage:\n  repository: my-docker-repo\/my-web-app\n  tag: \"latest\"\n  pullPolicy: IfNotPresent\n\nservice:\n  type: ClusterIP\n  port: 8080\n\n# PostgreSQL Veritaban\u0131 Yap\u0131land\u0131rmas\u0131 (Alias: db kullan\u0131ld\u0131)\ndb:\n  enabled: true # PostgreSQL'i kurmak istedi\u011fimizi belirtiyoruz\n  replicaCount: 1\n  postgresqlDatabase: myappdb\n  postgresqlUsername: appuser\n  postgresqlPassword: mysecurepassword # Ger\u00e7ek \u015fifreyi burada saklamay\u0131n! Secret kullan\u0131n.\n  persistence:\n    enabled: true\n    size: 10Gi\n<\/pre>\n<p><\/code><\/p>\n<p>Dikkat ederseniz, PostgreSQL ile ilgili yap\u0131land\u0131rma parametreleri, <code>db<\/code> alias'\u0131 alt\u0131nda gruplanm\u0131\u015ft\u0131r. Bu, Helm'in ba\u011f\u0131ml\u0131l\u0131klar\u0131n yap\u0131land\u0131rmas\u0131n\u0131 ana Chart'tan y\u00f6netmesini sa\u011flar. <code>db.enabled: true<\/code>, PostgreSQL Chart'\u0131n\u0131n kurulaca\u011f\u0131n\u0131 belirtir. <code>postgresqlPassword<\/code> gibi hassas bilgilerin ger\u00e7ek bir \u00fcretim ortam\u0131nda do\u011frudan buraya yaz\u0131lmamas\u0131 gerekti\u011fini unutmay\u0131n. Bunun yerine Kubernetes Secrets veya Helm Secrets eklentileri kullan\u0131lmal\u0131d\u0131r.<\/p>\n<h3>4. \u015eablonlar\u0131 G\u00fcncelleme (templates\/)<\/h3>\n<p>Ana Chart'\u0131m\u0131z\u0131n <code>templates\/<\/code> dizinindeki dosyalar\u0131 da web uygulamam\u0131z\u0131n gereksinimlerine g\u00f6re d\u00fczenlememiz gerekebilir. \u00d6rne\u011fin, <code>deployment.yaml<\/code> dosyas\u0131nda do\u011fru Docker imaj\u0131n\u0131 ve portu belirtti\u011fimizden emin olmal\u0131y\u0131z. Ayr\u0131ca, web uygulamam\u0131z\u0131n PostgreSQL'e ba\u011flanmas\u0131 i\u00e7in gerekli ortam de\u011fi\u015fkenlerini (environment variables) Deployment \u015fablonuna eklemeliyiz:<\/p>\n<pre><code># templates\/deployment.yaml i\u00e7inde ilgili container tan\u0131m\u0131na ekleyin:\nenv:\n  - name: DATABASE_URL\n    value: \"postgresql:\/\/{{ .Values.db.postgresqlUsername }}:{{ .Values.db.postgresqlPassword }}@{{ include \"my-webapp.postgresqlServiceUrl\" . }}:5432\/{{ .Values.db.postgresqlDatabase }}\"\n  - name: NODE_ENV\n    value: \"production\"\n<\/pre>\n<p><\/code><\/p>\n<p>Burada <code>{{ include \"my-webapp.postgresqlServiceUrl\" . }}<\/code> gibi ifadeler, ba\u011f\u0131ml\u0131 PostgreSQL Chart'\u0131n\u0131n otomatik olarak olu\u015fturdu\u011fu servis ad\u0131n\u0131 \u00e7ekmek i\u00e7in kullan\u0131l\u0131r. Bu t\u00fcr helper fonksiyonlar\u0131, ba\u011f\u0131ml\u0131l\u0131klarla entegrasyonu kolayla\u015ft\u0131r\u0131r.<\/p>\n<h3>5. Da\u011f\u0131t\u0131m ve Y\u00f6netim<\/h3>\n<p>Art\u0131k ana Chart'\u0131m\u0131z\u0131 da\u011f\u0131tabiliriz:<\/p>\n<pre><code>helm install my-app-release .\/my-webapp\n<\/pre>\n<p><\/code><\/p>\n<p>Helm, hem web uygulamas\u0131 Deployment'\u0131n\u0131 hem de PostgreSQL veritaban\u0131n\u0131 i\u00e7eren gerekli t\u00fcm kaynaklar\u0131 olu\u015fturacakt\u0131r. Uygulama \u00e7al\u0131\u015fmaya ba\u015flad\u0131\u011f\u0131nda, ortam de\u011fi\u015fkenleri arac\u0131l\u0131\u011f\u0131yla PostgreSQL'e ba\u011flanabilecektir.<\/p>\n<h3>6. Versiyonlama ve Geri Alma<\/h3>\n<p>Birka\u00e7 hafta sonra web uygulaman\u0131z\u0131n yeni bir s\u00fcr\u00fcm\u00fcn\u00fc yay\u0131nlamak istedi\u011finizde, <code>my-webapp\/Chart.yaml<\/code> dosyas\u0131ndaki <code>appVersion<\/code>'\u0131 g\u00fcncelleyip <code>helm upgrade<\/code> komutunu \u00e7al\u0131\u015ft\u0131rabilirsiniz. E\u011fer yeni s\u00fcr\u00fcmde bir sorun olursa, <code>helm history my-app-release<\/code> ile \u00f6nceki s\u00fcr\u00fcmleri g\u00f6rebilir ve <code>helm rollback my-app-release <REVISION_NUMBER><\/code> komutu ile kolayca geri d\u00f6nebilirsiniz.<\/p>\n<p>Bu senaryo, Helm'in sadece tek bir uygulama paketlemekle kalmay\u0131p, birden fazla ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 olan karma\u015f\u0131k sistemleri y\u00f6netmek i\u00e7in de ne kadar g\u00fc\u00e7l\u00fc bir ara\u00e7 oldu\u011funu g\u00f6stermektedir. Tekrarlayan kurulum ve yap\u0131land\u0131rma s\u00fcre\u00e7lerini otomatikle\u015ftiren Helm, geli\u015ftirme ve operasyon ekiplerinin verimlili\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r.<\/p>\n<h2>\u0130leri D\u00fczey Helm Kullan\u0131m\u0131: \u00d6zel Fonksiyonlar ve Hook'lar<\/h2>\n<p>Helm'in sundu\u011fu temel \u00f6zelliklerin yan\u0131 s\u0131ra, daha karma\u015f\u0131k ve \u00f6zelle\u015ftirilmi\u015f senaryolar i\u00e7in ileri d\u00fczey yetenekleri de bulunmaktad\u0131r. Bu b\u00f6l\u00fcmde, \u00f6zel fonksiyonlar olu\u015fturmay\u0131 ve Helm Hook'lar\u0131n\u0131 kullanarak da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi daha da otomatikle\u015ftirmeyi \u00f6\u011frenece\u011fiz.<\/p>\n<h3>\u00d6zel Fonksiyonlar (Helpers) Olu\u015fturma<\/h3>\n<p>Daha \u00f6nce bahsetti\u011fimiz <code>_helpers.tpl<\/code> dosyas\u0131, s\u0131k kullan\u0131lan \u015fablon par\u00e7ac\u0131klar\u0131n\u0131 tan\u0131mlamak i\u00e7in kullan\u0131l\u0131r. Bu, tekrar\u0131 \u00f6nler ve Chart'\u0131n\u0131z\u0131n okunabilirli\u011fini art\u0131r\u0131r. \u00d6rne\u011fin, bir Kubernetes kayna\u011f\u0131n\u0131n ad\u0131n\u0131 belirlerken, genellikle bir \u00f6n ek ve bir anahtar kelimeyi birle\u015ftiririz. Bu i\u015flemi bir helper fonksiyonu ile soyutlayabiliriz:<\/p>\n<pre><code>{{\/*\n    Helper function to create a fully qualified app name.\n    *\/}}\n    {{ define \"mychart.fullname\" -}}\n    {{- if .Values.fullnameOverride -}}\n    {{- .Values.fullnameOverride | trunc 63 | trimSuffix \"-\" -}}\n    {{- else -}}\n    {{- $name := default .Chart.Name .Values.nameOverride -}}\n    {{- if contains $name .Release.Name -}}\n    {{- .Release.Name | trunc 63 | trimSuffix \"-\" -}}\n    {{- else -}}\n    {{- printf \"%s-%s\" .Release.Name $name | trunc 63 | trimSuffix \"-\" -}}\n    {{- end -}}\n    {{- end -}}\n    {{- end -}}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu fonksiyon, <code>.Release.Name<\/code> (Helm taraf\u0131ndan atanan s\u00fcr\u00fcm ad\u0131) ve <code>.Values.nameOverride<\/code> veya <code>.Chart.Name<\/code> gibi de\u011ferleri kullanarak benzersiz ve standart bir isim olu\u015fturur. Bu fonksiyonu daha sonra di\u011fer \u015fablonlarda \u015fu \u015fekilde kullanabilirsiniz:<\/p>\n<pre><code>metadata:\n      name: {{ include \"mychart.fullname\" . }}\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu t\u00fcr helper fonksiyonlar\u0131, Chart'lar\u0131n\u0131z\u0131n daha mod\u00fcler ve s\u00fcrd\u00fcr\u00fclebilir olmas\u0131n\u0131 sa\u011flar. Karma\u015f\u0131k adland\u0131rma kurallar\u0131 veya hesaplamalar i\u00e7in de kullan\u0131labilirler.<\/p>\n<h3>Helm Hook'lar\u0131: Da\u011f\u0131t\u0131m S\u00fcrecini \u00d6zelle\u015ftirme<\/h3>\n<p>Helm Hook'lar\u0131, bir Chart'\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fc s\u0131ras\u0131nda belirli olaylarda \u00e7al\u0131\u015ft\u0131r\u0131labilen \u00f6zel Kubernetes kaynaklar\u0131d\u0131r. Bu, kurulum \u00f6ncesi veya sonras\u0131 g\u00f6revleri otomatikle\u015ftirmek i\u00e7in \u00e7ok kullan\u0131\u015fl\u0131d\u0131r. \u00d6rne\u011fin, bir veritaban\u0131 \u015femas\u0131n\u0131 g\u00fcncellemek, \u00f6nbelle\u011fi temizlemek veya bir uygulaman\u0131n yeni s\u00fcr\u00fcm\u00fcne ge\u00e7i\u015f yapmadan \u00f6nce testler \u00e7al\u0131\u015ft\u0131rmak gibi g\u00f6revler i\u00e7in Hook'lar kullan\u0131labilir.<\/p>\n<p>Helm Hook'lar\u0131, genellikle bir <code>kind<\/code> alan\u0131na \u00f6zel bir annotation eklenerek tan\u0131mlan\u0131r. En yayg\u0131n Hook t\u00fcrleri \u015funlard\u0131r:<\/p>\n<ul>\n<li><code>pre-install<\/code>: Kurulum ba\u015flamadan \u00f6nce \u00e7al\u0131\u015f\u0131r.<\/li>\n<li><code>post-install<\/code>: Kurulum tamamland\u0131ktan sonra \u00e7al\u0131\u015f\u0131r.<\/li>\n<li><code>pre-upgrade<\/code>: Y\u00fckseltme ba\u015flamadan \u00f6nce \u00e7al\u0131\u015f\u0131r.<\/li>\n<li><code>post-upgrade<\/code>: Y\u00fckseltme tamamland\u0131ktan sonra \u00e7al\u0131\u015f\u0131r.<\/li>\n<li><code>pre-delete<\/code>: Silme ba\u015flamadan \u00f6nce \u00e7al\u0131\u015f\u0131r.<\/li>\n<li><code>post-delete<\/code>: Silme tamamland\u0131ktan sonra \u00e7al\u0131\u015f\u0131r.<\/li>\n<\/ul>\n<p>Bir \u00f6rnek olarak, bir uygulaman\u0131n yeni s\u00fcr\u00fcm\u00fcn\u00fc da\u011f\u0131tmadan \u00f6nce bir veritaban\u0131 migrasyon beti\u011fi \u00e7al\u0131\u015ft\u0131rmak i\u00e7in <code>pre-upgrade<\/code> Hook'u kullanal\u0131m:<\/p>\n<p>\u00d6ncelikle, <code>templates\/<\/code> dizinine bir <code>migration-job.yaml<\/code> dosyas\u0131 ekleyelim:<\/p>\n<pre><code>apiVersion: batch\/v1\nkind: Job\nmetadata:\n  name: {{ include \"mychart.fullname\" . }}-migration\n  labels:\n    {{ include \"mychart.labels\" . | nindent 4 }}\n  annotations:\n    \"helm.sh\/hook\": pre-upgrade # Bu kaynak bir pre-upgrade hook'udur\n    \"helm.sh\/hook-weight\": \"-5\" # \u0130\u015flem s\u0131ras\u0131n\u0131 belirler (daha d\u00fc\u015f\u00fck de\u011ferler \u00f6nce \u00e7al\u0131\u015f\u0131r)\n    \"helm.sh\/hook-delete-policy\": hook-succeeded # Ba\u015far\u0131l\u0131 olursa silinsin\nspec:\n  template:\n    metadata:\n      name: {{ include \"mychart.fullname\" . }}-migration\n      labels:\n        {{ include \"mychart.labels\" . | nindent 6 }}\n    spec:\n      restartPolicy: Never\n      containers:\n        - name: migration\n          image: my-docker-repo\/my-migration-tool:latest\n          command: [\"\/app\/run-migrations.sh\"]\n          env:\n            - name: DATABASE_URL\n              valueFrom:\n                secretKeyRef:\n                  name: my-db-secret\n                  key: url\n<\/pre>\n<p><\/code><\/p>\n<p>Bu <code>Job<\/code> kayna\u011f\u0131, <code>pre-upgrade<\/code> Hook'u olarak i\u015faretlenmi\u015ftir. Bu, bir <code>helm upgrade<\/code> komutu \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda, Helm bu Job'u ba\u015flatacakt\u0131r. Job tamamland\u0131ktan sonra (veya ba\u015far\u0131s\u0131z olursa, <code>hook-delete-policy<\/code>'ye ba\u011fl\u0131 olarak), Helm y\u00fckseltme i\u015flemine devam edecektir. <code>hook-weight<\/code>, birden fazla Hook oldu\u011funda bunlar\u0131n \u00e7al\u0131\u015fma s\u0131ras\u0131n\u0131 belirler; daha d\u00fc\u015f\u00fck de\u011ferler daha erken \u00e7al\u0131\u015f\u0131r.<\/p>\n<p>Hook'lar, da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi daha g\u00fcvenli ve otomatize hale getirmenize olanak tan\u0131r. Ancak, Hook'lar\u0131n dikkatli kullan\u0131lmas\u0131 gerekir, \u00e7\u00fcnk\u00fc yanl\u0131\u015f yap\u0131land\u0131r\u0131ld\u0131\u011f\u0131nda da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini engelleyebilirler.<\/p>\n<h2>Helm ile CI\/CD Pipeline'lar\u0131n\u0131 Otomatikle\u015ftirme<\/h2>\n<p>Helm'in en g\u00fc\u00e7l\u00fc kullan\u0131m alanlar\u0131ndan biri, CI\/CD (S\u00fcrekli Entegrasyon\/S\u00fcrekli Da\u011f\u0131t\u0131m) pipeline'lar\u0131nda uygulama da\u011f\u0131t\u0131m\u0131n\u0131 otomatikle\u015ftirmektir. Bir kod de\u011fi\u015fikli\u011fi yap\u0131ld\u0131\u011f\u0131nda, bu de\u011fi\u015fikli\u011fin otomatik olarak test edilip ard\u0131ndan Kubernetes k\u00fcmesine da\u011f\u0131t\u0131lmas\u0131, modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinin temelini olu\u015fturur. Helm, bu s\u00fcreci hem basitle\u015ftirir hem de daha g\u00fcvenilir hale getirir.<\/p>\n<h3>CI\/CD'de Helm'in Rol\u00fc<\/h3>\n<p>Geleneksel CI\/CD pipeline'lar\u0131nda, her yeni s\u00fcr\u00fcm i\u00e7in Kubernetes manifestlerini manuel olarak g\u00fcncellemek veya karma\u015f\u0131k scripting kullanmak gerekebilir. Bu, hem zaman al\u0131c\u0131 hem de hata yapmaya a\u00e7\u0131kt\u0131r. Helm ile bu s\u00fcre\u00e7 \u015fu \u015fekilde standartla\u015ft\u0131r\u0131labilir:<\/p>\n<ol>\n<li><strong>Kod De\u011fi\u015fikli\u011fi ve Build:<\/strong> Geli\u015ftirici bir kod de\u011fi\u015fikli\u011fi yapar, bu de\u011fi\u015fiklik versiyon kontrol sistemine (\u00f6rne\u011fin Git) g\u00f6nderilir. CI sunucusu bu de\u011fi\u015fikli\u011fi alg\u0131lar ve uygulamay\u0131 build eder, ard\u0131ndan Docker imaj\u0131n\u0131 olu\u015fturup bir container registry'ye (\u00f6rne\u011fin Docker Hub, GCR, ECR) g\u00f6nderir.<\/li>\n<li><strong>Helm Chart G\u00fcncellemesi:<\/strong> CI pipeline'\u0131, olu\u015fturulan yeni Docker imaj etiketini (tag) kullanarak ilgili Helm Chart'\u0131n\u0131n <code>values.yaml<\/code> dosyas\u0131n\u0131 g\u00fcnceller. Bu g\u00fcncelleme otomatik olarak yap\u0131l\u0131r.<\/li>\n<li><strong>Testler:<\/strong> Pipeline, g\u00fcncellenmi\u015f Helm Chart'\u0131n\u0131 kullanarak uygulamay\u0131 bir test ortam\u0131na da\u011f\u0131t\u0131r. Ard\u0131ndan otomatik testler (birim testleri, entegrasyon testleri vb.) \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r.<\/li>\n<li><strong>\u00dcretim Da\u011f\u0131t\u0131m\u0131:<\/strong> Testler ba\u015far\u0131l\u0131 olursa, pipeline ayn\u0131 Helm Chart'\u0131n\u0131 kullanarak uygulamay\u0131 \u00fcretim ortam\u0131na da\u011f\u0131t\u0131r. Bu da\u011f\u0131t\u0131m, farkl\u0131 ortamlar i\u00e7in \u00f6zelle\u015ftirilmi\u015f <code>values.yaml<\/code> dosyalar\u0131 veya Helm komut sat\u0131r\u0131 arg\u00fcmanlar\u0131 kullan\u0131larak ger\u00e7ekle\u015ftirilebilir.<\/li>\n<\/ol>\n<h3>\u00d6rnek CI\/CD Workflow (Jenkins ile)<\/h3>\n<p>Bir\u00e7ok CI\/CD arac\u0131 (Jenkins, GitLab CI, GitHub Actions, CircleCI vb.) Helm ile entegre olabilir. \u0130\u015fte Jenkins ile basitle\u015ftirilmi\u015f bir \u00f6rnek:<\/p>\n<p><strong>Jenkinsfile (\u00f6rnek):<\/strong><\/p>\n<pre><code>pipeline {\n    agent any\n\n    stages {\n        stage('Checkout') {\n            steps {\n                git 'https:\/\/github.com\/your-username\/your-repo.git'\n            }\n        }\n\n        stage('Build and Push Docker Image') {\n            steps {\n                script {\n                    def imageTag = env.BUILD_ID ?: \"latest\" \/\/ Jenkins build ID'sini veya 'latest' kullan\n                    docker.build(\"my-docker-repo\/my-web-app:${imageTag}\")\n                    docker.withRegistry('https:\/\/index.docker.io\/v1\/', 'docker-hub-credentials') {\n                        docker.image(\"my-docker-repo\/my-web-app:${imageTag}\").push()\n                    }\n                }\n            }\n        }\n\n        stage('Update Helm Chart') {\n            steps {\n                script {\n                    \/\/ values.yaml dosyas\u0131ndaki imaj etiketini g\u00fcncelle\n                    sh \"sed -i 's|tag: .*|tag: \\\"${env.BUILD_ID ?: 'latest'}\\\"|g' .\/my-helm-chart\/values.yaml\"\n                }\n            }\n        }\n\n        stage('Deploy to Staging') {\n            steps {\n                script {\n                    \/\/ Staging ortam\u0131 i\u00e7in de\u011ferleri belirle\n                    def stagingValues = \"--set image.tag=${env.BUILD_ID ?: 'latest'} --set environment=staging\"\n                    sh \"helm upgrade --install my-staging-release .\/my-helm-chart ${stagingValues} --namespace staging\"\n                }\n            }\n        }\n\n        stage('Run Staging Tests') {\n            steps {\n                \/\/ Otomatik testleri \u00e7al\u0131\u015ft\u0131r (\u00f6rne\u011fin kubectl ile servis adresini al\u0131p curl ile test et)\n                echo \"Running staging tests...\"\n                \/\/ ... test komutlar\u0131 ...\n            }\n        }\n\n        stage('Approve for Production') {\n            \/\/ Manuel onay ad\u0131m\u0131 eklenebilir\n            input message: 'Proceed to production deployment?'\n        }\n\n        stage('Deploy to Production') {\n            steps {\n                script {\n                    \/\/ Production ortam\u0131 i\u00e7in de\u011ferleri belirle\n                    def productionValues = \"--set image.tag=${env.BUILD_ID ?: 'latest'} --set environment=production\"\n                    sh \"helm upgrade --install my-prod-release .\/my-helm-chart ${productionValues} --namespace production\"\n                }\n            }\n        }\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte:<\/p>\n<ul>\n<li>Docker imaj\u0131 olu\u015fturulur ve registry'ye push edilir.<\/li>\n<li><code>sed<\/code> komutu ile <code>values.yaml<\/code> dosyas\u0131ndaki imaj etiketi g\u00fcncellenir.<\/li>\n<li><code>helm upgrade --install<\/code> komutu ile uygulama \u00f6nce staging ortam\u0131na da\u011f\u0131t\u0131l\u0131r. <code>--set<\/code> parametresi ile spesifik de\u011ferler \u00fczerine yaz\u0131l\u0131r.<\/li>\n<li>Otomatik testler \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r.<\/li>\n<li>Manuel onay sonras\u0131 \u00fcretim ortam\u0131na da\u011f\u0131t\u0131m yap\u0131l\u0131r.<\/li>\n<\/ul>\n<p>Helm'in versiyonlama ve geri alma yetenekleri, CI\/CD pipeline'lar\u0131nda g\u00fcvenli\u011fi art\u0131r\u0131r. Bir da\u011f\u0131t\u0131m hatas\u0131 durumunda, \u00f6nceki stabil s\u00fcr\u00fcme h\u0131zl\u0131ca geri d\u00f6nmek m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<h3>Helm ile G\u00fcvenlik ve Yap\u0131land\u0131rma Y\u00f6netimi<\/h3>\n<p>CI\/CD pipeline'lar\u0131nda Helm kullan\u0131rken, hassas bilgilerin (\u015fifreler, API anahtarlar\u0131 vb.) y\u00f6netimi kritik \u00f6neme sahiptir. Bu bilgileri do\u011frudan <code>values.yaml<\/code> dosyas\u0131na yazmak yerine, Kubernetes Secrets veya Helm'in kendi Secret y\u00f6netimi mekanizmalar\u0131 kullan\u0131lmal\u0131d\u0131r. CI\/CD ara\u00e7lar\u0131, bu s\u0131rlar\u0131 g\u00fcvenli bir \u015fekilde depolamak ve pipeline'a enjekte etmek i\u00e7in mekanizmalar sunar.<\/p>\n<p>Helm, farkl\u0131 ortamlar i\u00e7in farkl\u0131 yap\u0131land\u0131rmalar\u0131 y\u00f6netmeyi kolayla\u015ft\u0131r\u0131r. Her ortam i\u00e7in ayr\u0131 <code>values-staging.yaml<\/code>, <code>values-production.yaml<\/code> gibi dosyalar olu\u015fturabilir ve bunlar\u0131 <code>helm upgrade<\/code> komutunda <code>-f<\/code> parametresi ile belirtebilirsiniz:<\/p>\n<pre><code>helm upgrade --install my-prod-release .\/my-helm-chart -f .\/my-helm-chart\/values-production.yaml --namespace production\n<\/pre>\n<p><\/code><\/p>\n","protected":false},"excerpt":{"rendered":"Kubernetes ekosisteminde uygulamalar\u0131n\u0131z\u0131 paketlemek, da\u011f\u0131tmak ve y\u00f6netmek karma\u015f\u0131k bir s\u00fcre\u00e7 olabilir.","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-41399","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>Kubernetes&#039;te Uygulama Y\u00f6netimi: Helm ile Tan\u0131\u015f\u0131n - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/kuberneteste-uygulama-yonetimi-helm-ile-tanisin\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kubernetes&#039;te Uygulama Y\u00f6netimi: Helm ile Tan\u0131\u015f\u0131n\" \/>\n<meta property=\"og:description\" content=\"Kubernetes ekosisteminde uygulamalar\u0131n\u0131z\u0131 paketlemek, da\u011f\u0131tmak ve y\u00f6netmek karma\u015f\u0131k bir s\u00fcre\u00e7 olabilir.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/kuberneteste-uygulama-yonetimi-helm-ile-tanisin\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-04-24T16:01:04+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=\"21 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kuberneteste-uygulama-yonetimi-helm-ile-tanisin\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kuberneteste-uygulama-yonetimi-helm-ile-tanisin\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Kubernetes&#8217;te Uygulama Y\u00f6netimi: Helm ile Tan\u0131\u015f\u0131n\",\"datePublished\":\"2026-04-24T16:01:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kuberneteste-uygulama-yonetimi-helm-ile-tanisin\/\"},\"wordCount\":3565,\"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\/kuberneteste-uygulama-yonetimi-helm-ile-tanisin\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kuberneteste-uygulama-yonetimi-helm-ile-tanisin\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/kuberneteste-uygulama-yonetimi-helm-ile-tanisin\/\",\"name\":\"Kubernetes'te Uygulama Y\u00f6netimi: Helm ile Tan\u0131\u015f\u0131n - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-04-24T16:01:04+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kuberneteste-uygulama-yonetimi-helm-ile-tanisin\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/kuberneteste-uygulama-yonetimi-helm-ile-tanisin\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kuberneteste-uygulama-yonetimi-helm-ile-tanisin\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Kubernetes&#8217;te Uygulama Y\u00f6netimi: Helm ile Tan\u0131\u015f\u0131n\"}]},{\"@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":"Kubernetes'te Uygulama Y\u00f6netimi: Helm ile Tan\u0131\u015f\u0131n - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/kuberneteste-uygulama-yonetimi-helm-ile-tanisin\/","og_locale":"tr_TR","og_type":"article","og_title":"Kubernetes'te Uygulama Y\u00f6netimi: Helm ile Tan\u0131\u015f\u0131n","og_description":"Kubernetes ekosisteminde uygulamalar\u0131n\u0131z\u0131 paketlemek, da\u011f\u0131tmak ve y\u00f6netmek karma\u015f\u0131k bir s\u00fcre\u00e7 olabilir.","og_url":"https:\/\/fatihsoysal.com\/blog\/kuberneteste-uygulama-yonetimi-helm-ile-tanisin\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-04-24T16:01:04+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"21 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/kuberneteste-uygulama-yonetimi-helm-ile-tanisin\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/kuberneteste-uygulama-yonetimi-helm-ile-tanisin\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Kubernetes&#8217;te Uygulama Y\u00f6netimi: Helm ile Tan\u0131\u015f\u0131n","datePublished":"2026-04-24T16:01:04+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/kuberneteste-uygulama-yonetimi-helm-ile-tanisin\/"},"wordCount":3565,"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\/kuberneteste-uygulama-yonetimi-helm-ile-tanisin\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/kuberneteste-uygulama-yonetimi-helm-ile-tanisin\/","url":"https:\/\/fatihsoysal.com\/blog\/kuberneteste-uygulama-yonetimi-helm-ile-tanisin\/","name":"Kubernetes'te Uygulama Y\u00f6netimi: Helm ile Tan\u0131\u015f\u0131n - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-04-24T16:01:04+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/kuberneteste-uygulama-yonetimi-helm-ile-tanisin\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/kuberneteste-uygulama-yonetimi-helm-ile-tanisin\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/kuberneteste-uygulama-yonetimi-helm-ile-tanisin\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Kubernetes&#8217;te Uygulama Y\u00f6netimi: Helm ile Tan\u0131\u015f\u0131n"}]},{"@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\/41399","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=41399"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/41399\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=41399"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=41399"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=41399"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}