<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Suleyman</title>
    <description>The latest articles on DEV Community by Suleyman (@suleymanakturk).</description>
    <link>https://dev.to/suleymanakturk</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1268643%2F84c309b6-eb17-4662-b7d0-0c324fa8f076.png</url>
      <title>DEV Community: Suleyman</title>
      <link>https://dev.to/suleymanakturk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/suleymanakturk"/>
    <language>en</language>
    <item>
      <title>Helm Nedir</title>
      <dc:creator>Suleyman</dc:creator>
      <pubDate>Tue, 30 Dec 2025 19:51:33 +0000</pubDate>
      <link>https://dev.to/suleymanakturk/helm-nedir-4m34</link>
      <guid>https://dev.to/suleymanakturk/helm-nedir-4m34</guid>
      <description>&lt;p&gt;&lt;strong&gt;Helm Nedir&lt;/strong&gt;&lt;br&gt;
Kubernetes kullanan herkesin mutlaka öğreneceği bir yazılım olan helm için kubernetesin paket yöneticisi diyebiliriz. İşletim sistemlerinde ki apt,dnf gibi hızlı bir şekilde uygulamalarımızı kurmamızı sağlamaktadır.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fft0tzg2w08ir9i9p5bdw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fft0tzg2w08ir9i9p5bdw.png" alt=" " width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Örneğin;&lt;/strong&gt; wordpress altyapısı için bir wordpress yazılımı ve arka tarafında mysql veritabanı çalışması gerekmektedir. Biz bu yapıyı manuel olarak deploymentlar, statefulset ve servisler ile ayağa kaldırabiliriz.  Ama helm ile bu yapıyı tek bir komutla ayağa kaldırabiliriz.&lt;/p&gt;

&lt;p&gt;Wordpress iki bileşenden oluşuyor ama uygulamamız için deploymentlar, statefulset, servisler, persistencevolume, serviceaccount, rolebinding gibi fazla sayıda objemiz var ise bu yapıyı farklı clusterlarda ayağa kaldırmak iş yükü çıkartacaktır. Helm ile bu yapıyı bir paket haline getirip tek komut ile ayağa kaldırabiliriz.&lt;/p&gt;

&lt;p&gt;Bir güzel özelliği daha ortama bağlı olarak dinamik değerlerin kullanılabilmesidir. Örneğin; dev veya prod ortamları için farklı kaynak limitleri, pod replika sayıları vb. oluşturabiliriz.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Helm Chart Olusturma&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;helm create suleyman-helm-project&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Yukarıda ki komut ile helm chart oluşturuyoruz. Bu komut ile bize helm dosya yapısını oluşturacak&lt;/p&gt;

&lt;p&gt;charts&lt;br&gt;
Chart.yaml &amp;gt; Helm chart ile ilgili temel bilgilerin yazıldığı dosyadır. Chart ismi, versiyonu v.&lt;br&gt;
templates &amp;gt; Kubernetes manifest dosyalarımızın yazıldığı klasördür.&lt;br&gt;
values.yaml &amp;gt; Helm chart için varsayılan değerlerin yazıldığı klasördür.&lt;/p&gt;

&lt;p&gt;Aşağıdaki gibi bir python uygulamam ve bağlandığı veritabanı ve bunların servisleri var.  Bunları templates klasörüne içine atıyorum.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhslpccai8t9t5979fk5z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhslpccai8t9t5979fk5z.png" alt=" " width="800" height="104"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Artık suleyman-helm-project klasörünün içerisinde &lt;code&gt;helm install suleyman-uygulama .&lt;/code&gt; aşağıdaki gibi bir sonuç verecektir.&lt;/p&gt;

&lt;p&gt;root@master:~/helm/suleyman-project# helm install suleyman-uygulama .&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NAME: suleyman-uygulama
LAST DEPLOYED: Tue Dec 30 19:45:29 2025
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kaldırmak için de &lt;code&gt;helm uninstall suleyman-uygulama&lt;/code&gt; komutu kullanılabilir.&lt;/p&gt;

&lt;p&gt;Helm ile önceki versiyonlar arasında geçiş yapabiliriz. Bu şekilde kullanmak çok kullanışlı değil çünkü parametreler dinamik olarak güncellenmiyor. Ama production ortamlarda bazı istenilen değerler values.yaml dosyası ile dinamik olarak değiştirilebilmektedir.&lt;/p&gt;

&lt;p&gt;Helm ile ilgili daha fazla örneğini aşağıdaki github repository içerisinde bulabilirsiniz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/suleymanakturk/Helm.git" rel="noopener noreferrer"&gt;https://github.com/suleymanakturk/Helm.git&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bir sonraki makalede görüşmek üzere, iyi günler.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>automation</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Sonarqube Nedir</title>
      <dc:creator>Suleyman</dc:creator>
      <pubDate>Sat, 13 Dec 2025 12:18:28 +0000</pubDate>
      <link>https://dev.to/suleymanakturk/sonarqube-nedir-1jjm</link>
      <guid>https://dev.to/suleymanakturk/sonarqube-nedir-1jjm</guid>
      <description>&lt;p&gt;Merhaba,&lt;/p&gt;

&lt;p&gt;Bu makalede yazılımcıların ve Devops mühendislerinin en çok kullandığı uygulamalardan biri olan sonarqube uygulamasını inceleyeceğiz.&lt;/p&gt;

&lt;p&gt;Sonarqube, yazılım geliştirme sürecinde kullanılan bir açık kaynaklı platformdur. Kod kalitesini analiz etmek, hataları ve kötü uygulama uygulamalarını belirlemek için kullanılır. Hem community hem de enterprise sürümleri bulunmaktadır.&lt;/p&gt;

&lt;p&gt;Sonarqube uygulamasını ister direk sunucu üzerine istersek docker veya kubernetes üzerine veya sonarcloud üzerinde çalıştırabiliriz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjgpvy0gs99ltlc4onvon.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjgpvy0gs99ltlc4onvon.png" alt=" " width="800" height="292"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sonarqube Özellikler&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Statik Kod Analizi:&lt;/strong&gt; SonarQube kaynak kodunu çalıştırmadan analiz eder. Hatalar, güvenlik açıkları, kod çoğaltma ve daha fazlası gibi sorunları kontrol eder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kalite Kapıları:&lt;/strong&gt; SonarQube, analizi geçmek için kodunuzun karşılaması gereken standartları tanımlamak için kalite kapılarını kullanır. Yeni kod değişikliklerinin yeni kalite sorunları yaratmamasını sağlamaya yardımcı olur.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CI/CD ile entegrasyon:&lt;/strong&gt; SonarQube, Jenkins, GitLab CI ve Travis CI gibi sürekli entegrasyon (CI) araçlarıyla iyi bir şekilde entegre olur. Bu, ekiplerin CI/CD hattının bir parçası olarak kod analizini otomatikleştirmesine olanak tanır.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Birden Çok Dil Desteği:&lt;/strong&gt; SonarQube, 27'den fazla programlama dilini destekleyerek birden fazla teknolojiyle çalışan ekipler için mükemmel bir uyum sağlar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sonarqube Neyi Analiz Eder&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sonarqube bir yazılımı test ederken aşağıdaki noktaları ele alır ve analiz eder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bugs:&lt;/strong&gt; Kod içerisinde problem meydana getilebilecek hatalardır.&lt;br&gt;
&lt;strong&gt;Vulnerability:&lt;/strong&gt; Güvenlik açıklarını tespit eder.&lt;br&gt;
&lt;strong&gt;Code Smell:&lt;/strong&gt; Gereksiz yere yazılmış olan kodları tespit eder. Daha temiz ve anlaşılabilir kod yazılmasını belirtir. Çünkü bu kodlar ileride bakım zorlaştırabilir ve problem meydana getirebilir.&lt;br&gt;
&lt;strong&gt;Duplicated Code:&lt;/strong&gt; Aynı veya benzer kod bloklarını analiz eder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sonarqube Bileşenleri&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sonar Scanner:&lt;/strong&gt; Asıl kod analizini yapan araçtır.&lt;br&gt;
&lt;strong&gt;Sonarqube GUI:&lt;/strong&gt; Sonar scanner tarafından analiz edilen kodu GUI aracılığıyla kullanıcıya sunar.&lt;br&gt;
&lt;strong&gt;Veritabanı&lt;/strong&gt;: Analiz edilen kodun saklandığı bileşendir.&lt;br&gt;
&lt;strong&gt;Kurallar:&lt;/strong&gt; Sonarqube bir kodu analiz ederken daha önce sağlayıcı ve topluluklar tarafından belirlenen kurallarla karşılaştırarak analiz eder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Qaulity Profiles&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Kuralları içeren profillerdir. Sonarqube tarafından varsayılan olarak desteklediği diller için profiller mevcuttur. Örneğin; C# dili için yazılmış kurallar C# için oluşturulmuş profilin içerisinde bulunur. İstenirse kendi profilimizi yazıp istenilen kuralları atayabilir ve oluşturulan projede bu profili kullan diyebiliriz.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quality Gates&lt;/strong&gt;&lt;br&gt;
Bir projenin uyması gereken kurallar bütünü ya da bir güvenlik kapısı diyebiliriz. Örneğin; bir proje de en fazla 3 tane bugs , en fazla 2 vulnerability ya da coverage oranı %75 üzerinde ise kod geçerli olsun diyebiliyoruz. Bu değerle uymayanlar failed duruma düşmektedir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;New Code ve Overall Code Nedir ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sonarqube geliştiricilerin yoluna temiz kod ile ilerleyin (Clean as You Code ) felsefisini ele alır. Bundan dolayı New Code ve Overall Code kavramları bulunmaktadır.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;New Code:&lt;/strong&gt; Bir referans noktasından sonra yazılan kodlardır. Referans noktaları önceki sürüm, belirli bir tarih, belirli bir analiz ya da branch olabilir.  Amaç geliştiricilerin bundan sonra ki işlemlerinde bugs, vulnerability, code smell'in ortaya çıkmamasını sağlamaktadır.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Overall Code:&lt;/strong&gt; Eski kod + yeni code ' nın birleşimi ile oluşur ve projeye genel bir bakış yapar. Aslında overall code projenin tamamıdır. Tabi ki sadece new code ' ye bakmak yeterli değil overall code içerisinde bulunan bugs, vulnerability ... zamanla iyileştirmek gerekir.&lt;/p&gt;

&lt;p&gt;Qaulity Gates New Code'ye bakarak analiz yapar ve kodu değerlendirir. Bu yüzden bir proje oluştururken ilk analizin passed geçecektir. Çünkü ilk analiz bir referans noktası olur. Bu analizden sonra yazılan kodlar new code olur ve eğer quality gates'e takılırsa failed olur.&lt;/p&gt;

