{"id":33105,"date":"2025-10-29T16:42:03","date_gmt":"2025-10-29T13:42:03","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=33105"},"modified":"2025-10-29T16:42:03","modified_gmt":"2025-10-29T13:42:03","slug":"digitalocean-kubernetese-circleci-ile-otomatik-dagitimlar-nasil-yapilir","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetese-circleci-ile-otomatik-dagitimlar-nasil-yapilir\/","title":{"rendered":"DigitalOcean Kubernetes&#8217;e CircleCI ile Otomatik Da\u011f\u0131t\u0131mlar Nas\u0131l Yap\u0131l\u0131r?"},"content":{"rendered":"<h2>DigitalOcean Kubernetes&#8217;e CircleCI ile Otomatik Da\u011f\u0131t\u0131mlar Nas\u0131l Yap\u0131l\u0131r?<\/h2>\n<p><body><\/p>\n<h3>Giri\u015f<\/h3>\n<p>Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde h\u0131z, g\u00fcvenilirlik ve tutarl\u0131l\u0131k, rekabet\u00e7i kalabilmek i\u00e7in vazge\u00e7ilmez unsurlard\u0131r. S\u00fcrekli Entegrasyon (Continuous Integration &#8211; CI) ve S\u00fcrekli Da\u011f\u0131t\u0131m (Continuous Deployment &#8211; CD) bu hedeflere ula\u015fmada kilit rol oynar. CI\/CD s\u00fcre\u00e7leri, kod de\u011fi\u015fikliklerinin otomatik olarak test edilmesini, derlenmesini ve da\u011f\u0131t\u0131lmas\u0131n\u0131 sa\u011flayarak manuel hatalar\u0131 azalt\u0131r, geli\u015ftirme d\u00f6ng\u00fclerini h\u0131zland\u0131r\u0131r ve ekiplerin daha s\u0131k ve g\u00fcvenli bir \u015fekilde \u00fcretim ortam\u0131na ge\u00e7i\u015f yapmas\u0131na olanak tan\u0131r.<\/p>\n<p>Bu makalede, bulut tabanl\u0131 bir Kubernetes hizmeti olan DigitalOcean Kubernetes (DOKS) \u00fczerine, pop\u00fcler bir CI\/CD platformu olan CircleCI kullanarak otomatik da\u011f\u0131t\u0131mlar yapmay\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. Bir uygulaman\u0131n Docker imaj\u0131n\u0131n olu\u015fturulmas\u0131ndan, bir container registry&#8217;ye g\u00f6nderilmesine ve son olarak Kubernetes k\u00fcmesine da\u011f\u0131t\u0131lmas\u0131na kadar t\u00fcm s\u00fcreci otomatikle\u015ftirece\u011fiz. Bu rehber, hem CI\/CD kavramlar\u0131na yeni ba\u015flayanlar hem de mevcut s\u00fcre\u00e7lerini DigitalOcean Kubernetes ve CircleCI ile optimize etmek isteyen deneyimli geli\u015ftiriciler i\u00e7in faydal\u0131 olacakt\u0131r.<\/p>\n<h3>Temel Kavramlar<\/h3>\n<p>Otomatik da\u011f\u0131t\u0131m s\u00fcrecine ba\u015flamadan \u00f6nce, kullanaca\u011f\u0131m\u0131z temel teknolojileri ve kavramlar\u0131 anlamak \u00f6nemlidir.<\/p>\n<h4>S\u00fcrekli Entegrasyon (CI) ve S\u00fcrekli Da\u011f\u0131t\u0131m (CD)<\/h4>\n<p>*   <strong>S\u00fcrekli Entegrasyon (CI):<\/strong> Geli\u015ftiricilerin kod de\u011fi\u015fikliklerini s\u0131k s\u0131k (genellikle g\u00fcnde birka\u00e7 kez) payla\u015f\u0131lan bir ana depoya birle\u015ftirdi\u011fi bir yaz\u0131l\u0131m geli\u015ftirme uygulamas\u0131d\u0131r. Her bir birle\u015ftirme, otomatik bir derleme ve test s\u00fcrecini tetikler. Bu, sorunlar\u0131n erken tespit edilmesini ve \u00e7\u00f6z\u00fclmesini sa\u011flar.<br \/>\n*   <strong>S\u00fcrekli Da\u011f\u0131t\u0131m (CD):<\/strong> CI&#8217;n\u0131n bir uzant\u0131s\u0131d\u0131r. Ba\u015far\u0131l\u0131 bir \u015fekilde test edilmi\u015f ve derlenmi\u015f her kod de\u011fi\u015fikli\u011finin otomatik olarak \u00fcretim ortam\u0131na da\u011f\u0131t\u0131lmas\u0131n\u0131 ifade eder. S\u00fcrekli Teslimat (Continuous Delivery) ise, \u00fcretim ortam\u0131na da\u011f\u0131t\u0131m\u0131n otomatikle\u015ftirildi\u011fi ancak manuel bir onay\u0131n gerekti\u011fi bir ad\u0131md\u0131r. Bu makalede, tam otomatik da\u011f\u0131t\u0131m\u0131 (Continuous Deployment) hedefleyece\u011fiz.<\/p>\n<h4>Kubernetes (K8s)<\/h4>\n<p>Kubernetes, container&#8217;l\u0131 uygulamalar\u0131n da\u011f\u0131t\u0131m\u0131n\u0131, \u00f6l\u00e7eklendirmesini ve y\u00f6netimini otomatikle\u015ftiren a\u00e7\u0131k kaynakl\u0131 bir container orkestrasyon platformudur. Uygulamalar\u0131 k\u00fc\u00e7\u00fck, ba\u011f\u0131ms\u0131z birimler olan container&#8217;lara paketleyerek, farkl\u0131 ortamlarda tutarl\u0131 bir \u015fekilde \u00e7al\u0131\u015fmalar\u0131n\u0131 sa\u011flar.<\/p>\n<h4>DigitalOcean Kubernetes (DOKS)<\/h4>\n<p>DigitalOcean Kubernetes, DigitalOcean&#8217;\u0131n y\u00f6netilen Kubernetes hizmetidir. Geli\u015ftiricilerin kendi Kubernetes k\u00fcmelerini kurma ve y\u00f6netme karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 ortadan kald\u0131rarak, uygulamalar\u0131n\u0131 h\u0131zla da\u011f\u0131tmalar\u0131na ve \u00f6l\u00e7eklendirmelerine olanak tan\u0131r. DOKS, Kubernetes&#8217;in t\u00fcm g\u00fc\u00e7l\u00fc \u00f6zelliklerini DigitalOcean&#8217;\u0131n kullan\u0131m kolayl\u0131\u011f\u0131 ve uygun fiyatland\u0131rmas\u0131yla birle\u015ftirir.<\/p>\n<h4>CircleCI<\/h4>\n<p>CircleCI, bulut tabanl\u0131 bir CI\/CD platformudur. Kod depolar\u0131n\u0131zla entegre olarak, kod de\u011fi\u015fiklikleri alg\u0131land\u0131\u011f\u0131nda otomatik derleme, test ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini tetikler. Geni\u015f entegrasyon yelpazesi, esnek yap\u0131land\u0131rma se\u00e7enekleri ve g\u00fc\u00e7l\u00fc otomasyon yetenekleri ile \u00f6ne \u00e7\u0131kar.<\/p>\n<h4>Docker<\/h4>\n<p>Docker, uygulamalar\u0131 ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 izole edilmi\u015f birimler olan container&#8217;lara paketlemeyi sa\u011flayan bir platformdur. Bu container&#8217;lar, farkl\u0131 ortamlarda tutarl\u0131 bir \u015fekilde \u00e7al\u0131\u015fabilir, bu da &#8220;bir kez yaz, her yerde \u00e7al\u0131\u015ft\u0131r&#8221; prensibini m\u00fcmk\u00fcn k\u0131lar.<\/p>\n<h4>Git<\/h4>\n<p>Git, yaz\u0131l\u0131m geli\u015ftirme projelerinde kaynak kod de\u011fi\u015fikliklerini takip etmek ve birden fazla geli\u015ftiricinin ayn\u0131 proje \u00fczerinde i\u015fbirli\u011fi yapmas\u0131n\u0131 sa\u011flamak i\u00e7in kullan\u0131lan da\u011f\u0131t\u0131k bir versiyon kontrol sistemidir. GitHub, GitLab veya Bitbucket gibi platformlar, Git depolar\u0131n\u0131 bar\u0131nd\u0131r\u0131r.<\/p>\n<h3>\u00d6n Ko\u015fullar ve Haz\u0131rl\u0131k<\/h3>\n<p>Bu rehbere ba\u015flamadan \u00f6nce a\u015fa\u011f\u0131daki ara\u00e7lara ve hesaplara sahip olman\u0131z gerekmektedir:<\/p>\n<p>*   <strong>DigitalOcean Hesab\u0131:<\/strong> Bir DOKS k\u00fcmesi olu\u015fturmak ve y\u00f6netmek i\u00e7in.<br \/>\n*   <strong>Docker Hub Hesab\u0131 veya \u00d6zel Container Registry:<\/strong> Uygulaman\u0131z\u0131n Docker imaj\u0131n\u0131 depolamak i\u00e7in. Docker Hub \u00fccretsiz katman sunar.<br \/>\n*   <strong>GitHub\/GitLab Hesab\u0131:<\/strong> Uygulama kodunuzu ve CircleCI yap\u0131land\u0131rma dosyan\u0131z\u0131 bar\u0131nd\u0131rmak i\u00e7in.<br \/>\n*   <strong>CircleCI Hesab\u0131:<\/strong> GitHub\/GitLab hesab\u0131n\u0131zla entegre edilecek.<br \/>\n*   <strong><code>kubectl<\/code>:<\/strong> Kubernetes k\u00fcmeleriyle etkile\u015fim kurmak i\u00e7in komut sat\u0131r\u0131 arac\u0131. Yerel makinenize kurulu olmal\u0131.<br \/>\n*   <strong><code>doctl<\/code> (iste\u011fe ba\u011fl\u0131 ama \u00f6nerilir):<\/strong> DigitalOcean API&#8217;si ile etkile\u015fim kurmak i\u00e7in komut sat\u0131r\u0131 arac\u0131. K\u00fcme olu\u015fturma ve y\u00f6netme i\u015flemlerini kolayla\u015ft\u0131r\u0131r.<br \/>\n*   <strong>Node.js, Python, Go veya ba\u015fka bir programlama dili:<\/strong> Da\u011f\u0131taca\u011f\u0131m\u0131z \u00f6rnek bir uygulama i\u00e7in.<\/p>\n<h3>Uygulama Mimarisi ve Proje Yap\u0131s\u0131<\/h3>\n<p>Bu rehberde, basit bir &#8220;Hello World&#8221; web uygulamas\u0131 da\u011f\u0131taca\u011f\u0131z. Uygulama, gelen isteklere basit bir yan\u0131t d\u00f6necek. Proje yap\u0131m\u0131z a\u015fa\u011f\u0131daki gibi olacak:<\/p>\n<pre><code class=\"language-\">my-app\/\n\u251c\u2500\u2500 .circleci\/\n\u2502   \u2514\u2500\u2500 config.yml\n\u251c\u2500\u2500 .kubernetes\/\n\u2502   \u251c\u2500\u2500 deployment.yaml\n\u2502   \u2514\u2500\u2500 service.yaml\n\u251c\u2500\u2500 src\/\n\u2502   \u2514\u2500\u2500 app.js  (veya app.py, main.go vb.)\n\u251c\u2500\u2500 Dockerfile\n\u251c\u2500\u2500 package.json (veya requirements.txt, go.mod vb.)\n\u2514\u2500\u2500 README.md<\/code><\/pre>\n<p>*   <strong><code>src\/app.js<\/code>:<\/strong> \u00d6rnek Node.js uygulamam\u0131z\u0131n kaynak kodu.<br \/>\n*   <strong><code>Dockerfile<\/code>:<\/strong> Uygulamay\u0131 bir Docker imaj\u0131na d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in talimatlar\u0131 i\u00e7erir.<br \/>\n*   <strong><code>.kubernetes\/deployment.yaml<\/code>:<\/strong> Kubernetes Deployment nesnesini tan\u0131mlar. Uygulaman\u0131n nas\u0131l \u00e7al\u0131\u015ft\u0131r\u0131laca\u011f\u0131n\u0131 (ka\u00e7 kopya, hangi imaj vb.) belirtir.<br \/>\n*   <strong><code>.kubernetes\/service.yaml<\/code>:<\/strong> Kubernetes Service nesnesini tan\u0131mlar. Uygulamaya d\u0131\u015far\u0131dan nas\u0131l eri\u015filece\u011fini (port, tip vb.) belirtir.<br \/>\n*   <strong><code>.circleci\/config.yml<\/code>:<\/strong> CircleCI&#8217;nin CI\/CD pipeline&#8217;\u0131n\u0131 tan\u0131mlayan ana yap\u0131land\u0131rma dosyas\u0131.<\/p>\n<h3>Ad\u0131m Ad\u0131m Kurulum ve Yap\u0131land\u0131rma<\/h3>\n<p>\u015eimdi, DigitalOcean Kubernetes&#8217;e CircleCI ile otomatik da\u011f\u0131t\u0131m yapmak i\u00e7in gerekli ad\u0131mlar\u0131 tek tek inceleyelim.<\/p>\n<h4>Ad\u0131m 1: DigitalOcean Kubernetes K\u00fcmesi Olu\u015fturma<\/h4>\n<p>\u0130lk olarak, uygulamam\u0131z\u0131 da\u011f\u0131taca\u011f\u0131m\u0131z bir Kubernetes k\u00fcmesi olu\u015fturmam\u0131z gerekiyor. Bunu DigitalOcean kontrol paneli veya <code>doctl<\/code> komut sat\u0131r\u0131 arac\u0131 ile yapabiliriz.<\/p>\n<h5>DigitalOcean Kontrol Paneli ile:<\/h5>\n<p>1.  DigitalOcean hesab\u0131n\u0131za giri\u015f yap\u0131n.<br \/>\n2.  Sol men\u00fcden &#8220;Kubernetes&#8221;e gidin ve &#8220;Create Kubernetes Cluster&#8221; butonuna t\u0131klay\u0131n.<br \/>\n3.  Bir b\u00f6lge se\u00e7in (\u00f6rne\u011fin, Frankfurt, London).<br \/>\n4.  Bir Node Pool (d\u00fc\u011f\u00fcm havuzu) yap\u0131land\u0131r\u0131n. Boyutunu ve d\u00fc\u011f\u00fcm say\u0131s\u0131n\u0131 se\u00e7in. Test i\u00e7in k\u00fc\u00e7\u00fck bir boyutta (\u00f6rne\u011fin, <code>s-2vcpu-4gb<\/code>) 1-2 d\u00fc\u011f\u00fcm yeterli olacakt\u0131r.<br \/>\n5.  K\u00fcmenize bir isim verin (\u00f6rne\u011fin, <code>my-doks-cluster<\/code>).<br \/>\n6.  &#8220;Create Cluster&#8221; butonuna t\u0131klay\u0131n. K\u00fcmenizin olu\u015fturulmas\u0131 birka\u00e7 dakika s\u00fcrecektir.<br \/>\n7.  K\u00fcme haz\u0131r oldu\u011funda, k\u00fcme detaylar\u0131 sayfas\u0131ndan &#8220;Download Config File&#8221; butonuna t\u0131klayarak <code>kubeconfig<\/code> dosyan\u0131z\u0131 indirin. Bu dosya, <code>kubectl<\/code>&#8216;in k\u00fcmenizle kimlik do\u011frulamas\u0131 yapmas\u0131n\u0131 sa\u011flar. Genellikle bu dosyay\u0131 <code>~\/.kube\/config<\/code> dizinine ta\u015f\u0131rs\u0131n\u0131z.<\/p>\n<h5><code>doctl<\/code> ile (iste\u011fe ba\u011fl\u0131):<\/h5>\n<p><code>doctl<\/code> kuruluysa ve DigitalOcean API anahtar\u0131n\u0131z yap\u0131land\u0131r\u0131lm\u0131\u015fsa, a\u015fa\u011f\u0131daki komutla bir k\u00fcme olu\u015fturabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">doctl kubernetes cluster create my-doks-cluster \\\n  --region fra1 \\\n  --node-pool name=default,size=s-2vcpu-4gb,count=2<\/code><\/pre>\n<p>Ard\u0131ndan, k\u00fcmenizin <code>kubeconfig<\/code> dosyas\u0131n\u0131 almak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">doctl kubernetes cluster kubeconfig save my-doks-cluster<\/code><\/pre>\n<p><code>kubectl<\/code>&#8216;in do\u011fru k\u00fcme ba\u011flam\u0131n\u0131 kulland\u0131\u011f\u0131ndan emin olmak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">kubectl config use-context do-fra1-my-doks-cluster\nkubectl get nodes<\/code><\/pre>\n<h4>Ad\u0131m 2: \u00d6rnek Uygulama ve Dockerfile Haz\u0131rlama<\/h4>\n<p>Basit bir Node.js &#8220;Hello World&#8221; uygulamas\u0131 olu\u015ftural\u0131m.<\/p>\n<p><strong><code>src\/app.js<\/code>:<\/strong><\/p>\n<pre><code class=\"language-javascript\">const express = require('express');\nconst app = express();\nconst port = 3000;\n\napp.get('\/', (req, res) => {\n  res.send('Hello from DigitalOcean Kubernetes with CircleCI!');\n});\n\napp.listen(port, () => {\n  console.log(<code>App listening at http:\/\/localhost:${port}<\/code>);\n});<\/code><\/pre>\n<p><strong><code>package.json<\/code>:<\/strong><\/p>\n<pre><code class=\"language-json\">{\n  \"name\": \"my-app\",\n  \"version\": \"1.0.0\",\n  \"description\": \"A simple Node.js app for DOKS deployment\",\n  \"main\": \"src\/app.js\",\n  \"scripts\": {\n    \"start\": \"node src\/app.js\"\n  },\n  \"dependencies\": {\n    \"express\": \"^4.17.1\"\n  }\n}<\/code><\/pre>\n<p>\u015eimdi bu uygulamay\u0131 Dockerize edelim.<\/p>\n<p><strong><code>Dockerfile<\/code>:<\/strong><\/p>\n<pre><code class=\"language-dockerfile\"># Temel imaj olarak Node.js'in resmi imaj\u0131n\u0131 kullan\nFROM node:16-alpine\n\n<h2>\u00c7al\u0131\u015fma dizinini ayarla<\/h2>\nWORKDIR \/app\n\n<h2>package.json ve package-lock.json dosyalar\u0131n\u0131 kopyala<\/h2>\n<h2>Ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fcklemek i\u00e7in \u00f6nce bunlar\u0131 kopyalamak,<\/h2>\n<h2>sadece kaynak kod de\u011fi\u015fti\u011finde ba\u011f\u0131ml\u0131l\u0131klar\u0131n tekrar y\u00fcklenmesini \u00f6nler.<\/h2>\nCOPY package*.json .\/\n\n<h2>Ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckle<\/h2>\nRUN npm install\n\n<h2>Uygulama kaynak kodunu kopyala<\/h2>\nCOPY src .\/src\n\n<h2>Uygulamay\u0131 ba\u015flatma komutunu tan\u0131mla<\/h2>\nCMD [ \"npm\", \"start\" ]\n\n<h2>Uygulaman\u0131n dinleyece\u011fi portu belirt<\/h2>\nEXPOSE 3000<\/code><\/pre>\n<h4>Ad\u0131m 3: Kubernetes Manifest Dosyalar\u0131 Olu\u015fturma<\/h4>\n<p>Uygulamam\u0131z\u0131 Kubernetes k\u00fcmesine da\u011f\u0131tmak i\u00e7in <code>Deployment<\/code> ve <code>Service<\/code> manifest dosyalar\u0131n\u0131 olu\u015ftural\u0131m.<\/p>\n<p><strong><code>.kubernetes\/deployment.yaml<\/code>:<\/strong><\/p>\n<pre><code class=\"language-yaml\">apiVersion: apps\/v1\nkind: Deployment\nmetadata:\n  name: my-app-deployment\n  labels:\n    app: my-app\nspec:\n  replicas: 2 # Uygulaman\u0131n 2 kopyas\u0131n\u0131 \u00e7al\u0131\u015ft\u0131r\n  selector:\n    matchLabels:\n      app: my-app\n  template:\n    metadata:\n      labels:\n        app: my-app\n    spec:\n      containers:\n      - name: my-app\n        image: your-dockerhub-username\/my-app:latest # BURAYI KEND\u0130 DOCKER IMAGINIZLA DE\u011e\u0130\u015eT\u0130R\u0130N\n        ports:\n        - containerPort: 3000<\/code><\/pre>\n<p><strong>\u00d6NEML\u0130:<\/strong> <code>your-dockerhub-username\/my-app:latest<\/code> k\u0131sm\u0131n\u0131 kendi Docker Hub kullan\u0131c\u0131 ad\u0131n\u0131z ve belirleyece\u011finiz imaj ad\u0131 ile de\u011fi\u015ftirin (\u00f6rne\u011fin, <code>gorkemyurt\/my-app:latest<\/code>).<\/p>\n<p><strong><code>.kubernetes\/service.yaml<\/code>:<\/strong><\/p>\n<pre><code class=\"language-yaml\">apiVersion: v1\nkind: Service\nmetadata:\n  name: my-app-service\nspec:\n  selector:\n    app: my-app\n  type: LoadBalancer # DigitalOcean'da bir Load Balancer sa\u011flar\n  ports:\n    - protocol: TCP\n      port: 80 # D\u0131\u015far\u0131dan eri\u015filecek port\n      targetPort: 3000 # Container'\u0131n dinledi\u011fi port<\/code><\/pre>\n<p><code>type: LoadBalancer<\/code> kullanmak, DigitalOcean&#8217;da otomatik olarak bir Load Balancer olu\u015fturur ve uygulaman\u0131za d\u0131\u015far\u0131dan eri\u015filebilir bir IP adresi sa\u011flar.<\/p>\n<h4>Ad\u0131m 4: CircleCI Projesi Yap\u0131land\u0131rma ve Ortam De\u011fi\u015fkenleri<\/h4>\n<p>1.  <strong>GitHub\/GitLab Deposu Olu\u015fturma:<\/strong> T\u00fcm bu dosyalar\u0131 (uygulama kodu, Dockerfile, Kubernetes manifestleri ve <code>.circleci\/config.yml<\/code>) bir Git deposuna y\u00fckleyin.<br \/>\n2.  <strong>CircleCI Hesab\u0131 Entegrasyonu:<\/strong> CircleCI&#8217;ya giri\u015f yap\u0131n ve GitHub\/GitLab hesab\u0131n\u0131zla entegre edin. Deponuzu CircleCI&#8217;da &#8220;Add Project&#8221; diyerek ekleyin.<br \/>\n3.  <strong>Ortam De\u011fi\u015fkenleri Tan\u0131mlama:<\/strong> CircleCI projenizin ayarlar\u0131nda (Project Settings -> Environment Variables) a\u015fa\u011f\u0131daki ortam de\u011fi\u015fkenlerini tan\u0131mlaman\u0131z gerekecek:<br \/>\n    *   <strong><code>DOCKER_USER<\/code>:<\/strong> Docker Hub kullan\u0131c\u0131 ad\u0131n\u0131z.<br \/>\n    *   <strong><code>DOCKER_PASS<\/code>:<\/strong> Docker Hub parolan\u0131z.<br \/>\n    *   <strong><code>DOCKER_REPO<\/code>:<\/strong> Docker imaj\u0131n\u0131z\u0131n ad\u0131 (\u00f6rne\u011fin, <code>my-app<\/code>).<br \/>\n    *   <strong><code>KUBECONFIG_ENCODED<\/code>:<\/strong> Bu en kritik de\u011fi\u015fkendir. DigitalOcean Kubernetes k\u00fcmenizin <code>kubeconfig<\/code> dosyas\u0131n\u0131n Base64 kodlanm\u0131\u015f halini i\u00e7ermelidir.<br \/>\n        *   <code>kubeconfig<\/code> dosyan\u0131z\u0131 indirdikten sonra (Ad\u0131m 1&#8217;de), a\u015fa\u011f\u0131daki komutla Base64 kodlamas\u0131n\u0131 yap\u0131n:<\/p>\n<pre><code class=\"language-bash\">cat ~\/.kube\/config | base64\n            # macOS i\u00e7in: cat ~\/.kube\/config | base64\n            # Linux i\u00e7in: cat ~\/.kube\/config | base64 -w 0<\/code><\/pre>\n<p>        *   \u00c7\u0131kt\u0131y\u0131 kopyalay\u0131n ve <code>KUBECONFIG_ENCODED<\/code> ortam de\u011fi\u015fkenine yap\u0131\u015ft\u0131r\u0131n. Bu, CircleCI&#8217;\u0131n k\u00fcmenizle g\u00fcvenli bir \u015fekilde kimlik do\u011frulamas\u0131 yapmas\u0131n\u0131 sa\u011flar.<br \/>\n    *   <strong><code>DIGITALOCEAN_ACCESS_TOKEN<\/code> (iste\u011fe ba\u011fl\u0131):<\/strong> E\u011fer CircleCI pipeline&#8217;\u0131n\u0131z i\u00e7inde <code>doctl<\/code> komutlar\u0131n\u0131 kullanmay\u0131 planl\u0131yorsan\u0131z (\u00f6rne\u011fin, k\u00fcme bilgilerini sorgulamak i\u00e7in), DigitalOcean API anahtar\u0131n\u0131z\u0131 burada saklayabilirsiniz. Ancak bu rehberde <code>kubeconfig<\/code> \u00fczerinden <code>kubectl<\/code> kullanaca\u011f\u0131m\u0131z i\u00e7in zorunlu de\u011fildir.<\/p>\n<h4>Ad\u0131m 5: <code>.circleci\/config.yml<\/code> Dosyas\u0131 Olu\u015fturma<\/h4>\n<p>Bu dosya, CircleCI pipeline&#8217;\u0131m\u0131z\u0131n kalbidir. \u0130ki ana i\u015f (job) tan\u0131mlayaca\u011f\u0131z: biri Docker imaj\u0131n\u0131 olu\u015fturup g\u00f6ndermek i\u00e7in, di\u011feri ise bu imaj\u0131 Kubernetes k\u00fcmesine da\u011f\u0131tmak i\u00e7in.<\/p>\n<p><strong><code>.circleci\/config.yml<\/code>:<\/strong><\/p>\n<pre><code class=\"language-yaml\">version: 2.1\n\n<h2>Orbs, CircleCI'a \u00f6nceden paketlenmi\u015f komutlar ve i\u015fler eklemenizi sa\u011flar.<\/h2>\n<h2>Bu \u00f6rnekte doctl orb'unu kullanmayaca\u011f\u0131z, ancak ihtiyac\u0131n\u0131z olursa ekleyebilirsiniz.<\/h2>\n<h2>orbs:<\/h2>\n<h2>doctl: digitalocean\/doctl@x.y # En g\u00fcncel versiyonu kullan\u0131n<\/h2>\n\njobs:\n  build_and_push_docker_image:\n    docker:\n      - image: cimg\/base:2023.09 # Docker CLI'\u0131 i\u00e7eren bir temel imaj\n    steps:\n      - checkout # Git deposunu klonla\n      - setup_remote_docker: # Docker komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in uzak bir Docker ortam\u0131 ayarla\n          version: 20.10.18 # Docker CLI versiyonu\n      - run:\n          name: Log in to Docker Hub\n          command: echo \"$DOCKER_PASS\" | docker login -u \"$DOCKER_USER\" --password-stdin\n      - run:\n          name: Build Docker image\n          command: docker build -t $DOCKER_USER\/$DOCKER_REPO:$CIRCLE_SHA1 -t $DOCKER_USER\/$DOCKER_REPO:latest .\n      - run:\n          name: Push Docker image to Docker Hub\n          command: docker push $DOCKER_USER\/$DOCKER_REPO --all-tags\n\n  deploy_to_kubernetes:\n    docker:\n      - image: cimg\/base:2023.09 # kubectl'i kurmak i\u00e7in temel imaj\n    steps:\n      - checkout # Git deposunu klonla\n      - run:\n          name: Install kubectl\n          command: |\n            curl -LO \"https:\/\/dl.k8s.io\/release\/$(curl -L -s https:\/\/dl.k8s.io\/release\/stable.txt)\/bin\/linux\/amd64\/kubectl\"\n            chmod +x .\/kubectl\n            sudo mv .\/kubectl \/usr\/local\/bin\/kubectl\n      - run:\n          name: Decode and save Kubeconfig\n          command: |\n            echo \"$KUBECONFIG_ENCODED\" | base64 -d > \/tmp\/kubeconfig\n            chmod 600 \/tmp\/kubeconfig\n      - run:\n          name: Deploy to DigitalOcean Kubernetes\n          command: |\n            export KUBECONFIG=\/tmp\/kubeconfig\n            kubectl apply -f .kubernetes\/\n            kubectl set image deployment\/my-app-deployment my-app=$DOCKER_USER\/$DOCKER_REPO:$CIRCLE_SHA1 --record\n\nworkflows:\n  build_and_deploy:\n    jobs:\n      - build_and_push_docker_image\n      - deploy_to_kubernetes:\n          requires:\n            - build_and_push_docker_image # Da\u011f\u0131t\u0131m i\u015fi, Docker imaj\u0131 olu\u015fturulduktan sonra \u00e7al\u0131\u015f\u0131r\n          filters:\n            branches:\n              only: main # Sadece 'main' dal\u0131na yap\u0131lan push'larda da\u011f\u0131t\u0131m\u0131 tetikle<\/code><\/pre>\n<p><strong><code>config.yml<\/code> A\u00e7\u0131klamas\u0131:<\/strong><\/p>\n<p>*   <strong><code>version: 2.1<\/code><\/strong>: CircleCI yap\u0131land\u0131rma dosyas\u0131n\u0131n versiyonunu belirtir.<br \/>\n*   <strong><code>jobs<\/code><\/strong>:<br \/>\n    *   <strong><code>build_and_push_docker_image<\/code><\/strong>:<br \/>\n        *   <code>docker: - image: cimg\/base:2023.09<\/code>: Bu i\u015fin \u00e7al\u0131\u015faca\u011f\u0131 Docker imaj\u0131n\u0131 belirtir. Bu imaj, Docker CLI&#8217;\u0131 i\u00e7erir.<br \/>\n        *   <code>checkout<\/code>: Depoyu CircleCI \u00e7al\u0131\u015fma alan\u0131na klonlar.<br \/>\n        *   <code>setup_remote_docker<\/code>: Docker komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in izole bir Docker ortam\u0131 sa\u011flar.<br \/>\n        *   <code>docker login<\/code>: Ortam de\u011fi\u015fkenlerinden al\u0131nan kullan\u0131c\u0131 ad\u0131 ve parola ile Docker Hub&#8217;a giri\u015f yapar.<br \/>\n        *   <code>docker build<\/code>: Uygulama kodundan bir Docker imaj\u0131 olu\u015fturur. \u0130ki etiket kullan\u0131r\u0131z: biri benzersiz <code>CIRCLE_SHA1<\/code> commit hash&#8217;i ile, di\u011feri ise <code>latest<\/code> olarak. Bu, geri d\u00f6n\u00fc\u015f (rollback) yapmay\u0131 veya belirli bir versiyonu hedeflemeyi kolayla\u015ft\u0131r\u0131r.<br \/>\n        *   <code>docker push<\/code>: Olu\u015fturulan imaj\u0131 Docker Hub&#8217;a g\u00f6nderir.<br \/>\n    *   <strong><code>deploy_to_kubernetes<\/code><\/strong>:<br \/>\n        *   <code>docker: - image: cimg\/base:2023.09<\/code>: Bu i\u015fin \u00e7al\u0131\u015faca\u011f\u0131 Docker imaj\u0131.<br \/>\n        *   <code>install kubectl<\/code>: <code>kubectl<\/code> komut sat\u0131r\u0131 arac\u0131n\u0131 indirir ve y\u00fckler.<br \/>\n        *   <code>Decode and save Kubeconfig<\/code>: <code>KUBECONFIG_ENCODED<\/code> ortam de\u011fi\u015fkenindeki Base64 kodlu <code>kubeconfig<\/code> dosyas\u0131n\u0131 \u00e7\u00f6zer ve ge\u00e7ici bir dosyaya kaydeder. <code>chmod 600<\/code> ile dosya izinlerini ayarlar\u0131z.<br \/>\n        *   <code>Deploy to DigitalOcean Kubernetes<\/code>:<br \/>\n            *   <code>export KUBECONFIG=\/tmp\/kubeconfig<\/code>: <code>kubectl<\/code>&#8216;in do\u011fru <code>kubeconfig<\/code> dosyas\u0131n\u0131 kullanmas\u0131n\u0131 sa\u011flar.<br \/>\n            *   <code>kubectl apply -f .kubernetes\/<\/code>: <code>.kubernetes\/<\/code> dizinindeki t\u00fcm manifest dosyalar\u0131n\u0131 Kubernetes k\u00fcmesine uygular. Bu, <code>Deployment<\/code> ve <code>Service<\/code> nesnelerini olu\u015fturur veya g\u00fcnceller.<br \/>\n            *   <code>kubectl set image deployment\/my-app-deployment my-app=$DOCKER_USER\/$DOCKER_REPO:$CIRCLE_SHA1 --record<\/code>: Bu komut, mevcut <code>Deployment<\/code>&#8216;\u0131 yeni olu\u015fturulan Docker imaj\u0131yla g\u00fcnceller. <code>--record<\/code> bayra\u011f\u0131, de\u011fi\u015fikliklerin ge\u00e7mi\u015fini tutar ve gerekti\u011finde geri d\u00f6n\u00fc\u015f yapmay\u0131 kolayla\u015ft\u0131r\u0131r.<br \/>\n*   <strong><code>workflows<\/code><\/strong>:<br \/>\n    *   <code>build_and_deploy<\/code>: Bu i\u015f ak\u0131\u015f\u0131, <code>build_and_push_docker_image<\/code> i\u015fini \u00e7al\u0131\u015ft\u0131r\u0131r ve ard\u0131ndan bu i\u015f ba\u015far\u0131yla tamamland\u0131\u011f\u0131nda <code>deploy_to_kubernetes<\/code> i\u015fini \u00e7al\u0131\u015ft\u0131r\u0131r.<br \/>\n    *   <code>filters<\/code>: <code>deploy_to_kubernetes<\/code> i\u015finin yaln\u0131zca <code>main<\/code> dal\u0131na yap\u0131lan push i\u015flemlerinde tetiklenmesini sa\u011flar. Bu, geli\u015ftirme dallar\u0131nda sadece imaj\u0131n olu\u015fturulup test edilmesini, da\u011f\u0131t\u0131m\u0131n ise sadece ana dala birle\u015ftirilen kodlar i\u00e7in yap\u0131lmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Test ve Da\u011f\u0131t\u0131m<\/h3>\n<p>T\u00fcm bu yap\u0131land\u0131rmalar\u0131 yapt\u0131ktan sonra, projenizi GitHub\/GitLab&#8217;a push etti\u011finizde (\u00f6zellikle <code>main<\/code> dal\u0131na), CircleCI otomatik olarak tetiklenmeli ve pipeline&#8217;\u0131n\u0131z\u0131 \u00e7al\u0131\u015ft\u0131rmal\u0131d\u0131r.<\/p>\n<p>1.  Kodunuzu yerel makinenizde de\u011fi\u015fiklik yap\u0131n ve Git&#8217;e commit edin.<br \/>\n2.  <code>git push origin main<\/code> komutuyla <code>main<\/code> dal\u0131na push yap\u0131n.<br \/>\n3.  CircleCI paneline gidin ve projenizin &#8220;Workflows&#8221; b\u00f6l\u00fcm\u00fcn\u00fc izleyin. <code>build_and_push_docker_image<\/code> i\u015finin ba\u015far\u0131yla tamamland\u0131\u011f\u0131n\u0131 ve ard\u0131ndan <code>deploy_to_kubernetes<\/code> i\u015finin ba\u015flad\u0131\u011f\u0131n\u0131 g\u00f6rmelisiniz.<br \/>\n4.  Her iki i\u015f de ba\u015far\u0131yla tamamland\u0131\u011f\u0131nda, uygulaman\u0131z DigitalOcean Kubernetes k\u00fcmenize da\u011f\u0131t\u0131lm\u0131\u015f olacakt\u0131r.<br \/>\n5.  Uygulaman\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011frulamak i\u00e7in, DigitalOcean kontrol panelinden k\u00fcmenizin detaylar\u0131na gidin. &#8220;Load Balancers&#8221; b\u00f6l\u00fcm\u00fcnde yeni bir Load Balancer&#8217;\u0131n olu\u015fturuldu\u011funu ve bir IP adresi atand\u0131\u011f\u0131n\u0131 g\u00f6rmelisiniz. Bu IP adresini taray\u0131c\u0131n\u0131zda a\u00e7t\u0131\u011f\u0131n\u0131zda &#8220;Hello from DigitalOcean Kubernetes with CircleCI!&#8221; mesaj\u0131n\u0131 g\u00f6rmelisiniz. Alternatif olarak, <code>kubectl get services<\/code> komutunu kullanarak Service&#8217;inizin <code>EXTERNAL-IP<\/code> adresini alabilirsiniz.<\/p>\n<pre><code class=\"language-bash\">export KUBECONFIG=\/tmp\/kubeconfig # Veya kendi kubeconfig dosyan\u0131z\u0131n yolu\nkubectl get services -n default<\/code><\/pre>\n<p><code>my-app-service<\/code> i\u00e7in <code>EXTERNAL-IP<\/code> s\u00fctunundaki IP adresini not al\u0131n.<\/p>\n<h3>G\u00fcvenlik ve En \u0130yi Uygulamalar<\/h3>\n<p>Otomatik da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini uygularken g\u00fcvenlik ve en iyi uygulamalar\u0131 g\u00f6z \u00f6n\u00fcnde bulundurmak kritik \u00f6neme sahiptir.<\/p>\n<p>*   <strong>Hassas Bilgilerin Y\u00f6netimi:<\/strong> <code>DOCKER_PASS<\/code> ve <code>KUBECONFIG_ENCODED<\/code> gibi hassas bilgileri asla kod deponuzda saklamay\u0131n. CircleCI&#8217;\u0131n ortam de\u011fi\u015fkenleri veya Vault gibi gizli y\u00f6netim ara\u00e7lar\u0131, bu t\u00fcr bilgileri g\u00fcvenli bir \u015fekilde saklamak i\u00e7in kullan\u0131lmal\u0131d\u0131r.<br \/>\n*   <strong>Minimum Yetkilendirme Prensibi:<\/strong> Kubernetes k\u00fcmeniz i\u00e7in CircleCI&#8217;\u0131n kullanaca\u011f\u0131 kimlik bilgilerine (kubeconfig) yaln\u0131zca da\u011f\u0131t\u0131m i\u00e7in gerekli olan minimum yetkileri verin. \u00d6rne\u011fin, sadece belirli bir namespace&#8217;e da\u011f\u0131t\u0131m yapma veya belirli kaynaklar\u0131 g\u00fcncelleme yetkisi gibi.<br \/>\n*   <strong>Image Tagging ve Versiyonlama:<\/strong> Docker imajlar\u0131n\u0131z\u0131 <code>latest<\/code> etiketiyle birlikte <code>CIRCLE_SHA1<\/code> veya semantik versiyonlama (\u00f6rne\u011fin, <code>v1.2.3<\/code>) gibi benzersiz etiketlerle etiketleyin. Bu, belirli bir imaj\u0131 geri d\u00f6nd\u00fcrmeyi veya sorun gidermeyi kolayla\u015ft\u0131r\u0131r.<br \/>\n*   <strong>Rollback Stratejileri:<\/strong> Da\u011f\u0131t\u0131mda bir sorun ya\u015fanmas\u0131 durumunda h\u0131zl\u0131 bir \u015fekilde \u00f6nceki kararl\u0131 versiyona geri d\u00f6nebilmek i\u00e7in bir rollback stratejisi belirleyin. <code>kubectl rollout undo deployment\/my-app-deployment<\/code> gibi komutlar Kubernetes&#8217;te geri d\u00f6n\u00fc\u015f yapmay\u0131 sa\u011flar.<br \/>\n*   <strong>Sa\u011fl\u0131k Kontrolleri (Liveness\/Readiness Probes):<\/strong> Kubernetes <code>Deployment<\/code>&#8216;lar\u0131n\u0131zda Liveness ve Readiness Probes tan\u0131mlayarak uygulaman\u0131z\u0131n sa\u011fl\u0131kl\u0131 olup olmad\u0131\u011f\u0131n\u0131 otomatik olarak kontrol edin. Bu, sorunlu pod&#8217;lar\u0131n trafik almas\u0131n\u0131 engeller ve otomatik olarak yeniden ba\u015flat\u0131lmas\u0131n\u0131 sa\u011flar.<br \/>\n*   <strong>Test Otomasyonu:<\/strong> CI s\u00fcrecinin temel amac\u0131, kod de\u011fi\u015fikliklerinin entegrasyonunu ve testini otomatikle\u015ftirmektir. Da\u011f\u0131t\u0131m \u00f6ncesinde birim testleri, entegrasyon testleri ve hatta u\u00e7tan uca testler \u00e7al\u0131\u015ft\u0131rmak, \u00fcretim ortam\u0131na giden hatalar\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde azalt\u0131r. Bu rehberde test ad\u0131mlar\u0131n\u0131 atlad\u0131k, ancak ger\u00e7ek bir projede <code>build_and_push_docker_image<\/code> i\u015finin i\u00e7ine test ad\u0131mlar\u0131n\u0131 eklemeniz \u015fiddetle tavsiye edilir.<\/p>\n<h3>Sorun Giderme ve Yayg\u0131n Hatalar<\/h3>\n<p>Otomatik da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinde kar\u015f\u0131la\u015fabilece\u011finiz baz\u0131 yayg\u0131n sorunlar ve \u00e7\u00f6z\u00fcmleri:<\/p>\n<p>*   <strong><code>kubectl<\/code> Kimlik Do\u011frulama Sorunlar\u0131:<\/strong><br \/>\n    *   <code>KUBECONFIG_ENCODED<\/code> ortam de\u011fi\u015fkeninin do\u011fru Base64 kodlu <code>kubeconfig<\/code> i\u00e7eri\u011fini i\u00e7erdi\u011finden emin olun.<br \/>\n    *   <code>kubeconfig<\/code> dosyas\u0131n\u0131n CircleCI konteyneri i\u00e7inde do\u011fru yola (\u00f6rne\u011fin, <code>\/tmp\/kubeconfig<\/code>) kaydedildi\u011finden ve <code>KUBECONFIG<\/code> ortam de\u011fi\u015fkeninin do\u011fru \u015fekilde ayarland\u0131\u011f\u0131ndan emin olun.<br \/>\n    *   Kubernetes k\u00fcmenizin eri\u015filebilir oldu\u011fundan ve kimlik bilgilerinin s\u00fcresinin dolmad\u0131\u011f\u0131ndan emin olun.<br \/>\n*   <strong>Docker \u0130maj\u0131 \u00c7ekme Hatalar\u0131:<\/strong><br \/>\n    *   <code>DOCKER_USER<\/code> ve <code>DOCKER_PASS<\/code> ortam de\u011fi\u015fkenlerinin do\u011fru oldu\u011fundan emin olun.<br \/>\n    *   <code>Dockerfile<\/code>&#8216;\u0131n\u0131z\u0131n hatal\u0131 olmad\u0131\u011f\u0131ndan ve imaj\u0131n ba\u015far\u0131yla olu\u015fturulup Docker Hub&#8217;a g\u00f6nderildi\u011finden emin olun.<br \/>\n    *   Kubernetes <code>Deployment<\/code> manifestindeki imaj ad\u0131n\u0131n (<code>your-dockerhub-username\/my-app:latest<\/code>) do\u011fru oldu\u011fundan emin olun.<br \/>\n*   <strong>Kubernetes Manifest Hatalar\u0131:<\/strong><br \/>\n    *   <code>deployment.yaml<\/code> veya <code>service.yaml<\/code> dosyalar\u0131n\u0131z\u0131n YAML s\u00f6zdizimi hatalar\u0131 i\u00e7ermedi\u011finden emin olun. <code>kubectl apply -f .kubernetes\/ --dry-run=client<\/code> komutuyla yerel olarak do\u011frulayabilirsiniz.<br \/>\n    *   Manifest dosyalar\u0131ndaki etiketlerin (<code>labels<\/code>) ve se\u00e7icilerin (<code>selectors<\/code>) do\u011fru bir \u015fekilde e\u015fle\u015fti\u011finden emin olun.<br \/>\n*   <strong>Ortam De\u011fi\u015fkeni Eksiklikleri:<\/strong><br \/>\n    *   CircleCI projenizin ayarlar\u0131nda t\u00fcm gerekli ortam de\u011fi\u015fkenlerinin (<code>DOCKER_USER<\/code>, <code>DOCKER_PASS<\/code>, <code>KUBECONFIG_ENCODED<\/code>, <code>DOCKER_REPO<\/code>) tan\u0131mland\u0131\u011f\u0131ndan emin olun.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Bu makalede, DigitalOcean Kubernetes&#8217;e CircleCI kullanarak otomatik da\u011f\u0131t\u0131mlar yapman\u0131n t\u00fcm ad\u0131mlar\u0131n\u0131 detayl\u0131 bir \u015fekilde inceledik. Bir uygulaman\u0131n Docker imaj\u0131n\u0131n olu\u015fturulmas\u0131ndan, bir container registry&#8217;ye g\u00f6nderilmesine ve son olarak Kubernetes k\u00fcmesine da\u011f\u0131t\u0131lmas\u0131na kadar u\u00e7tan uca bir CI\/CD pipeline&#8217;\u0131 kurduk. Bu otomasyon, geli\u015ftirme s\u00fcre\u00e7lerinizi h\u0131zland\u0131racak, hatalar\u0131 azaltacak ve yaz\u0131l\u0131m teslimatlar\u0131n\u0131z\u0131 daha g\u00fcvenilir hale getirecektir.<\/p>\n<p>CI\/CD ve Kubernetes d\u00fcnyas\u0131 s\u00fcrekli geli\u015fmektedir. Bu temel kurulumun \u00fczerine Helm ile paket y\u00f6netimi, Kustomize ile yap\u0131land\u0131rma \u00f6zelle\u015ftirmeleri veya ArgoCD gibi GitOps ara\u00e7lar\u0131 ile daha geli\u015fmi\u015f da\u011f\u0131t\u0131m stratejileri ekleyerek s\u00fcre\u00e7lerinizi daha da optimize edebilirsiniz. Unutmay\u0131n, otomasyon, s\u00fcrekli iyile\u015ftirme yolculu\u011funun sadece ba\u015flang\u0131c\u0131d\u0131r.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"DigitalOcean Kubernetes&#8217;e CircleCI ile Otomatik Da\u011f\u0131t\u0131mlar Nas\u0131l Yap\u0131l\u0131r?\nGiri\u015f\nModern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde h\u0131z, g\u00fcvenili","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1328],"tags":[],"class_list":{"0":"post-33105","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-bash","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>DigitalOcean Kubernetes&#039;e CircleCI ile Otomatik Da\u011f\u0131t\u0131mlar Nas\u0131l Yap\u0131l\u0131r? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetese-circleci-ile-otomatik-dagitimlar-nasil-yapilir\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"DigitalOcean Kubernetes&#039;e CircleCI ile Otomatik Da\u011f\u0131t\u0131mlar Nas\u0131l Yap\u0131l\u0131r?\" \/>\n<meta property=\"og:description\" content=\"DigitalOcean Kubernetes&#039;e CircleCI ile Otomatik Da\u011f\u0131t\u0131mlar Nas\u0131l Yap\u0131l\u0131r?  Giri\u015f Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde h\u0131z, g\u00fcvenili\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetese-circleci-ile-otomatik-dagitimlar-nasil-yapilir\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-29T13:42:03+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=\"17 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetese-circleci-ile-otomatik-dagitimlar-nasil-yapilir\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetese-circleci-ile-otomatik-dagitimlar-nasil-yapilir\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"DigitalOcean Kubernetes&#8217;e CircleCI ile Otomatik Da\u011f\u0131t\u0131mlar Nas\u0131l Yap\u0131l\u0131r?\",\"datePublished\":\"2025-10-29T13:42:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetese-circleci-ile-otomatik-dagitimlar-nasil-yapilir\/\"},\"wordCount\":2567,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Bash\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetese-circleci-ile-otomatik-dagitimlar-nasil-yapilir\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetese-circleci-ile-otomatik-dagitimlar-nasil-yapilir\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetese-circleci-ile-otomatik-dagitimlar-nasil-yapilir\/\",\"name\":\"DigitalOcean Kubernetes'e CircleCI ile Otomatik Da\u011f\u0131t\u0131mlar Nas\u0131l Yap\u0131l\u0131r? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-29T13:42:03+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetese-circleci-ile-otomatik-dagitimlar-nasil-yapilir\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetese-circleci-ile-otomatik-dagitimlar-nasil-yapilir\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetese-circleci-ile-otomatik-dagitimlar-nasil-yapilir\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"DigitalOcean Kubernetes&#8217;e CircleCI ile Otomatik Da\u011f\u0131t\u0131mlar Nas\u0131l Yap\u0131l\u0131r?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"DigitalOcean Kubernetes'e CircleCI ile Otomatik Da\u011f\u0131t\u0131mlar Nas\u0131l Yap\u0131l\u0131r? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetese-circleci-ile-otomatik-dagitimlar-nasil-yapilir\/","og_locale":"tr_TR","og_type":"article","og_title":"DigitalOcean Kubernetes'e CircleCI ile Otomatik Da\u011f\u0131t\u0131mlar Nas\u0131l Yap\u0131l\u0131r?","og_description":"DigitalOcean Kubernetes'e CircleCI ile Otomatik Da\u011f\u0131t\u0131mlar Nas\u0131l Yap\u0131l\u0131r?  Giri\u015f Modern yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinde h\u0131z, g\u00fcvenili","og_url":"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetese-circleci-ile-otomatik-dagitimlar-nasil-yapilir\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-29T13:42:03+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"17 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetese-circleci-ile-otomatik-dagitimlar-nasil-yapilir\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetese-circleci-ile-otomatik-dagitimlar-nasil-yapilir\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"DigitalOcean Kubernetes&#8217;e CircleCI ile Otomatik Da\u011f\u0131t\u0131mlar Nas\u0131l Yap\u0131l\u0131r?","datePublished":"2025-10-29T13:42:03+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetese-circleci-ile-otomatik-dagitimlar-nasil-yapilir\/"},"wordCount":2567,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Bash"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetese-circleci-ile-otomatik-dagitimlar-nasil-yapilir\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetese-circleci-ile-otomatik-dagitimlar-nasil-yapilir\/","url":"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetese-circleci-ile-otomatik-dagitimlar-nasil-yapilir\/","name":"DigitalOcean Kubernetes'e CircleCI ile Otomatik Da\u011f\u0131t\u0131mlar Nas\u0131l Yap\u0131l\u0131r? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-29T13:42:03+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetese-circleci-ile-otomatik-dagitimlar-nasil-yapilir\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetese-circleci-ile-otomatik-dagitimlar-nasil-yapilir\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/digitalocean-kubernetese-circleci-ile-otomatik-dagitimlar-nasil-yapilir\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"DigitalOcean Kubernetes&#8217;e CircleCI ile Otomatik Da\u011f\u0131t\u0131mlar Nas\u0131l Yap\u0131l\u0131r?"}]},{"@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\/33105","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=33105"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33105\/revisions"}],"predecessor-version":[{"id":33106,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33105\/revisions\/33106"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33105"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33105"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33105"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}