&lt;p&gt;Eğer sonarqube new code yaklaşımı ile çalışmasaydı eski projeler sürekli failed verirdi ve bunları düzeltmek aylar sürebilirdi. Sonarqube eski koda bakmaz yeni kodlara odaklan felsefesi ile çalışır.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sonarqube ile Python Kodu Analiz Etmek&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;İstesek projemizi git repositorylerinden alabiliriz fakat ben burada test amaçlı local kullanacağım.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9uzb870ejhbtgp38grd6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9uzb870ejhbtgp38grd6.png" alt=" " width="800" height="234"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffyq32w3rohf27ta6voqj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffyq32w3rohf27ta6voqj.png" alt=" " width="800" height="374"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffifhkmyro4rnkj2x19pc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffifhkmyro4rnkj2x19pc.png" alt=" " width="800" height="491"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Burada istersek CI/CD tooluna entegre edebiliriz ama yine test olduğu için local olarak ilerliyorum.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb787edx7cwqm3y0vbjbh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb787edx7cwqm3y0vbjbh.png" alt=" " width="800" height="247"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bundan sonra Continue diyoruz ve bizden hangi yazılım dili için işlem yapacağımızı soruyor. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi6u9dgp2joa9l7gnvlls.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi6u9dgp2joa9l7gnvlls.png" alt=" " width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ardından bize aşağıdaki gibi bir komut verecektir. &lt;/p&gt;

&lt;p&gt;pip install pysonar, ile uygulamayı kuracağız ve komutu çalıştırdıktan sonra GUI de sonuçları gösterecek.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pysonar \
  --sonar-host-url=http://172.35.28.154:9000 \
  --sonar-token=sqp_3adb3f55fe5d9239d5a2adb5cc53b8915d8754a7 \
  --sonar-project-key=python-project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxthzjfkvik5d70lr0kbc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxthzjfkvik5d70lr0kbc.png" alt=" " width="800" height="326"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tabi bu şekilde kullanmak yerine  Jenkins, Gitlab CI vb. uygulamalara entegre edilerek kullanılıyor. Bir sonra ki makalede Gitlab CI ile entegre etme işlemini göreceğiz.&lt;/p&gt;

&lt;p&gt;İyi günler.&lt;/p&gt;

</description>
      <category>tooling</category>
      <category>security</category>
      <category>testing</category>
      <category>devops</category>
    </item>
    <item>
      <title>HashiCorp Vault Nedir</title>
      <dc:creator>Suleyman</dc:creator>
      <pubDate>Sat, 29 Nov 2025 18:27:08 +0000</pubDate>
      <link>https://dev.to/suleymanakturk/hashicorp-vault-nedir-1156</link>
      <guid>https://dev.to/suleymanakturk/hashicorp-vault-nedir-1156</guid>
      <description>&lt;p&gt;HashiCorp Vault, temel olarak erişim bilgilerimizin (username-password, API token, SSL/TLS sertifikaları ) güvenli ve merkezi bir noktadan saklayıp yönetmemizi sağlayan bir uygulamadır.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Avantajları:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Merkezi noktadan yönetim:&lt;/strong&gt; Birden fazla uygulama aynı vault sunucuna erişim sağlayıp istenilen bilgiye erişebilir.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Erişim ve Yetkilendirme:&lt;/strong&gt; HashiCorp vault, birçok erişim metodunu destekler(token, username-password, güvenlik sertifikaları, LDAP) ve erişim sağlayan kişinin hangi bilgiye, hangi yetkilerle(read-write) sahip olacağını tanımlayabiliriz.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Şifreleme:&lt;/strong&gt; HashiCorp Vault, client ile vault arasında ki veri akışını güvenli bir şifreleme ile yapar.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Restful API:&lt;/strong&gt; Vault, RestAPI protokolünü desteklediği için secret oluşturma, silme, güncelleme gibi işlemleri HTTP/HTTPS protokolü üzerinden gerçekleştirebilir. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dinamik Secret:&lt;/strong&gt; Static bilgi saklayabileceğimiz gibi istersek periyodik olarak güncellenen dinamil secretlarda oluşturabiliriz. Bu durum güvenlik riskini de artırmaktadır.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Günlük ve İzleme:&lt;/strong&gt; Vault kimin hangi bilgiye eriştiğini izler ve yazar bu sayede herhangi bir veri sızıntısında hangi kaynaktan gerçekleştiğini öğrenebiliriz.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Geniş Destek:&lt;/strong&gt; Vault dünya genelinde birçok uygulamada ile entegrede çalışabilmektedir. Kubernetes, Ansible, Terraform, RabbitMQ ... Bu durum vault'un kullanımını da arttırmaktadır.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Vault Bileşenleri&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Secret Engines:&lt;/strong&gt; Vault'un gizli bilgileri (secrets) nasıl oluşturacağını, saklayacağını veya dinamik olarak üreteceğini tanımlayan modüllerdir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Statik Gizemler:&lt;/strong&gt; K/V (Key/Value) motoru, kullanıcı tarafından girilen statik şifreleri, API anahtarlarını veya TLS sertifikalarını depolar. &lt;br&gt;
&lt;strong&gt;2. Dinamik Gizemler:&lt;/strong&gt; Veritabanı (Database) veya AWS motorları, bir uygulama talep ettiğinde sadece o an için geçerli, kısa ömürlü (TTL) kimlik bilgileri (dinamik şifreler, geçici AWS anahtarları vb.) oluşturur.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auth Methods:&lt;/strong&gt; İstemcilerin vaulta erişimlerini denetler. Örneğin; token, username-password, güvenlik sertifikaları...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Politikalar:&lt;/strong&gt; Auth Methods ile giriş yapabilen istemcinin hangi kaynaklara ve hangi yetkilerle erişeceğini belirler.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Audit Devices:&lt;/strong&gt; Bilgilere erişim sağlayan kişilerin günlük kayıtlarının tutulduğu bileşendir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Depolama Arka Ucu:&lt;/strong&gt; Gizli verilerin, yapılandırma ayarlarının, politikaların ve kimlik doğrulama verilerinin kalıcı olarak depolanmasını sağlar. Veriler burada şifreli bir şekilde saklanmaktadır.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vault Nasıl Çalışır&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Master Key:&lt;/strong&gt; Asıl amacı verileri şifreleyen "Data Encryption Key(DEK)" şifrelemektedir. Bu key sunucu ilk kurulduğunda veya başlatıldığında oluşturulur ve memory tutulur. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data Encryption Key(DEK)&lt;/strong&gt;: Amacı vault üzerinde oluşturulan verileri şifrelemek ve çözmektir. Depolama arka ucunda tutulur. Ama master key olmadan bir anlamı yoktur çünkü verilere sadece bu key ile erişim sağlananamaktadır.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Seal ve Unseal Kavramları Nedir&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Seal:&lt;/strong&gt; Vault'un şifreli ve erişilemez olduğu durumdur. Bu durumda herhangi bir işlem yapılamaz. Vault ilk çalıştırıldığında ve restart olduğunda bu durumdadır(Auto-unseal yok ise)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unseal:&lt;/strong&gt; Vault'un kilidinin açılmasıdır. Bu işlem sırasında Master Key "Shamir’s Secret Sharing" isminde bir algoritma ile birkaç parçaya bölünür. key-shares = 5, key-threshold = 3 şeklinde bir tanım 5 tane unseal key'in oluşması ama 3 tanesinin yeterli olacağını belirtir. Bu key girildikten sonra master key oluşur ve vault'un kilidir açılır.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auto-unseal&lt;/strong&gt;, vault sunucu her yeniden başlatıldığında seal durumuna geçeceğini için production ortamda sıkıntı çıkarabilir. Bu durumda unseal işlemi otomotik gerçekleştilir. Bu işlem HSM cihazları ile yapılabilmektedir. Yaygın kullanılan servisler AWS KMS, Azure Key Vault, Google Cloud KMS&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vault Çalışma Modları&lt;/strong&gt;&lt;br&gt;
Vault 2 farklı çalışma modu ile çalıştırabiliriz. &lt;br&gt;
1- Developer Mode&lt;br&gt;
2- Production Mode &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1- Developer Mode:&lt;/strong&gt; Test/Dev ortamları için kullanılabilen ve verilerin memory üzerinde tutulduğu modtur. Auto-unseal özelliği bulunmaktadır. Amaç vaultu test etmek ve öğrenmek için tasarlanmıştır.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2- Production Mode:&lt;/strong&gt; Amacı production ortamda kullanmaktır. Veriler arka depoloma sunucunda saklanır ve her başlatıldığında veriler silinmez ve sunucu her başlatıldığında seal(mühürlenmiş) olur. Standby node olarak kurulabileceği yüksek erişilebilirlik için birkaç node kurulabilir. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Docker ile Vault Kurulumu ve Kullanımı&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ben test etmek amaçlı docker üzerinde hızlıca bir vault contaıneri ayağa kaldıracağım ve kullanacağım. Bizim ki production mode çalışacak.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;version: '3.7'

services:
  vault:
    image: hashicorp/vault:latest
    container_name: vault
    ports:
      - "8200:8200" 
    volumes:
      - ./config/vault.hcl:/vault/config/config.hcl:ro 
      - vault_data:/vault/file # 
    environment:   
      VAULT_CONFIG_FILE: /vault/config/config.hcl
      VAULT_ADDR: 'http://0.0.0.0:8200'
      VAULT_SKIP_CHOWN: true
    cap_add:
    command: "server"
volumes:
  vault_data:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;./config/vault.hcl&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ui = true
listener "tcp" {
  address     = "0.0.0.0:8200"
  tls_disable = 1 # Test/Geliştirme için TLS devre dışı
}
storage "file" {
  path = "/vault/file" # Veri kalıcı volume'e yazılacak
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aşağıdaki komutla ayağa kaldırabiliriz.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker compose up -d&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Temel Vault Komutları&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;vault --help&lt;/code&gt;, Kullanabileceğimiz komutları görüntüleyebiliriz.&lt;br&gt;
&lt;code&gt;vault login&lt;/code&gt;, Vault'a login olmamızı sağlar. Bizden token isteyecektir.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;vault status&lt;/code&gt;, Vault'un durumunu öğrenebiliriz.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;vault operator unseal&lt;/code&gt; &lt;br&gt;
&lt;code&gt;vault operator unseal&lt;/code&gt; &lt;br&gt;
&lt;code&gt;vault operator unseal&lt;/code&gt;  , vault kilidini açmamızı sağlar&lt;/p&gt;

&lt;p&gt;&lt;code&gt;vault operator seal&lt;/code&gt;, vault'u kilitlemizi sağlar.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;vault secrets enable -path=secret kv-v2&lt;/code&gt;, kv tipinde secret engine enable eder.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;vault kv put secret/mysql username="root" password="12345"&lt;/code&gt;, secret oluşturmamızı sağlar.  kv put secret/mysql altındaki tüm verileri silip yeni verileri yazar yani override eder. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;vault kv patch secret/mysql username="root" password="12345"&lt;/code&gt;, bu üzerine yazar. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;vault kv get secret/mysql&lt;/code&gt;, secret okumamızı sağlar.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;vault kv get --format=json secret/mysql&lt;/code&gt;, secretlerı json formatında görüntülememizi sağlar.&lt;/p&gt;

&lt;p&gt;Komut,İşlem Türü,Geri Alınabilir mi?,GUI Durumu&lt;br&gt;
&lt;code&gt;vault kv delete secret/mysql&lt;/code&gt;, Soft Delete , Veriler geri alınabilir.&lt;br&gt;
&lt;code&gt;vault kv destroy --versions=1 secret/mysql&lt;/code&gt;, Soft Delete (Version),Veri gider, metadata kalır.)&lt;br&gt;
&lt;code&gt;vault kv metadata delete secret/mysql&lt;/code&gt; ,Hard Delete, Veriler silinir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Policy Olusturma&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;path "secret/data/mysql {
  capabilities = ["read", "list"]
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu policy ile kullanıcı sadece bu pathe erişim sağlayabilir ve &lt;br&gt;
Eğer mysql path'nin altında da secretlar var ise "secret/data/mysql/*" şeklinde tanımlama yapılabilir. Bu policy admin-policy.hcl dosyasına yazıp aşağıdaki komutla oluşturabiliriz.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;vault policy write mysql-policy admin-policy.hcl&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Oluşturulan policy ' yi aşağıdaki komutla bir token ile eşleştiririz. Bu komuttan sonra bize bir token verecektir not almayı unutmayalım.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;vault token create -policy=mysql-policy&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;vault write auth/userpass/users/ahmet \
    password="cok-gizli-sifre" \
    policies="admin-policy"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Kubernetes ExternalSecret olarak Vault Kullanımı&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Şimdi de yaygın olarak kullanılan kubernetes ve vaultu beraber kullanacağız. Burada kubernetes secretlarını vault üzerinden alacaktır.&lt;/p&gt;

&lt;p&gt;Öncelikle externalSecrets operatörünü kurmamız gerekiyor. ExternalSecret, hassas verilerinizi Kubernetes'in kendi iç Secret nesnesinde depolamak yerine, bunları harici bir sır yönetim sisteminde (Secret Store) saklamanıza olanak tanır ve bu harici sırları otomatik olarak Kubernetes Secret nesnelerine senkronize eder.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;helm repo add external-secrets https://charts.external-secrets.io
helm install external-secrets external-secrets/external-secrets --namespace external-secrets --create-namespace
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Şimdi aşağıdaki şekilde bir policy oluşturalım. Bu policy'nin aşağıdaki şekilde sadece read yetkisi olsun.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;path "secret/data/mysql {
  capabilities = ["read"]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bir token oluşturalım ve bu policy ile ilişkilendirelim&lt;/p&gt;

&lt;p&gt;&lt;code&gt;vault token create -policy=k8s-read&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Aşağdaki şekilde bir secret oluşturalım ve bir önceki komutta aldığımız tokenı yapıştıralım. Bu token bizim vaulta login olmamızı sağlayacak.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl create secret generic vault-token-secret \
    --from-literal=token=&amp;lt;TOKEN&amp;gt; \
    -n vault-ns
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aşağıdaki YAML ile bir SecretStore oluşturuyoruz. SecretStore bizim hangi sisteme bağlanacağımı ve hangi verilere ulaşacağımızı belirler.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cat &amp;lt;&amp;lt;EOF | kubectl apply -f -
apiVersion: external-secrets.io/v1
kind: SecretStore
metadata:
  name: vault-backend
  namespace: vault-ns
spec:
  provider:
    vault:
      server: "http://172.35.28.80:8200" # Vault IP Adresi
      path: "secret"  # Bu policy de belirttiğim secret engine ismidir.
      version: v2
      auth:
        tokenSecretRef:
          name: vault-token-secret #Bir önceki adımda oluşturulan secret 
          key: token              #Secret içindeki key adı
EOF

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aşağıdaki komutla kontrol ettiğimizde STATUS=Valid ise erişim sağlanmıştır.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;root@master:~/vault# kubectl get secretstore -n vault-ns
NAME            AGE   STATUS   CAPABILITIES   READY
vault-backend   35s   Valid    ReadWrite      True
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sıra artık bu secretları kullanmakta. Aşağıdaki YAML manifesti ile ExternalSecret oluşturuyoruz ve hangi değerleri kullanacaksak belirliyoruz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cat &amp;lt;&amp;lt;EOF | kubectl apply -f -
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata:
  name: mysql-secret-vault
  namespace: vault-ns
spec:
  refreshInterval: 1m
  secretStoreRef:
    name: vault-backend #SecretStore ismi
    kind: SecretStore
  target:
    name: mysql-secret # Kubernetes'te oluşacak secret adı
  data:
  - secretKey: MYSQL_ROOT_PASSWORD
    remoteRef:
      key: secret/data/mysql # Vault'taki tam yol
      property: mysql_root_pass  #Bu değerler vault üzerinde tanımlı olanlar
  - secretKey: MYSQL_USERNAME
    remoteRef:
      key: secret/data/mysql
      property: mysql_user
  - secretKey: MYSQL_PASSWORD
    remoteRef:
      key: secret/data/mysql 
      property: mysql_pass
  - secretKey: MYSQL_DATABASE
    remoteRef:
      key: secret/data/mysql
      property: mysql_db
EOF
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aşağıdaki komutlarla doğrulama işlemlerini yaptığımızda secretların oluştuğunu görüntüleyebiliriz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;root@master:~/vault# kubectl get externalsecret -n vault-ns
NAME                 STORETYPE     STORE           REFRESH INTERVAL   STATUS         READY
mysql-secret-vault   SecretStore   vault-backend   1m0s               SecretSynced   True
root@master:~/vault# kubectl get secret -n vault-ns
NAME                 TYPE     DATA   AGE
mysql-secret         Opaque   4      14s
vault-token-secret   Opaque   1      10m
root@master:~/vault# kubectl get secret mysql-secret -n vault-ns -oyaml
apiVersion: v1
data:
  MYSQL_DATABASE: c3VsZXltYW5EYXRhYmFzZQ==
  MYSQL_PASSWORD: YWhtZXQ=
  MYSQL_ROOT_PASSWORD: U3VsZXltYW4yMDI1ISE=
  MYSQL_USERNAME: c3VsZXltYW4=
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bir sonraki makalede görüşmek üzere iyi günler.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>AzureDevOps Pipeline</title>
      <dc:creator>Suleyman</dc:creator>
      <pubDate>Sat, 08 Nov 2025 15:24:49 +0000</pubDate>
      <link>https://dev.to/suleymanakturk/azure-devops-pipeline-1dd1</link>
      <guid>https://dev.to/suleymanakturk/azure-devops-pipeline-1dd1</guid>
      <description>&lt;p&gt;Merhaba , bu makalemizde önceki makalemizin devamı niteliğindedir. &lt;/p&gt;

&lt;p&gt;Bu makalede Azure DevOps üzerinde Pipeline kullanımına değineceğiz ve basit bir örnek gerçekleştireceğiz. Azure pipeline CI/CD (Continues Integration ve Continues Deployment) süreçlerimizi oluşturmamızı sağlayan Azure DevOps öğesidir. Hem agile hem de scrum metedolojilerini destekler. Alternatifleri Jenkins, Gitlab CI, Github Actions vb. uygulamaladır.&lt;/p&gt;

&lt;p&gt;Azure Pipeline CI/CD süreçlerini yapabilmek için agentlara ihtiyaç duyar. Jenkins'te slave, gitlab CI ' da ise runner mantığında çalışır. Bu agentlar hem microsoft tarafından sağlanabilirken istersek kendi sunucularımızda bu agentları kurabiliriz.&lt;/p&gt;

&lt;p&gt;Azure pipeline azure araçlarına entegre olduğu için oldukça kullanışlı ve işlerimizi kolaylaştırmaktadır.  Bununla birkaç dakika da uygulamalarımızı Azure üzerinde deploy edebilmemiz mümkündür. Aşağıdaki pipeline ile yapılabilecek bir örnek görebiliriz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiazv7msbbl56bdwyj99y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiazv7msbbl56bdwyj99y.png" alt=" " width="482" height="265"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bir pipeline oluşturduğumuzda , repository branch içerisinde "azure-pipelines.yml" isminde bir dosya oluşturulur ve pipeline içeriği bu dosyaya yazılır. Gitlab CI da bu mantıkla çalışmaktadır.&lt;/p&gt;

&lt;p&gt;Azure DevOps pipeline içerisinde kullanabileceğimiz hiyerarşi aşağıdaki gibidir.&lt;/p&gt;

&lt;p&gt;Stages &amp;gt; Stage &amp;gt;  Jobs &amp;gt; Job &amp;gt; Steps &lt;br&gt;
Stepslerin içerisinde de scriptler, tasklar kullanılır. Aşağıda bununla ilgili bir örneği görebiliriz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;trigger:
- main

pool:
  name: Self-Hosted Agent Pool


stages:
- stage: BirinciStage
  jobs:
  - job: BirinciStageBirinciJob
    steps:
    - script: echo "BirinciStageBirinciJob Steps Script"
      displayName: BirinciStageBirinciJob

  - job: BirinciStageIkinciJob
    steps:
    - script: echo "BirinciStageIkınciJob Steps Script"
      displayName: BirinciStageBirinciJob


- stage: IkinciStage
  jobs:
  - job: IkinciStageBirinciJob
    steps:
    - script: echo "IkinciStageBirinciJob Steps Script"
      displayName: IkinciStageBirinciJob

  - job: IkinciStageIkinciJob
    steps:
    - script: echo "IkinciStageIkinciJob Steps Script" 
      displayName: IkinciStageIkinciJob

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu pipeline çalıştırdığımızda aşağıdaki şekilde bir sonuç alacağız.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo4neix2o1sc5fot8b28l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo4neix2o1sc5fot8b28l.png" alt=" " width="325" height="677"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tabiki bu hiyerarşiyi kullanmadan da oluşturulan pipeline çalışır.  Örneğin; sadece steps adımını kullanılarakta pipeline yazılabilir. Bu kullanım tamamen yapınıza göre değişkenlik göstermektedir. Büyük yapılarda hiyerarşiye uymak pipeline nin okumasını kolaylaştıracaktır.&lt;br&gt;
Ya da hiyerarşiyi jobs kısmından da başlatarak yazabiliriz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;jobs:
- job: BirinciJob
  steps:
  - script: echo "BirincJob Steps Script"
    displayName: BirincJob


- job: IkinciJob
  steps:
  - script: echo "IkinciJob Steps Script"
    displayName: IkinciJob
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Şimdi bir Dockerfile üzerinden image oluşturup bunu DockerHub'a push eden bir pipeline yazalım ve bunu Azure Web Apps üzerinde deploy eden pipeline yazacağız.&lt;/p&gt;

&lt;p&gt;Öncelikle agent'ı kendi sunucuma kuracağım. &lt;br&gt;
Bu işlemlerden önce bir personel access token oluşturalım çünkü agentı konfigure ederken isteyecektir.&lt;/p&gt;

&lt;p&gt;Sağ üst köşede bulunan User Settings &amp;gt; Personel Access Token &amp;gt; New Token ile oluşturuyoz ve bir isim veriyoruz. Yetki olarakta Agents Pool &amp;gt; Read and Manage seçmemiz yeterlidir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwnwd2lqauchpwo9rdwxh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwnwd2lqauchpwo9rdwxh.png" alt=" " width="438" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpw8s6wdg82amgxm7n8xj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpw8s6wdg82amgxm7n8xj.png" alt=" " width="645" height="554"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vereceği tokenı bir yere not alınız.&lt;/p&gt;

&lt;p&gt;Agent kurulumuna geçebiliriz.&lt;/p&gt;

&lt;p&gt;Project Settings &amp;gt; Agent Pools &amp;gt; New Pool diyerek bir pool oluşturuyorum.  Bu pool birden fazla agentı barındırabilir.  Ayarları aşağıdaki şekilde yaptıktan sonra oluşturuyoruz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbywkscmezsmeg7cf1hfg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbywkscmezsmeg7cf1hfg.png" alt=" " width="485" height="884"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ardından oluşturduğumuz poola tıklayıp agent sekmesine geliyoruz ve "New Agent"'a tıklıyoruz. Burada microsoft bize agentın indirme linkini ve hangi işletim sisteminde nasıl kurulacağını açıklamış. Ben linux seçtim ve microsoftunda belirttiği aşağıdaki komutları çalıştırdım.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8512yklvm7w4jw401kmi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8512yklvm7w4jw401kmi.png" alt=" " width="789" height="790"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wget https://download.agent.dev.azure.com/agent/4.264.2/vsts-agent-linux-x64-4.264.2.tar.gz
tar xvfz vsts-agent-linux-x64-4.264.2.tar.gz
./config.sh 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;config.sh scriptini çalıştırdıktan sonra bizim hangi organizasyona ve oluşturduğumuz agent pool'un ismini ve bu agent için bir isim girmemiz gerekmektedir. &lt;/p&gt;

&lt;p&gt;Server URL: &lt;a href="https://dev.azure.com/organizasyon_ismi" rel="noopener noreferrer"&gt;https://dev.azure.com/organizasyon_ismi&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Enter (Y/N) Accept the Team Explorer Everywhere license agreement now? (press enter for N) &amp;gt; Y

&amp;gt;&amp;gt; Connect:

Enter server URL &amp;gt; https://dev.azure.com/akturkbilisim
Enter authentication type (press enter for PAT) &amp;gt; PAT
Enter personal access token &amp;gt; ************************************************************************************
Connecting to server ...

&amp;gt;&amp;gt; Register Agent:

Enter agent pool (press enter for default) &amp;gt; MySelfHostedAgent
Enter agent name (press enter for ceph-node) &amp;gt; pipeline-agent
Scanning for tool capabilities.
Connecting to the server.
Successfully added the agent
Testing agent connection.
Enter work folder (press enter for _work) &amp;gt;
2025-11-08 18:08:18Z: Settings Saved.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu işlemlerden sonra AzureDevOps üzerinde "Agent Pools &amp;gt; Agent" sekmesinden kontrol ettiğimizde durumun offline olduğunu görebiliriz. Bunun için&lt;/p&gt;

&lt;p&gt;./run.sh scriptini çalıştırıyoruz ama bu bize script ön planda çalışmaktadır yani terminal session kapandığında agent servisi duracaktır. İstersek bu agent servisini bir systemd servisine dönüştürebiliriz. Microsoft bunun içinde svc.sh isminde bir script oluşturmuş.&lt;/p&gt;

&lt;p&gt;./svc.sh install, ile systemd servisi haline gelecektir ve aşağıdaki komutla servisi başlatıyoruz. Bu işlemden sonra agent online durumua gelecektir.&lt;/p&gt;

&lt;p&gt;systemctl restart  vsts.agent.akturkbilisim.MySelfHostedAgent.pipeline\x2dagent.service&lt;/p&gt;

&lt;p&gt;Benim kodlarım Github üzerinde olduğu için Github hesabımı da entegre edeceğim. "Project Settings &amp;gt; Github Connection &amp;gt; New Connection" sekmesinden hesabımı bağlayacağım. Ben github hesabımıda "Personel Access Token" ile bağlayacağım için github üzerinde de oluşturmam ve yetkilendirmem gerekiyor. Bunu burada anlatmayacağım.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fceqoelnss8bqcmlvfoha.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fceqoelnss8bqcmlvfoha.png" alt=" " width="800" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Artık pipeline yazma aşamasına gelebiliriz.&lt;/p&gt;

&lt;p&gt;Pipeline sekmesinden New Pipeline diyerek oluşturuyoruz bize bu pipelinenin neresi ile entegre olacağını söylüyor ben Github ile ilerleyip repository'imi seçiyorum . &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnhfumxdb9znej6g2ivoc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnhfumxdb9znej6g2ivoc.png" alt=" " width="800" height="326"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ardından bize hazır olarak kullanabileceğimiz şablonlar sunuyor , ilk kez olacağı için "Stater Pipeline" seçebiliriz eğer pipeline dosyamız repositoryimizde var ise "Select an existing YAML file" seçeneğini seçebiliriz. Zaten bu templateleri daha sonradan da seçebiliriz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;trigger:
- main

pool:
  name: MySelfHostedAgent

variables:
 image: suleymanakturk/azurepipeline
 imageTag: $(build.buildID)

jobs:
- job: BuildImage
  steps:
  - task: Docker@2
    inputs:
      command: 'build'
      Dockerfile: '**/Dockerfile'
      repository: $(image)
      tags: |
        latest
        $(imageTag)
  displayName: Image Build 

- job:  PushImage
  steps:
  - task: Docker@2
    inputs:
      containerRegistry: 'DockerHubService'
      repository: $(image)
      command: 'push'
      tags: |
        latest
        $(imageTag)
  dependsOn: BuildImage
  displayName: Image Push Registry

- job: DeployAzureAppsServices
  steps:
  - task: AzureWebAppContainer@1
    inputs:
      azureSubscription: 'Azure subscription 1'
      appName:  azurePipelineWebApp
      containers: $(image):latest
  displayName: Deploy Web Apps
  dependsOn: PushImage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Trigger&lt;/strong&gt;: Pipeline nın ne ile tetikleneceğini belirtir. Burada main branche commit geldiğinde tetiklenecektir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pool&lt;/strong&gt;: Bu pipelinenin üzerinde çalışacağı agent pooldur. Biz oluşturduğumuz poolu verdik.&lt;/p&gt;

&lt;p&gt;Ben hem build hem de push için ayrı job oluşturdum istersek ikisini aynı job içerisinde de gerçekleştirebiliriz.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;containerRegistry&lt;/strong&gt;: Container registryi Project Settings &amp;gt; Service Connection &amp;gt; Docker Registry diyerek oluşturuyoruz ve pipeline içerisinde kullanıyoruz.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DisplayName&lt;/strong&gt;: Pipeline adımlarının istediğimiz gibi isimlendirmemizi sağlar. Aşağıdaki gibi görünecektir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbaqx1s5uzdswl3wxoapn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbaqx1s5uzdswl3wxoapn.png" alt=" " width="329" height="261"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;**WebApps **kısmı için öncelikle "Webapp for Container" oluşturmamız gerekiyor. Bir kere oluşturup her pipeline de image güncellenecektir. Bu yüzden manuel oluşturacağız.&lt;/p&gt;

&lt;p&gt;Azure GUI üzerinden "App Services" servisine tıklayıp create "Web App" dedikten sonra publish metodu container seçiyoruz ve container sekmesinden image aşağıdaki görselde göründüğü gibi yapıyoruz. Burada örnek olduğu için image public ama production da private ise size username/password soracaktır.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpo40m52uj5ufvoollpso.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpo40m52uj5ufvoollpso.png" alt=" " width="800" height="803"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F713uwvh0mbcvrkcxfcgv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F713uwvh0mbcvrkcxfcgv.png" alt=" " width="800" height="644"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Burada image tag'ini latest yaptık çünkü pipeline her çalıştığında yeni imageyi latest tag'i ile etiketleyecektir.&lt;/p&gt;

&lt;p&gt;Wepapp oluşturduğumuzda erişim sağlayabilmemiz için bir URL verecektir. Bu URL üzerinden erişim sağlayabiliriz. Bizim webapp paketimiz basic olduğu için kendimize ait domain ekleyemiyoruz. Ama daha üst paketlerde kişisel domain ve SSL sertifikamızı kullanabiliriz. Aşağıdaki gibi appname + rastgele bir değer + region şeklinde bir URL oluşmaktadır.&lt;/p&gt;

&lt;p&gt;azurepipelinewebapp-dpe0a7vxh9f1dub6.italynorth-01.azurewebsites.net&lt;/p&gt;

&lt;p&gt;Azure Pipeline ' nin en güzel yanlarından bir tanesi kullanmak istediğimiz ürün ile ilgili hazır şablonlar vermesi ve bizim bu alanları tamamladıktan sonra pipeline içerisine kendisinin eklemesidir. &lt;/p&gt;

&lt;p&gt;Örneğin; Bir uygulamayı kubernetes üzerine deploy etmek istediğimizde önceden hazırlanmış "Deploy to Kubernetes" templateyi kullanarak ve gerekli alanları doldurup Add dedikten sonra pipeline içerisine eklenecektir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjq46ouikqiznpp2s2uko.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjq46ouikqiznpp2s2uko.png" alt=" " width="800" height="403"&gt;&lt;/a&gt;&lt;br&gt;
 depl&lt;/p&gt;

&lt;p&gt;Bir sonraki makalede görüşmek üzere...&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>devops</category>
      <category>cicd</category>
      <category>azure</category>
    </item>
    <item>
      <title>Azure DevOps Nedir ?</title>
      <dc:creator>Suleyman</dc:creator>
      <pubDate>Sat, 08 Nov 2025 15:03:26 +0000</pubDate>
      <link>https://dev.to/suleymanakturk/azure-devops-nedir--2jjg</link>
      <guid>https://dev.to/suleymanakturk/azure-devops-nedir--2jjg</guid>
      <description>&lt;p&gt;Azure Devops Microsoft firmasının sağlamış olduğu ve DevOps süreçlerini yönetmemizi sağlayan bir hizmettir.  Azure DevOps, sürekli teslimatı etkinleştirmek için kaynak kontrolü, oluşturma, test etme ve yayınlama süreçlerini optimize eder.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnmnqbne8qk2msiw9yh9u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnmnqbne8qk2msiw9yh9u.png" alt=" " width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Azure DevOps kendi içerisinde aşağıdaki kaynakları barındırmaktadır.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Boards&lt;/strong&gt;: İş planlama ve takip sistemidir. Ekiplerin görevlerini oluşturma, planlama  ve raporlama işlemlerininin yapılmasını sağlar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repos&lt;/strong&gt;: Git veya Team Foundation Version Control (TFVC) tabanlı kaynak kod yönetim sistemidir. Kod depolarını ve versiyon kontrolünü sağlar. Alternatifleri Github , Gitlab, Bitbucket ' tır.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pipeline&lt;/strong&gt;: CI/CD (Continuous Integration / Continuous Delivery) süreçlerini yönetir. Kodun otomatik olarak derlenip test edilmesini ve hedef ortama dağıtılmasını sağlar.  Alternatifleri Jenkins, Gitlab CI, Github Actions vb. araçlardır.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test Plans&lt;/strong&gt;: Manuel ve otomatik testlerin planlanması, yürütülmesi ve raporlanması için kullanılır.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Azure Artifacts:&lt;/strong&gt;  Paketlerin depolanmasını ve paylaşılmasını sağlar. Dahili paket yönetimi yapabilirsin.&lt;/p&gt;

&lt;p&gt;Azure DevOps hem bulut üzerinde hem de on-prem sunucularınıza kurararak kullanmaya başlayabilirsiniz. Azure DevOps kullanırken önce bir organizasyon , organizasyon içerisine de bir veya birden fazla proje oluşturulabilmektedir. Bu projeler içerisinde de kullanıcılar veya takımlar bulunmaktadır. Her proje kendi Boards, Repos, Pipeline, Test Plan ve Artifacts ' sahiptir.&lt;/p&gt;

&lt;p&gt;Organization: AkturkBilisim&lt;br&gt;
├── Project: E-Ticaret Platformu&lt;br&gt;
│   ├── Team: Frontend Ekibi&lt;br&gt;
│   ├── Team: Backend Ekibi&lt;br&gt;
│   └── Team: QA Ekibi&lt;br&gt;
└── Project: Mobil Uygulama&lt;br&gt;
    ├── Team: iOS Ekibi&lt;br&gt;
    └── Team: Android Ekibi&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb9ez76qgrycjnsmswvgn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb9ez76qgrycjnsmswvgn.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AzureDevOps üzerinde kendi git repository ' i kullanabileceğimiz gibi Github, Bitbucket uygulamalarını da entegre ederek çalışabilmemiz mümkündür.&lt;/p&gt;

&lt;p&gt;Sonraki makalelerimizde Boards ve Pipeline konularına değineceğim. &lt;/p&gt;

&lt;p&gt;İyi günler.&lt;/p&gt;

</description>
      <category>azure</category>
      <category>beginners</category>
      <category>devops</category>
    </item>
    <item>
      <title>Prometheus ve Grafana İle NGINX Ingress Monitoring</title>
      <dc:creator>Suleyman</dc:creator>
      <pubDate>Sun, 31 Aug 2025 12:39:06 +0000</pubDate>
      <link>https://dev.to/suleymanakturk/prometheus-ve-grafana-ile-nginx-ingress-monitoring-10mn</link>
      <guid>https://dev.to/suleymanakturk/prometheus-ve-grafana-ile-nginx-ingress-monitoring-10mn</guid>
      <description>&lt;p&gt;Merhaba bu makalede kubernetes üzerinde yaygın olarak kullanılan prometheus stack ve nginx ingress controller üzerinde monitoring işleminin nasıl yapılacağını göreceğiz.&lt;/p&gt;

&lt;p&gt;Öncelikle aşağıdaki komutla prometheus-stack kurulumunu gerçekleştirelim.&lt;/p&gt;

</description>
      <category>monitoring</category>
      <category>kubernetes</category>
      <category>nginx</category>
      <category>devops</category>
    </item>
    <item>
      <title>Kubernetes Üzerinde RBAC ile Kullanıcı Olusturma ve Yetkilendirme</title>
      <dc:creator>Suleyman</dc:creator>
      <pubDate>Sat, 30 Aug 2025 17:47:36 +0000</pubDate>
      <link>https://dev.to/suleymanakturk/kubernetes-uzerinde-rbac-ile-kullanici-olusturma-ve-yetkilendirme-4jep</link>
      <guid>https://dev.to/suleymanakturk/kubernetes-uzerinde-rbac-ile-kullanici-olusturma-ve-yetkilendirme-4jep</guid>
      <description>&lt;p&gt;Kubernetes'te RBAC nedir?&lt;/p&gt;

&lt;p&gt;Rol Tabanlı Erişim Kontrolü (RBAC) in Kubernetes, kümenizdeki kaynaklara erişimi düzenlemek için kullanılan bir yöntemdir. RBAC, rolleri belirli izinlerle tanımlayarak ve bu rolleri kullanıcılara atayarak, kullanıcıların en az ayrıcalık ilkesine bağlı kalarak yalnızca ihtiyaç duydukları kaynaklara erişmelerini sağlar.&lt;/p&gt;

&lt;p&gt;RBAC için 3 önemli bileşeni vardır;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Subject&lt;/strong&gt;: Kullanıcılar, gruplar veya service accountları temsil eder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resource&lt;/strong&gt;: Üzerinde yetkilendirme yapılacak kubernetes api objelerini temsil eder. (Pods, services, configMap etc)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verbs&lt;/strong&gt;: Yapılacak işlemi temsil eder.&lt;/p&gt;

&lt;p&gt;Bu işlemler için aşağıdaki 2 kavramı birbirinden ayırmamız gerekmektedir.&lt;/p&gt;

&lt;p&gt;Authentication: Kubernetes clusterımız üzerinde kimlik doğrulama yapabilmeyi sağlar.&lt;br&gt;
Authorization: Kimlik doğrulama işlemi yapıldıktan sonra cluster üzerinde hangi işlemleri yapabileceğini belirler.&lt;/p&gt;

&lt;p&gt;Kubernetes üzerinde bir kullanıcı oluşturursak varsayılan olarak hiçbir işlem yapamaz. Kullanıcı oluşturduktan sonra RBAC ile yetkilendirme işlemlerini gerçekleştirmemiz gerekir.&lt;/p&gt;

&lt;p&gt;Kuberneteste kullanıcı oluşturma işlemini x509 SSL Sertifikası ile yapacağız.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kullanıcı Oluşturma İşlemleri&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mkdir RBAC &amp;amp;&amp;amp; cd RBAC&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Aşağıdaki komutla bir private key oluşturacağız.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;openssl genrsa -out suleymanakturk.key 2048  &lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Aşağıdaki komutla SSL sertifikamızı talep edebilmek için CSR dosyası oluşturacağız. Benim kullanıcım suleymanakturk isminde olacak. Organizasyon olarak Developer isminde bir organizasyon oluşturdum&lt;/p&gt;

&lt;p&gt;&lt;code&gt;openssl req -new -key suleymanakturk.key -out suleymanakturk.csr -subj /CN=suleymanakturk/O=Developer&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Bu işlemlerden sonra CSR dosyamızı kubernetes API ya göndermemiz gerekiyor. Aşağıdaki komutla CSR dosyamızı base64 formatına çevirip içeriğini alıyoruz.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cat suleymanakturk.csr | base64 | tr -d '\n'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Çıkan sonucu aşağıdaki bulunan request yerine yazıyoruz ve komutu çalıştırıyoruz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cat &amp;lt;&amp;lt;EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: suleymanakturk
spec:
  groups:
  - system:authenticated
  request:  "CSR"
  signerName: kubernetes.io/kube-apiserver-client
  usages:
  - client auth
EOF
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu işlemlerden sonra aşağıdaki komutla csr dosyamızın oluşup oluşmadığını ve durumunu görüntüleyeceğiz. &lt;/p&gt;

&lt;p&gt;Karşımıza çıkan sonuca baktığımızda en sağ tarafta CONDITION ile bu CSR dosyamızın durumunu görüntülüyoruz ve bu CSR dosyamızının kubernetes tarafından onaylanmadığı görülmektedir.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl get csr&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu1a0zvb5d8jht1npfkj9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu1a0zvb5d8jht1npfkj9.png" alt=" " width="800" height="44"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aşağıdaki komutla sertifikamızı onaylıyoruz ve artık durumunun "Pending" değil "Approved,Issued" olduğunu görebiliriz.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl certificate approve suleymanakturk&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Bu işlemlerden sonra sertifikamızı dışarıya alacağız&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl get csr suleymanakturk -o jsonpath='{.status.certificate}' | base64 --decode &amp;gt; suleymanakturk.crt&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Bu işlemlerden sonra kullanıcı oluşturma (Authentication) işlemleri tamamlanmıştır.&lt;/p&gt;

&lt;p&gt;Oluşturmuş olduğumuz crt ve key dosyası ile kubernetes clusterımızın ca dosyasını yeni kullanıcımıza vereceğiz. Kubernetes ca dosyası varsayılan olarak aşağıdaki konumda bulunmaktadır.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/etc/kubernetes/pki/ca.cert&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Yeni kullanıcımız bu dosyaları aldıktan sonra aşağıdaki komutla kubeconfig dosyası oluşturacaktır. Burada kullanıcının kubeconfig dosyası oluşturacağı sunucu üzerinde kubectl toolu ve kubernetes clusterına 6443 portu üzerinden erişmesi yeterlidir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl config set-credentials suleymanakturk \
  --client-certificate=suleymanakturk.crt \
  --client-key=suleymanakturk.key \
  --kubeconfig=suleymanakturk.kubeconfig

kubectl config set-cluster my-cluster \
  --server=https://172.35.28.10:6443 \
  --certificate-authority=/root/ca.crt \
  --embed-certs=true \
  --kubeconfig=suleymanakturk.kubeconfig

kubectl config set-context suleymanakturk@my-cluster \
  --cluster=my-cluster \
  --user=suleymanakturk \
  --kubeconfig=suleymanakturk.kubeconfig

kubectl config use-context suleymanakturk@my-cluster \
  --kubeconfig=suleymanakturk.kubeconfig
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kullanıcı aşağıdaki komutla , Kubernetes API ya istek attığında 403 hatası alacaktır çünkü herhangi bir authorization işlemi yapmadık.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl --kubeconfig=suleymanakturk.kubeconfig get pods&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Kubernetes Authorization işlemi aşağıdaki 4 obje ile yapılabilmektedir. &lt;/p&gt;

&lt;p&gt;Role, &lt;br&gt;
RoleBinding&lt;br&gt;
ClusterRole&lt;br&gt;
ClusterRoleBinding&lt;/p&gt;

&lt;p&gt;Role namespace bazlı erişim izni verirken, ClusterRole ise tüm cluster bazında verir. RoleBindg ve ClusterRoleBinding ise oluşturulan Role ve ClusterRole objelerinin istenilen user, group, serviceaccount vb. objelere atanmasını sağlamaktadır.&lt;/p&gt;

&lt;p&gt;Öncelikle bir Role ve RoleBinding oluşturalım. Bu role default namespacesinde verbs ile belirtilen işlemleri yapabilecektir. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ApiGroups&lt;/strong&gt;: Hangi kubernetes API ile iletişime geçebileceğini belirtir. Boş bırakılırsa v1 API geçerli olur. Örneğin; deployment objeleri apps/v1 API grubunda olduğu için resource kısmında yazılırsa bile çalışmayacaktır.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;: Hangi kubernetes objeleri üzerinde işlem yapılacağını belirtir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verbs&lt;/strong&gt;: Objeler üzerinde hangi işlemlerin yapılabileceğini belirtir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: developers-role
rules:
  - apiGroups: [""]
    resources: ["pods"]
    verbs: ["get", "list", "create"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;RoleBinding&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: my-role-binding
  namespace: default
subjects:
- kind: User
  name: suleymanakturk
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: developers-role
  apiGroup: rbac.authorization.k8s.io
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ClusterRole&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: v1
kind: ClusterRole
metadata:
  name: my-clusterrole
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "create"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ClusterRoleBinding&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: my-clusterrole-binding
subjects:
- kind: User
  name: suleymanakturk 
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: my-clusterrole
  apiGroup: rbac.authorization.k8s.io
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ClusterRole ile aşağıdaki komutla istediğimiz namespace tanımlanan yetkilerle işlem yapabiliriz.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl --kubeconfig=suleymanakturk.kubeconfig run testpod --image=nginx  -n test-ns&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Her komut çalıştırdığımızda --kubeconfig=suleymanakturk.kubeconfig şeklinde parametre eklemek istemiyorsak bu dosyayı varsayılan config yaparsak bu sorunu çözebiliriz.&lt;/p&gt;

&lt;p&gt;Aşağıdaki komutla kubeconfig dosyamızı varsayılan config dosyayı yapıyoruz.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cp /root/suleymanakturk.kubeconfig ~/.kube/config&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Bir sonraki makalede görüşmek üzere...&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>security</category>
      <category>devops</category>
    </item>
    <item>
      <title>Jenkins ve ArgoCD CI/CD Uygulaması</title>
      <dc:creator>Suleyman</dc:creator>
      <pubDate>Thu, 07 Aug 2025 21:55:31 +0000</pubDate>
      <link>https://dev.to/suleymanakturk/testte-4c4m</link>
      <guid>https://dev.to/suleymanakturk/testte-4c4m</guid>
      <description>&lt;p&gt;Merhaba,&lt;/p&gt;

&lt;p&gt;Bu makalede aşağıdaki adımları ve toolları kullanarak bir CI/CD projesi gerçekleştireceğiz. Dosyalara aşağıdaki Github adresimden ulaşabilirsiniz.&lt;/p&gt;

&lt;p&gt;Burada 2 tane git repository kullanacağım.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Repo: Developerın değişiklikleri push ettiği repository&lt;/li&gt;
&lt;li&gt;Repo: ArgoCD ile sync olacak repository.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Proje şu şekilde çalışacak. Developer commit yaptığında build edilen image kubernetes manifest file üzerinde değişecek ve bu manifest file yi 2. repoya pushlayacak ve ArgoCD güncel olan 2. repository ile sync olacaktır.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; 1- Kubernetes Üzerine Jenkins Kurulumu
 2. Ngrok ile webhook servisini dışarı açma
 3- Jenkins Konfigurasyonu ve Github ile Webhook Konfigurasyonu
 4. Jenkins Üzerinde Gerekli Credentials Bilgilerinin Tanımlanması
 5- Jenkins Pipeline Yazılacak. Pipeline üzerinde aşağıdaki adımlar gerçekleştirilecektir.
    a. Docker ile build et ve Docker Huba push et
    c. Kubernetes üzerinde çalıştır
 6- Projeyi Githuba Push Et
 7- ArgoCD ile Gitops


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gerekli Toollar&lt;br&gt;
 Docker &lt;br&gt;
 Kubernetes&lt;br&gt;
 Jenkins&lt;br&gt;
 Github &lt;br&gt;
 ArgoCD&lt;br&gt;
 Ngrok&lt;br&gt;
``&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Kubernetes Üzerinde Jenkins Kurulumu&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Jenkins in resmi sitesinden gerekli adımları izleyerek kurulum sağlayabilir ve arayüze erişim sağlayabiliriz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.jenkins.io/doc/book/installing/kubernetes/" rel="noopener noreferrer"&gt;https://www.jenkins.io/doc/book/installing/kubernetes/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kurulum adımından sonra aşağıdaki pluginleri yükleyelim.&lt;/p&gt;

&lt;p&gt;Github&lt;br&gt;
Github API&lt;br&gt;
Docker Plugin&lt;br&gt;
Docker Pipeline&lt;br&gt;
Kubernetes&lt;br&gt;
Kubernetes CLI Plugin&lt;br&gt;
Kubernetes Credentials&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Ngrook ile Jenkins Üzerinde Webhook Servisini Dışarıya Açma&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ngrok, localde çalışan uygulamaları tünelleyerek dış erişime açmamızı sağlayan bir reverse proxy'dir. Bunun aşağıdaki linkten ngrok kurulum dosyamızı indiriyoruz ve siteye kayıt oluyoruz. &lt;/p&gt;

&lt;p&gt;Sol taraftan "Your Authtoken" sekmesinden yeni bir token oluşturuyoruz.  Ardından bu jenkins arayüzüne erişebilen bir sunucudan bu servisi açacağız. Benim ortamında bir windows var ve ben bu sunucu üzerinden açacağım.&lt;/p&gt;

&lt;p&gt;İndirmiş olduğumuz exe dosyası çalıştırıp aşağıdaki komutları çalıştırıyoruz.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ngrok config add-authtoken $YOUR_AUTHTOKEN&lt;br&gt;
ngrok http http://172.35.28.152:8080&lt;/code&gt; ,&lt;br&gt;
Bu işlemden sonra karşımıza aşağıdaki şekilde bir ekran çıkması gerekmektedir. Burada 172.35.28.152 benim jenkinse eriştiğim URL ve porttur.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fih3h4dt2ml5ak0hrkuzd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fih3h4dt2ml5ak0hrkuzd.png" alt=" " width="800" height="256"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ngrok.com/downloads/windows" rel="noopener noreferrer"&gt;https://ngrok.com/downloads/windows&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Jenkins Konfigurasyonu ve Github ile Webhook Konfigurasyonu&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Webhook ile repositorye commit attığımızda pipelinenin otomotik olarak çalışmasını sağlayacağız. Bunun için 3. adımda jenkins sunucumuzun webhook servisini dış erişime açmamız gerekmektedir.  &lt;/p&gt;

&lt;p&gt;Şimdi developerın değişiklikleri push ettiği repositorye geliyorum ve yukarıdan setting gelip sol taraftan webhook sekmesine tıklıyorum.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiyvdgwpj4v50aslalhfd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiyvdgwpj4v50aslalhfd.png" alt=" " width="800" height="203"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu işlemlerden sonra ngrok ' un bize verdiği URL'i ve sonuna /github-webhook/ şeklinde URL'i tamamlıyoruz. Diğer ayarlamaları aşağıdaki gibi düzenledikten sonra buradan işimiz bitiyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi7k8inram55ztz0uchqo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi7k8inram55ztz0uchqo.png" alt=" " width="800" height="907"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Jenkins Üzerinde Gerekli Credentials Bilgilerinin Tanımlanması&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pipeline içerisinde kullacağımız aşağıdaki credentials bilgilerini tanımlayacağız.&lt;/p&gt;

&lt;p&gt;a. Docker HUB &lt;br&gt;
b. Repository'e push edebilmesi için Github Credentials&lt;br&gt;
c. Kubernetes config dosyasının credentials &lt;br&gt;
d. Docker yüklü node'nin credentials bilgileri&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;a. *Docker HUB Credentials Bilgilerinin Eklenmesi&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Docker HUB hesabımıza giriş yaptıktan sonra aşağıdaki linkten bir personel access token oluşturuyoruz ve read&amp;amp;write yetkisi veriyoruz. Güvenlik için expire date belirleyebiliriz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flrcbjsz4ejcq386guayx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flrcbjsz4ejcq386guayx.png" alt=" " width="800" height="232"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ardından Jenkins üzerinde Manage Jenkins &amp;gt; Credentials &amp;gt; System(global) &amp;gt; Global Credentials &amp;gt; Add Credentials ile credentials bilgilerimizi giriyoruz. Password yerine verilen tokenı girdikten sonra ID yerine pipeline üzerinde kullanacağımız ismi giriyoruz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcotunlzjfmjga5f1j32t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcotunlzjfmjga5f1j32t.png" alt=" " width="800" height="346"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;b. Repository'e push edebilmesi için Github Credentials&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Github üzerinde sağ üst tarafta bulunan profile tıkladıktan sonra Setting &amp;gt; Developer Settings &amp;gt; Personel Access Token &amp;gt; Fine-grained token &amp;gt; Create New Token ile yeni bir token oluşturuyoruz. Test ortamında tüm repositoryler ve yetkiler olabilir ama production ortamda sadece belirli repository ve minimum yetkiler ile tanımlamalıyız. &lt;/p&gt;

&lt;p&gt;Bu tokenı kopyalıyoruz ve DockerHUB credentials tanımı ile aynı şekilde tanımlıyoruz.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;c. Kubernetes config dosyasının credentials&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Kubernetes clusterımızın config dosyasını kaydediyoruz ve Jenkins &amp;gt; Credentials &amp;gt; System(global) &amp;gt; Global Credentials &amp;gt; Add Credentials sekmesinden bu sefer credentials tipini secret file olarak tanımlıyoruz ve kaydettiğimiz dosyayı import ediyoruz. Bu dosya genel olarak /root./kube/ altında config ismindedir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1hvw8ngenjxnw72wzhlq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1hvw8ngenjxnw72wzhlq.png" alt=" " width="502" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;d. Docker yüklü node'nin credentials bilgileri&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;a ve b adımında olduğu gibi "Username ve Password" tipinde docker sunucumuzun erişim bilgilerini tanımlıyoruz. Bu adımdan sonra Manage Jenkins &amp;gt; Nodes &amp;gt; New Node ardından isim ve Type değerini "Permanent Agent" seçip ilerliyoruz ve ben aşağıdaki gibi docker sunucumun bilgileri tanımlıyorum. Önemli olaran host ve tanımladığımız credentials bilgilerini doğru seçmemiz yeterlidir. Bu işlemden sonra node üzerine tıklayıp launch agent diyoruz. &lt;/p&gt;

&lt;p&gt;Düzeltme: Biz node ye kullanıcı adı ve parola ile bağlandığımız için "Host Key Verification Strategy" seçeneğini "Non Verifying Verification Strategy" yapacağız. Ama daha güvenli olması açısından key ile bağlantısı sağlanabilir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxr3pa5qe3uz0j1agxqw0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxr3pa5qe3uz0j1agxqw0.png" alt=" " width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Jenkins Üzerinde Pipeline Yazılması&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Jenkins anasayfasında sol taraftan New Item diyoruz ve isim verdikten sonra tipini pipeline seçiyoruz. Ardından commit attığımızda çalışabilmesi için aşağıdaki seçeneği seçiyoruz ve aşağıdaki pipeline yi yapıştıyoruz. Repo, credentials, node vb. bunları kendinize göre düzenleyebilirsiniz. Ben bu pipeline üzerinde kubernetese deploy etmesi için stage yazdım ama aslında o işi ArgoCD ye bırakmamız gerekmektedir. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbcbnqim5j6mwi8h2t7o2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbcbnqim5j6mwi8h2t7o2.png" alt=" " width="800" height="266"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;`&lt;br&gt;
pipeline {&lt;br&gt;
    agent {&lt;br&gt;
        label 'docker-nodes' &lt;br&gt;
    }&lt;br&gt;
    environment {&lt;br&gt;
        image_name="suleymanakturk:v${BUILD_NUMBER}"&lt;br&gt;
    }&lt;br&gt;
    stages {&lt;br&gt;
        stage('Checkout From Git') {&lt;br&gt;
            steps {&lt;br&gt;
                git branch: 'main', credentialsId: 'Github', url: 'https://github.com/suleymanakturk/Developer-Push-Repo.git'&lt;br&gt;
            }&lt;br&gt;
        }&lt;br&gt;
        stage('Build Docker Image') {&lt;br&gt;
            steps {&lt;br&gt;
                sh "docker build -t ${image_name} ."&lt;br&gt;
            }&lt;br&gt;
        }&lt;br&gt;
        stage('Push Image to DockerHub') {&lt;br&gt;
            steps {&lt;br&gt;
                script {&lt;br&gt;
                    withDockerRegistry(credentialsId: 'Dockerhub', toolName: 'docker') {&lt;br&gt;
                        sh "docker tag ${image_name} suleymanakturk/${image_name}"&lt;br&gt;
                        sh "docker push suleymanakturk/${image_name}"&lt;br&gt;
                    }&lt;br&gt;
                }&lt;br&gt;
            }&lt;br&gt;
        }&lt;br&gt;
        stage('Update Deployment File') {&lt;br&gt;
            steps {&lt;br&gt;
                sh """&lt;br&gt;
                    mv ./kubernetes_file/* .&lt;br&gt;
                    yq -i '.spec.template.spec.containers[0].image = "suleymanakturk/"+env(image_name)' deployment.yaml&lt;br&gt;
                    find . -mindepth 1 -path ./.git -prune -o ! -name '*.yaml' -exec rm -rf {} +&lt;br&gt;
                """&lt;br&gt;
            }&lt;br&gt;
        }&lt;br&gt;
        stage('Commit &amp;amp; Push Deployment YAML to Repo2') {&lt;br&gt;
            steps {&lt;br&gt;
                script {&lt;br&gt;
                    sh """&lt;br&gt;
                        git config --global user.email "akturksuleyman47@gmail.com"&lt;br&gt;
                        git config --global user.name "Suleyman AKTURK"&lt;br&gt;
                        git add .&lt;br&gt;
                        git diff --cached --quiet || git commit -m "Jenkins Pipeline Update Deployment File | image: ${image_name}"&lt;br&gt;
                    """&lt;br&gt;
                    withCredentials([usernamePassword(credentialsId: 'Github', usernameVariable: 'GIT_USERNAME', passwordVariable: 'GIT_PASSWORD')]) {&lt;br&gt;
                        sh "git push --force https://${GIT_USERNAME}:${GIT_PASSWORD}@github.com/suleymanakturk/ArgoCD-Repo.git main"&lt;br&gt;
                    }&lt;br&gt;
                }&lt;br&gt;
            }&lt;br&gt;
        }&lt;br&gt;
        stage('Deploy to Kubernetes Cluster') {&lt;br&gt;
            steps {&lt;br&gt;
                withKubeConfig(&lt;br&gt;
                    caCertificate: '', &lt;br&gt;
                    clusterName: '', &lt;br&gt;
                    contextName: '', &lt;br&gt;
                    credentialsId: 'kubernetes-credentals', &lt;br&gt;
                    namespace: '', &lt;br&gt;
                    restrictKubeConfigAccess: false, &lt;br&gt;
                    serverUrl: 'https://172.35.28.10:6443'&lt;br&gt;
                ) {&lt;br&gt;
                    sh "kubectl apply -f deployment.yaml"&lt;br&gt;
                }&lt;br&gt;
            }&lt;br&gt;
        }&lt;br&gt;
    }&lt;br&gt;
}&lt;br&gt;
`&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Githuba Push Edilmesi&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;index.html isimli bir dosyam var ve developer bunu repository e push ettiğinde tüm adımlar sırasıyla çalışacak. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ArgOCD ile Gitops&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Eğer repository public değilse öncelikle github bilgilerimizi argocd üzerinde tanımlamamız gerekmektedir. Ama public olduğunu varsayaraktan ilerliyorum, sonraki makalelerde argocd ile ilgili daha detaylı bilgi verebilirim.&lt;/p&gt;

&lt;p&gt;Eğer private ise Setting &amp;gt; Repository &amp;gt; üzerinden github bilgilerimizi tanımlıyoruz. &lt;/p&gt;

&lt;p&gt;Applications &amp;gt; New App ile yeni bir applications oluşturuyoruz , basit olarak aşağıdaki şekilde tanımlanabilir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ewsrjsdiqjf5c7mhovd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ewsrjsdiqjf5c7mhovd.png" alt=" " width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2cqwk69pcw1cib86kmgy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2cqwk69pcw1cib86kmgy.png" alt=" " width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ArgoCD ile Github Repomuz SYNC olduğunda aşağıdaki gibi bir görüntü karşımıza çıkacaktır.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fne57jdweb281earefk9v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fne57jdweb281earefk9v.png" alt=" " width="800" height="274"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tabi burada ArgoCD üzerinde application oluşturmayı manuel yaptık, istersek bu applications için bir kubernetes manifest dosyası yazıp pipeline üzerinde onu da deploy edebiliriz.&lt;/p&gt;

&lt;p&gt;Bir sonraki makalede görüşmek üzere, kendinize iyi bakın.&lt;/p&gt;

</description>
      <category>jenkins</category>
      <category>cicd</category>
      <category>webhooks</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Terraform Local Values and Output</title>
      <dc:creator>Suleyman</dc:creator>
      <pubDate>Tue, 27 May 2025 20:31:21 +0000</pubDate>
      <link>https://dev.to/suleymanakturk/terraform-local-values-and-output-261k</link>
      <guid>https://dev.to/suleymanakturk/terraform-local-values-and-output-261k</guid>
      <description>&lt;p&gt;Merhaba,&lt;/p&gt;

&lt;p&gt;Bu makalede terraform üzerinde local value ve output kullanımını ve ne işe yaradığını göreceğiz.&lt;/p&gt;

&lt;p&gt;Local value'ler bir terraform dosyası içerisindeki bir değerin birden fazla yerde kullanılması gerektiğinde tanımlanan ve kullanılmaktadır. &lt;/p&gt;

&lt;p&gt;Output ise oluşturmuş olduğumuz bir nesne hakkında bilgi almak istediğimizde kullanılmaktadır. Output diğer yazılım dillerinde ki ekrana yazdırma görevi görür. Python'daki printf, C# 'ta Console.WriteLine() gibi.&lt;/p&gt;

&lt;p&gt;Terraform dosyamızın içerisine aşağıdaki gibi 2 adet local değişkeni tanımlıyoruz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;locals {
   appName = "testapps"
   namespace = "testnamespace"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kubernetes üzerinde bir service ve bir pod oluşturacağım ve bunların isimlerini ve namespace lerini bu değişkenler üzerinden alacağım. Kullanım şekli "local.degiskenismi" kullanılmaktadır. Bu sayede sadece local değişkenlerinin değerini değiştirerek farklı bir isimde ve namespace üzerinde bu objeleri oluşturabilirim.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;locals {
   appName = "testapps"
   namespace = "testnamespace"
}
resource "kubernetes_service" "example" {
  metadata {
    name = "terraform-example"
    namespace = local.namespace

  }
  spec {
    selector = {
      app = local.appName
    }
    session_affinity = "ClientIP"
    port {
      port        = 8080
      target_port = 80
    }
    type = "LoadBalancer"
  }
}

resource "kubernetes_pod" "example" {
  metadata {
    name = "terraform-example"
    namespace = local.namespace
    labels = {
      app = local.appName
    }
  }

  spec {
    container {
      image = "nginx"
      name  = local.appName
    }
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Örneğin; farklı bir örnekte sunucunun oluşturulacağı lokasyonu local değişkenlerden alabiliriz. Bu sayede bu değişkenin değerini değiştirerek farklı bir lokasyonda oluşturabiliriz. Burada bir noktada kullanıldığı görülmekte fakat bunu belki 5-6 yerde kullanabiliriz. Böyle olunca bize kolaylık sağlamaktadır.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;locals {
  location = "australiaeast"
}

resource "azurerm_resource_group" "this" {
  name     = "rg-mom-spells"
  location = local.location
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aşağıdaki şekilde de bir kullanım sağlayabiliriz. Bir terraform resourcenin değerini farklı bir resource'den alabiliriz. Örneğin; aşağıdaki service nin selector değerini pod üzerinde tanımlanan label değerinden almışız. Bu kullanım da yaygın bir kullanımdır.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;resource "kubernetes_service" "example" {
  metadata {
    name = "terraform-example"
  }
  spec {
    selector = {
      app = kubernetes_pod.example.metadata.0.labels.app
    }
    session_affinity = "ClientIP"
    port {
      port        = 8080
      target_port = 80
    }

    type = "LoadBalancer"
  }
}

resource "kubernetes_pod" "example" {
  metadata {
    name = "terraform-example"
    labels = {
      app = "MyApp"
    }
  }

  spec {
    container {
      image = "nginx:1.21.6"
      name  = "test"
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Şimdi output'a bakalım. Örneğin; load balancer tipinde bir servis oluşturduk ve bu load balancerın değerini bu objeler oluştuktan sonra görmek istiyoruz. Kullanım şekli &lt;code&gt;"terraform_resource.resource_name.parametreler"&lt;/code&gt; şeklindedir. kubernetes_service ve example yukarıda ki örnekte oluşturduğumuz servis objesidir. Ondan sonra parametrelerde objeye göre değişmektedir.&lt;/p&gt;

&lt;p&gt;kubernetes_service.example.status[0].load_balancer[0].ingress[0].ip&lt;/p&gt;

&lt;p&gt;Output objesi aşağıdaki şekilde oluşturulmaktadır.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
output "LoadBalancer_IP" {
    value = "Bu servisin Load Balancer IP Adresi =  {kubernetes_service.example.status[0].load_balancer[0].ingress[0].ip}"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu şekilde kullanım bize aşağıdaki şekilde bir çıktı vermektedir. &lt;/p&gt;

&lt;p&gt;Bu servisin Load Balancer IP Adresi = 192.168.1.163&lt;/p&gt;

&lt;p&gt;Mesela istersek oluşturulan pod'un hangi node üzerinde oluştuğunuda bu output ile görebiliriz. Bu değerler terraform providerlara göre değişmektedir. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubernetes_pod.example.spec[0].node_name&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Daha fazla bilgi için terraformun resmi sitesinden ulaşabilirsiniz.&lt;/p&gt;

&lt;p&gt;Locals : &lt;a href="https://developer.hashicorp.com/terraform/language/values/locals" rel="noopener noreferrer"&gt;https://developer.hashicorp.com/terraform/language/values/locals&lt;/a&gt;&lt;br&gt;
Output : &lt;a href="https://developer.hashicorp.com/terraform/language/values/outputs" rel="noopener noreferrer"&gt;https://developer.hashicorp.com/terraform/language/values/outputs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Herkese iyi günler.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Terraform Variables</title>
      <dc:creator>Suleyman</dc:creator>
      <pubDate>Sun, 15 Dec 2024 14:42:18 +0000</pubDate>
      <link>https://dev.to/suleymanakturk/terraform-variables-2g5d</link>
      <guid>https://dev.to/suleymanakturk/terraform-variables-2g5d</guid>
      <description>&lt;p&gt;Merhaba,&lt;/p&gt;

&lt;p&gt;Bu makalede en yaygın Infrastructure as code (IaC) uygulamalarından olan terraform üzerinde değişkenkler (variables) kullanımını göreceğiz. Değişkenler yapılandırmalarınızı daha dinamik ve yeniden kullanılabilir hale getirmek için kullanabileceğiniz değerler için yer tutuculardır.&lt;/p&gt;

&lt;p&gt;Örneğin; aşağıdaki image'mizi manuel olarak vermişiz. Ama istersek bunu çalıştırdığımızda değişkenden alabiliriz. Bu sayede statik değilde dinamik olarak istenilen image'yi kullanabiliriz. Main.tf dosyamızın içine aşağıdaki resource yi yazıyoruz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;resource "kubernetes_pod" "firstpod" {
  metadata {
    name = "terraform-web"
  }

  spec {
    container {
      image = nginx
      name  = "web"
    }
   }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Şimdi variables.tf isminde bir dosya oluşturuyoruz ve içine aşağıdaki şekilde dolduruyoruz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;variable  "container_image" {
    type = string    

}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ardından ilk örnekte statik olan değeri aşağıdaki şekilde dinamik yapıyoruz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  spec {
    container {
      image = var.container_image
      name  = "web"
    }
   }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Terraform apply yaptığımızda bu sefer bize kullanacağımız image yi soracaktır.  Bu sayede daha dinamik bir yapı oluşturabiliriz. Bu değişkenlerin en basit kullanım örnektedir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo0p9irx1b4y0djpm0zfj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo0p9irx1b4y0djpm0zfj.png" alt="Image description" width="426" height="70"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Variables.tf içerisindeki değişkenin içerisine "default" parametresini ekleyerek, eğer biz farklı bir değişken kullanmayacaksak belirtilen değer ile çalıştıracaktır ama istenilirse farklı bir değer belirtilebilir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;variable  "container_image" {
    type = string    
    default = nginx
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aşağıdaki şekilde çalıştırdığımızda image olarak httpd yi kullanacaktır ama "terraform apply" şeklinde kullanırsak varsayılan nginx imagesini kullanacaktır.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;terraform apply -var=container_image=httpd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Basit kullanımı bu şekilde fakat birden fazla ortam ortaya çıkmaya başladığında daha yönetilebilir bir şekilde değişkenleri kullanmamız gerekiyor.  tfvars dosyaları ile bunu gerçekleştirebiliriz. variables.tf dosyasında içinde değişkenleri tanımlarken .tfvars dosyaları içerisinde de bu değişkenlerin tanımı gerçekleştiriyoruz.&lt;/p&gt;

&lt;p&gt;Örneğin; stage ve prod ortamlarınız var ve bu iki ortam için aynı değişkenler kullanılıyor fakat farklı tanımlar kullanabiliriz. Mesela bu ortamlarda ki podların CPU ve RAM limiti birbirinden farklı olabilir. Bu şekilde bir örnek vereceğiz.&lt;/p&gt;

&lt;p&gt;Öncelikle main.tf dosyamızın içerisine tanımlamalarımızı yapmamız gerekmektedir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  spec {
    container {
      image = var.container_image
      name  = "web"
      resources {
        limits = {
          cpu    = var.cpu_resource
          memory = var.ram_resource
       }
     }
   }
 }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ardından variables.tf dosyamızın içerisine tanımlamak istediğimiz değişkenleri yazıyoruz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;variable "cpu_resource" {
}

variable "ram_resource" {
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Şimdi stage.tfvars içerisine aşağıdaki değerleri yazıyoruz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cpu_resource = "0.3"
ram_resource = "250Mi"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;prod.tfvarsa içerisine de aşağıdaki değerleri yazıyoruz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cpu_resource = "0.75"
ram_resourece = "1024Mi"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu sayede tek bir farklı ortamlar için podlarımıza farklı resourcelar tanımladık. Stage için kullanmak istiyorsak aşağıdaki şekilde kullanmamız gerekmektedir. plan ve apply komutlarını çalıştırırken kullanılacak .tfvars dosyasını belirtmeliyiz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;terraform plan -var-file=stage.tfvars
terraform apply -var-file=stage.tfvars
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Basit olarak variables.tf ve .tfvars dosyalarının kullanımı bu şekildeydi. Bir sonraki makalede terraform output kullanımına değineceğiz. &lt;/p&gt;

&lt;p&gt;Herkese iyi günler.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Ansible Nedir ? Kurulum İşlemleri</title>
      <dc:creator>Suleyman</dc:creator>
      <pubDate>Wed, 20 Mar 2024 19:58:54 +0000</pubDate>
      <link>https://dev.to/suleymanakturk/ansible-nedir-kurulum-islemleri-4ckl</link>
      <guid>https://dev.to/suleymanakturk/ansible-nedir-kurulum-islemleri-4ckl</guid>
      <description>&lt;p&gt;Merhaba, bu makalede sektörde yaygın olarak kullanılan Ansible uygulamasına değineceğiz.&lt;/p&gt;

&lt;p&gt;Ansible temel olarak tek noktadan sunucuları yönetmenizi sağlayan bir otomasyon aracıdır. Redhat tarafından piyasa sürülmüş olup ve geliştirilmektedir.&lt;/p&gt;

&lt;p&gt;Ansible control-node bulunmakta ve diğer sunucular ve network cihazları bu node üzerinden yönetilmektedir. Ansible agent dediğimiz işlem yapacağımız cihazlara SSH bağlantısı üzerinden işlemleri gerçekleştirmektedir. Şimdi deAnsible'nin temel bilenlerini inceleyelim.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inventory&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;İsminden de anlaşılacağı üzere yönetmek istediğimiz sistemlerin içeren dosyadır. Aşağıdaki örnek bir inventory dosyasını görüntüleyebilirsiniz. Sizler yapınıza göre bunları daha karmaşık hale getirebilirsiniz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Webserver]
192.168.1.131
192.168.1.132

[Database]
192.168.1.133

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Playbooks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Uzak bilgisayarda hangi görevlerin yerine getirileciğini söyleyen dosyadır. YAML formatı şeklinde yazılmaktadır.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
`---
- name: Apache Kurulum Playbook
  hosts: Webserver

  tasks:
  - name: Apache Kurulumu 
    yum:   
      name=httpd  
      state=latest

 - name: Apache Servis Restart
    service:   
      name=httpd  
      state=started
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Modul:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Modules, belirli görevleri gerçekleştirmek için kullanılan Ansible’ın bireysel bileşenleridir. Örneğin; yukarıda yum modulu ile httpd servisini kurduk, service modulu ile servisi restart ettik.&lt;/p&gt;

&lt;p&gt;Şimdi master node üzerinden agentlara SSH-key ile bağlantısı gerçekleştirip bağlantının gerçekleştirilmediğini görelim.&lt;/p&gt;

&lt;p&gt;Master node üzerinde&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh-keygen -t rsa
ssh-copy-id suleyman@192.168.1.131
ssh-copy-id suleyman@192.168.1.132
ssh-copy-id suleyman@192.168.1.133

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnxu2q1k81tspm5kj363v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnxu2q1k81tspm5kj363v.png" alt="Image description" width="800" height="226"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Şimdi bunu tüm agentlara yaptıktan sonra aşağıdaki komutla erişimi test edebiliriz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; ansible all -m ping -u suleyman
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aşağıdaki gibi bir çıktı ile karşılaştıysanız işlemler başarılı demektedir. Sonraki makalelerde görüşmek üzere...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmgkiun84i4r82ilyhc36.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmgkiun84i4r82ilyhc36.png" alt="Image description" width="717" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Kubernetes Nginx Ingress Controller Kurulumu</title>
      <dc:creator>Suleyman</dc:creator>
      <pubDate>Wed, 07 Feb 2024 19:59:06 +0000</pubDate>
      <link>https://dev.to/suleymanakturk/kubernetes-nginx-ingress-controller-kurulumu-c8o</link>
      <guid>https://dev.to/suleymanakturk/kubernetes-nginx-ingress-controller-kurulumu-c8o</guid>
      <description>&lt;p&gt;Merhaba, bu makalemizde kubernetes yaygın olarak kullanılan nginx ingress controller kurulumunu gerçekleştireceğiz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5hw7jbw3lj5kowepfosh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5hw7jbw3lj5kowepfosh.png" alt="Image description" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Normal şartlarda sizler her bulut sağlayıcısında (AWS,Azure,GCP) LoadBalancer türünde bir servis açtığınızda bir Public IP adresi alır. Servislerinizde çoğaldığında maddi açıdan problem olmaya başlar. Ingress tam olarak bu servislerin önünde durarak domain ve path'lere göre yönlendirme yapmaktadır. Siz artık tüm alan adlarını ingress'in sahip olduğu bir tek Public IP adresine yönlendirirsiniz.&lt;/p&gt;

&lt;p&gt;Nginx ingress controller helm ile deploy edeceğiz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl create namespace nginx-ingress
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm install my-ingress-nginx ingress-nginx/ingress-nginx --namespace nginx-ingress
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
  </channel>
</rss>
