{"id":32578,"date":"2025-10-23T12:41:10","date_gmt":"2025-10-23T09:41:10","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=32578"},"modified":"2025-10-23T12:41:10","modified_gmt":"2025-10-23T09:41:10","slug":"mikroservislerin-ubuntu-uzerinde-nomad-ile-dagitimi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/mikroservislerin-ubuntu-uzerinde-nomad-ile-dagitimi\/","title":{"rendered":"Mikroservislerin Ubuntu \u00dczerinde Nomad ile Da\u011f\u0131t\u0131m\u0131"},"content":{"rendered":"<p><body><\/p>\n<h2>Mikroservislerin Ubuntu \u00dczerinde Nomad ile Da\u011f\u0131t\u0131m\u0131<\/h2>\n<p>Mikroservis mimarisi, modern yaz\u0131l\u0131m geli\u015ftirmede esneklik, \u00f6l\u00e7eklenebilirlik ve ba\u011f\u0131ms\u0131zl\u0131k sa\u011flayan pop\u00fcler bir yakla\u015f\u0131md\u0131r. Ancak, bu avantajlar\u0131n yan\u0131 s\u0131ra, mikroservislerin da\u011f\u0131t\u0131m\u0131 ve y\u00f6netimi karma\u015f\u0131k operasyonel zorluklar\u0131 da beraberinde getirir. Bu makalede, HashiCorp Nomad&#8217;\u0131n Ubuntu i\u015fletim sistemi \u00fczerinde mikroservisleri da\u011f\u0131tmak ve y\u00f6netmek i\u00e7in nas\u0131l kullan\u0131labilece\u011fini detayl\u0131 bir \u015fekilde inceleyece\u011fiz. Nomad&#8217;\u0131n hafif yap\u0131s\u0131, esnekli\u011fi ve g\u00fc\u00e7l\u00fc \u00f6zellikleri, onu bu t\u00fcr g\u00f6revler i\u00e7in ideal bir orkestrasyon arac\u0131 haline getirmektedir.<\/p>\n<h3>Mikroservis Mimarisi ve Da\u011f\u0131t\u0131m Zorluklar\u0131<\/h3>\n<p>Mikroservis mimarisi, b\u00fcy\u00fck bir uygulamay\u0131, ba\u011f\u0131ms\u0131z olarak geli\u015ftirilebilen, da\u011f\u0131t\u0131labilen ve \u00f6l\u00e7eklenebilen k\u00fc\u00e7\u00fck, gev\u015fek ba\u011fl\u0131 servisler k\u00fcmesi olarak yap\u0131land\u0131rma y\u00f6ntemidir. Geleneksel monolitik mimariye k\u0131yasla bir\u00e7ok avantaj sunar:<\/p>\n<p>*   <strong>\u00d6l\u00e7eklenebilirlik:<\/strong> Servisler ba\u011f\u0131ms\u0131z olarak \u00f6l\u00e7eklenebilir, bu da kaynaklar\u0131n daha verimli kullan\u0131lmas\u0131n\u0131 sa\u011flar.<br \/>\n*   <strong>Esneklik:<\/strong> Her servis farkl\u0131 bir teknoloji y\u0131\u011f\u0131n\u0131 (programlama dili, veritaban\u0131) kullanabilir.<br \/>\n*   <strong>Hata \u0130zolasyonu:<\/strong> Bir servisteki hata, di\u011fer servisleri do\u011frudan etkilemez.<br \/>\n*   <strong>Ba\u011f\u0131ms\u0131z Geli\u015ftirme ve Da\u011f\u0131t\u0131m:<\/strong> Geli\u015ftirme ekipleri kendi servisleri \u00fczerinde ba\u011f\u0131ms\u0131z \u00e7al\u0131\u015fabilir ve bunlar\u0131 ba\u011f\u0131ms\u0131z olarak da\u011f\u0131tabilir.<\/p>\n<p>Ancak, bu avantajlar beraberinde operasyonel zorluklar\u0131 da getirir:<\/p>\n<p>*   <strong>Da\u011f\u0131t\u0131m Karma\u015f\u0131kl\u0131\u011f\u0131:<\/strong> \u00c7ok say\u0131da k\u00fc\u00e7\u00fck servisi y\u00f6netmek, g\u00fcncellemeleri koordine etmek ve ba\u011f\u0131ml\u0131l\u0131klar\u0131 \u00e7\u00f6zmek zordur.<br \/>\n*   <strong>Servis Ke\u015ffi:<\/strong> Servislerin birbirini bulmas\u0131 ve ileti\u015fim kurmas\u0131 i\u00e7in bir mekanizma gereklidir.<br \/>\n*   <strong>Y\u00fck Dengeleme:<\/strong> Gelen isteklerin servis \u00f6rnekleri aras\u0131nda dengeli bir \u015fekilde da\u011f\u0131t\u0131lmas\u0131 \u00f6nemlidir.<br \/>\n*   <strong>Sa\u011fl\u0131k Kontrolleri:<\/strong> Servislerin sa\u011fl\u0131kl\u0131 olup olmad\u0131\u011f\u0131n\u0131 s\u00fcrekli izlemek ve ar\u0131zal\u0131 olanlar\u0131 yeniden ba\u015flatmak gerekir.<br \/>\n*   <strong>Kaynak Y\u00f6netimi:<\/strong> Her servisin CPU, bellek gibi kaynak ihtiya\u00e7lar\u0131n\u0131 belirlemek ve tahsis etmek.<br \/>\n*   <strong>\u0130zleme ve Loglama:<\/strong> Da\u011f\u0131t\u0131k sistemlerde sorun giderme ve performans takibi i\u00e7in merkezi izleme ve loglama sistemleri gereklidir.<\/p>\n<p>Bu zorluklar\u0131n \u00fcstesinden gelmek i\u00e7in konteynerizasyon (\u00f6rne\u011fin Docker) ve orkestrasyon ara\u00e7lar\u0131 (\u00f6rne\u011fin Nomad, Kubernetes) vazge\u00e7ilmez hale gelmi\u015ftir.<\/p>\n<h3>Nomad&#8217;\u0131n Sahneye \u00c7\u0131k\u0131\u015f\u0131: Basit, Esnek ve G\u00fc\u00e7l\u00fc Orkestrasyon<\/h3>\n<p>HashiCorp Nomad, veri merkezlerinde ve bulut ortamlar\u0131nda her t\u00fcrl\u00fc uygulamay\u0131 (konteynerler, sanal makineler, ba\u011f\u0131ms\u0131z ikililer) da\u011f\u0131tmak ve y\u00f6netmek i\u00e7in tasarlanm\u0131\u015f, kullan\u0131m\u0131 kolay ve esnek bir i\u015f y\u00fck\u00fc orkestrat\u00f6r\u00fcd\u00fcr. Kubernetes gibi daha kapsaml\u0131 \u00e7\u00f6z\u00fcmlerin sundu\u011fu karma\u015f\u0131kl\u0131\u011f\u0131 istemeyen veya daha hafif bir alternatif arayan ekipler i\u00e7in idealdir.<\/p>\n<p>Nomad&#8217;\u0131n temel \u00f6zellikleri \u015funlard\u0131r:<\/p>\n<p>*   <strong>Basitlik:<\/strong> Tek bir ikili dosya olarak da\u011f\u0131t\u0131l\u0131r ve kurulumu kolayd\u0131r. Yap\u0131land\u0131rma dili (HCL) okunmas\u0131 ve yaz\u0131lmas\u0131 kolayd\u0131r.<br \/>\n*   <strong>Esneklik:<\/strong> Docker konteynerleri, Java uygulamalar\u0131, Go ikilileri, sanal makineler ve hatta Batch i\u015fleri gibi \u00e7e\u015fitli i\u015f y\u00fcklerini destekler.<br \/>\n*   <strong>Performans:<\/strong> Y\u00fcksek performansl\u0131 ve \u00f6l\u00e7eklenebilir bir mimariye sahiptir, binlerce node ve milyonlarca i\u015fi y\u00f6netebilir.<br \/>\n*   <strong>\u00c7oklu Veri Merkezi Deste\u011fi:<\/strong> Birden fazla co\u011frafi konumdaki veri merkezlerinde i\u015f y\u00fcklerini da\u011f\u0131tabilir.<br \/>\n*   <strong>HashiCorp Ekosistemi ile Entegrasyon:<\/strong> Consul (servis ke\u015ffi), Vault (s\u0131rlar y\u00f6netimi) ve Terraform (altyap\u0131y\u0131 kod olarak y\u00f6netme) gibi di\u011fer HashiCorp \u00fcr\u00fcnleriyle sorunsuz entegrasyon sa\u011flar.<\/p>\n<p>Nomad, \u00f6zellikle hafif bir orkestrasyon katman\u0131na ihtiya\u00e7 duyan, mevcut altyap\u0131s\u0131yla daha iyi entegre olmak isteyen veya Kubernetes&#8217;in getirdi\u011fi karma\u015f\u0131k API ve bile\u015fen y\u0131\u011f\u0131n\u0131ndan ka\u00e7\u0131nmak isteyen kurulu\u015flar i\u00e7in cazip bir se\u00e7enektir.<\/p>\n<h3>Neden Ubuntu?<\/h3>\n<p>Ubuntu, sunucu ortamlar\u0131nda en pop\u00fcler Linux da\u011f\u0131t\u0131mlar\u0131ndan biridir. Geni\u015f topluluk deste\u011fi, g\u00fcncel yaz\u0131l\u0131m paketleri, uzun s\u00fcreli destek (LTS) s\u00fcr\u00fcmleri ve g\u00fc\u00e7l\u00fc g\u00fcvenlik \u00f6zellikleriyle \u00f6ne \u00e7\u0131kar. Nomad ve Docker gibi modern ara\u00e7lar i\u00e7in m\u00fckemmel bir temel sa\u011flar. \u00c7o\u011fu bulut sa\u011flay\u0131c\u0131s\u0131 ve sanalla\u015ft\u0131rma platformu taraf\u0131ndan desteklenmesi, onu da\u011f\u0131t\u0131m i\u00e7in g\u00fcvenilir bir se\u00e7im haline getirir. Bu makalede, Ubuntu 20.04 LTS veya daha yeni bir s\u00fcr\u00fcm\u00fcn\u00fc kulland\u0131\u011f\u0131m\u0131z\u0131 varsayaca\u011f\u0131z.<\/p>\n<h3>Nomad Mimarisi<\/h3>\n<p>Nomad, bir sunucu ve istemci modelini kullan\u0131r:<\/p>\n<p>*   <strong>Nomad Sunucular\u0131 (Servers):<\/strong> K\u00fcmenin beynidir. \u0130\u015fleri kabul eder, planlar ve istemcilere da\u011f\u0131t\u0131r. Sunucular, Raft konsens\u00fcs algoritmas\u0131n\u0131 kullanarak birbirleriyle ileti\u015fim kurar ve k\u00fcmenin durumunu tutarl\u0131 bir \u015fekilde korur. Genellikle 3 veya 5 sunucu ile y\u00fcksek eri\u015filebilirlik sa\u011flan\u0131r.<br \/>\n*   <strong>Nomad \u0130stemcileri (Clients):<\/strong> Sunuculardan i\u015fleri al\u0131r ve yerel olarak \u00e7al\u0131\u015ft\u0131r\u0131r. Her istemci, \u00fczerinde \u00e7al\u0131\u015fan g\u00f6revlerin (task) ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc y\u00f6neten bir &#8220;i\u015fleyici&#8221; (executor) i\u00e7erir. Docker, Java, QEMU gibi \u00e7e\u015fitli s\u00fcr\u00fcc\u00fcleri destekler.<\/p>\n<p>Bir i\u015f (job), Nomad&#8217;da da\u011f\u0131t\u0131lacak en \u00fcst d\u00fczey birimdir. \u0130\u015fler, bir veya daha fazla g\u00f6rev grubundan (group) olu\u015fur. Her g\u00f6rev grubu, bir veya daha fazla g\u00f6revi (task) tan\u0131mlar. G\u00f6revler, asl\u0131nda \u00e7al\u0131\u015ft\u0131r\u0131lacak olan tekil birimlerdir (\u00f6rne\u011fin, bir Docker konteyneri).<\/p>\n<h3>\u00d6n Ko\u015fullar ve Ortam Kurulumu<\/h3>\n<p>Nomad ile mikroservisleri da\u011f\u0131tmaya ba\u015flamadan \u00f6nce, Ubuntu sunucular\u0131m\u0131zda baz\u0131 \u00f6n ko\u015fullar\u0131n yerine getirilmesi gerekir.<\/p>\n<h4>Docker Kurulumu<\/h4>\n<p>Nomad, konteynerize edilmi\u015f uygulamalar\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in Docker&#8217;\u0131 bir s\u00fcr\u00fcc\u00fc olarak kullanabilir. Docker&#8217;\u0131 Ubuntu&#8217;ya kurmak i\u00e7in a\u015fa\u011f\u0131daki ad\u0131mlar\u0131 izleyin:<\/p>\n<pre><code class=\"language-bash\">sudo apt update\nsudo apt install apt-transport-https ca-certificates curl gnupg lsb-release -y\ncurl -fsSL https:\/\/download.docker.com\/linux\/ubuntu\/gpg | sudo gpg --dearmor -o \/usr\/share\/keyrings\/docker-archive-keyring.gpg\necho \"deb [arch=$(dpkg --print-architecture) signed-by=\/usr\/share\/keyrings\/docker-archive-keyring.gpg] https:\/\/download.docker.com\/linux\/ubuntu $(lsb_release -cs) stable\" | sudo tee \/etc\/apt\/sources.list.d\/docker.list > \/dev\/null\nsudo apt update\nsudo apt install docker-ce docker-ce-cli containerd.io -y\nsudo usermod -aG docker $USER # Mevcut kullan\u0131c\u0131y\u0131 docker grubuna ekle\nnewgrp docker # Grubun hemen aktif olmas\u0131 i\u00e7in (veya yeniden oturum a\u00e7\u0131n)<\/code><\/pre>\n<p>Docker&#8217;\u0131n do\u011fru \u015fekilde kuruldu\u011funu do\u011frulamak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">docker run hello-world<\/code><\/pre>\n<h4>Nomad Kurulumu<\/h4>\n<p>Nomad&#8217;\u0131 HashiCorp&#8217;un resmi web sitesinden indirebilirsiniz.<\/p>\n<pre><code class=\"language-bash\"># Nomad'\u0131 indirme (en son s\u00fcr\u00fcm\u00fc kontrol edin)\nNOMAD_VERSION=\"1.7.3\" # En son s\u00fcr\u00fcm\u00fc kontrol edin: https:\/\/developer.hashicorp.com\/nomad\/downloads\nwget https:\/\/releases.hashicorp.com\/nomad\/${NOMAD_VERSION}\/nomad_${NOMAD_VERSION}_linux_amd64.zip\n\n<h2>\u0130ndirilen dosyay\u0131 a\u00e7ma<\/h2>\nsudo apt install unzip -y\nunzip nomad_${NOMAD_VERSION}_linux_amd64.zip\n\n<h2>Nomad ikili dosyas\u0131n\u0131 PATH'e ekleme<\/h2>\nsudo mv nomad \/usr\/local\/bin\/\n\n<h2>Versiyonu do\u011frulama<\/h2>\nnomad version<\/code><\/pre>\n<h4>Systemd Servisleri ile Nomad Yap\u0131land\u0131rmas\u0131<\/h4>\n<p>Nomad&#8217;\u0131 bir systemd servisi olarak \u00e7al\u0131\u015ft\u0131rmak, otomatik ba\u015flatma ve kolay y\u00f6netim sa\u011flar. Hem sunucu hem de istemci i\u00e7in ayr\u0131 yap\u0131land\u0131rma dosyalar\u0131 olu\u015fturaca\u011f\u0131z. Bu kurulumda, basitlik ad\u0131na tek bir makinede hem sunucu hem de istemci rol\u00fcn\u00fc \u00fcstlenen bir Nomad \u00f6rne\u011fi kuraca\u011f\u0131z. \u00dcretim ortamlar\u0131nda sunucu ve istemcilerin ayr\u0131 makinelerde olmas\u0131 tavsiye edilir.<\/p>\n<h5>Nomad Sunucu Yap\u0131land\u0131rmas\u0131<\/h5>\n<p>Bir dizin olu\u015fturun ve yap\u0131land\u0131rma dosyas\u0131n\u0131 olu\u015fturun:<\/p>\n<pre><code class=\"language-bash\">sudo mkdir -p \/etc\/nomad.d\nsudo chmod 700 \/etc\/nomad.d\nsudo touch \/etc\/nomad.d\/nomad.hcl<\/code><\/pre>\n<p><code>\/etc\/nomad.d\/nomad.hcl<\/code> i\u00e7eri\u011fi (sunucu ve istemci rol\u00fcn\u00fc bir arada tutan basit bir yap\u0131land\u0131rma):<\/p>\n<pre><code class=\"language-hcl\">data_dir  = \"\/opt\/nomad\/data\"\n\nbind_addr = \"0.0.0.0\" # T\u00fcm a\u011f aray\u00fczlerinden eri\u015fime izin ver\n\n<h2>Sunucu yap\u0131land\u0131rmas\u0131<\/h2>\nserver {\n  enabled          = true\n  bootstrap_expect = 1 # Tek sunuculu bir k\u00fcme i\u00e7in 1\n}\n\n<h2>\u0130stemci yap\u0131land\u0131rmas\u0131<\/h2>\nclient {\n  enabled       = true\n  node_class    = \"default\"\n  servers = [\"127.0.0.1:4647\"] # Sunucunun kendi IP'si ve portu\n  options {\n    \"driver.docker.enabled\" = true # Docker s\u00fcr\u00fcc\u00fcs\u00fcn\u00fc etkinle\u015ftir\n  }\n}\n\n<h2>Consul entegrasyonu (iste\u011fe ba\u011fl\u0131, ama \u00f6nerilir)<\/h2>\n<h2>consul {<\/h2>\n<h2>address = \"127.0.0.1:8500\"<\/h2>\n<h2>}<\/code><\/pre>\n<\/h2>\n<p>Nomad veri dizinini olu\u015fturun:<\/p>\n<pre><code class=\"language-bash\">sudo mkdir -p \/opt\/nomad\/data<\/code><\/pre>\n<p>Systemd servis dosyas\u0131 (<code>\/etc\/systemd\/system\/nomad.service<\/code>):<\/p>\n<pre><code class=\"language-ini\">[Unit]\nDescription=Nomad\nDocumentation=https:\/\/www.nomadproject.io\/docs\/\nWants=network-online.target\nAfter=network-online.target\n\n[Service]\nExecStart=\/usr\/local\/bin\/nomad agent -config=\/etc\/nomad.d\/nomad.hcl\nExecReload=\/bin\/kill -HUP $MAINPID\nLimitNOFILE=65536\nRestart=on-failure\nRestartSec=2\n\n[Install]\nWantedBy=multi-user.target<\/code><\/pre>\n<p>Servisi ba\u015flat\u0131n ve etkinle\u015ftirin:<\/p>\n<pre><code class=\"language-bash\">sudo systemctl enable nomad\nsudo systemctl start nomad\nsudo systemctl status nomad<\/code><\/pre>\n<p>Nomad&#8217;\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011frulay\u0131n:<\/p>\n<pre><code class=\"language-bash\">nomad status\nnomad node status<\/code><\/pre>\n<p>Her iki komut da \u00e7\u0131kt\u0131da sunucu ve istemcinin sa\u011fl\u0131kl\u0131 oldu\u011funu g\u00f6stermelidir.<\/p>\n<h3>Basit Bir Mikroservis \u00d6rne\u011fi Olu\u015fturma<\/h3>\n<p>\u015eimdi, Nomad ile da\u011f\u0131taca\u011f\u0131m\u0131z basit bir Go tabanl\u0131 &#8220;Hello Nomad&#8221; mikroservisi olu\u015ftural\u0131m.<\/p>\n<h4>Go Uygulamas\u0131 (<code>main.go<\/code>)<\/h4>\n<pre><code class=\"language-go\">package main\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"net\/http\"\n\t\"os\"\n)\n\nfunc main() {\n\tport := os.Getenv(\"PORT\")\n\tif port == \"\" {\n\t\tport = \"8080\" \/\/ Varsay\u0131lan port\n\t}\n\n\thttp.HandleFunc(\"\/\", func(w http.ResponseWriter, r *http.Request) {\n\t\tlog.Printf(\"Request received from %s\", r.RemoteAddr)\n\t\tfmt.Fprintf(w, \"Hello from Nomad! Running on port %s\\n\", port)\n\t})\n\n\tlog.Printf(\"Server starting on port %s...\", port)\n\tlog.Fatal(http.ListenAndServe(\":\"+port, nil))\n}<\/code><\/pre>\n<p>Bu uygulama, gelen her iste\u011fe &#8220;Hello from Nomad!&#8221; mesaj\u0131n\u0131 d\u00f6nd\u00fcren basit bir HTTP sunucusudur. Port, ortam de\u011fi\u015fkeninden al\u0131n\u0131r, yoksa 8080 kullan\u0131l\u0131r.<\/p>\n<h4>Dockerfile Yaz\u0131m\u0131<\/h4>\n<p>Uygulamay\u0131 bir Docker imaj\u0131na d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in bir <code>Dockerfile<\/code> olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-dockerfile\"># Go uygulamas\u0131n\u0131 derlemek i\u00e7in bir build a\u015famas\u0131\nFROM golang:1.21-alpine AS builder\n\nWORKDIR \/app\n\nCOPY go.mod go.sum .\/\nRUN go mod download\n\nCOPY . .\n\nRUN CGO_ENABLED=0 GOOS=linux go build -o \/app\/hello-nomad .\n\n<h2>\u00c7al\u0131\u015ft\u0131rmak i\u00e7in daha k\u00fc\u00e7\u00fck bir runtime imaj\u0131<\/h2>\nFROM alpine:latest\n\nWORKDIR \/app\n\nCOPY --from=builder \/app\/hello-nomad .\n\n<h2>Uygulaman\u0131n dinleyece\u011fi port<\/h2>\nEXPOSE 8080\n\nCMD [\".\/hello-nomad\"]<\/code><\/pre>\n<h4>Docker \u0130maj\u0131n\u0131 Olu\u015fturma ve Test Etme<\/h4>\n<p><code>main.go<\/code> ve <code>Dockerfile<\/code> ayn\u0131 dizinde oldu\u011fundan emin olun. Ard\u0131ndan imaj\u0131 olu\u015fturun:<\/p>\n<pre><code class=\"language-bash\">docker build -t hello-nomad:1.0.0 .<\/code><\/pre>\n<p>\u0130maj\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 yerel olarak test edebilirsiniz:<\/p>\n<pre><code class=\"language-bash\">docker run -p 8080:8080 hello-nomad:1.0.0<\/code><\/pre>\n<p>Taray\u0131c\u0131n\u0131zda <code>http:\/\/localhost:8080<\/code> adresine giderek &#8220;Hello from Nomad!&#8221; mesaj\u0131n\u0131 g\u00f6rmelisiniz.<\/p>\n<h3>Nomad \u0130\u015f Tan\u0131m\u0131 (Job File) Olu\u015fturma<\/h3>\n<p>Nomad, i\u015f tan\u0131mlar\u0131n\u0131 HCL (HashiCorp Configuration Language) format\u0131nda al\u0131r. Bu dosya, Nomad&#8217;a uygulaman\u0131n nas\u0131l da\u011f\u0131t\u0131laca\u011f\u0131n\u0131, hangi kaynaklara ihtiya\u00e7 duydu\u011funu ve nas\u0131l \u00e7al\u0131\u015fmas\u0131 gerekti\u011fini s\u00f6yler.<\/p>\n<p><code>hello-nomad.nomad<\/code> ad\u0131nda bir dosya olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-hcl\">job \"hello-nomad\" {\n  datacenters = [\"dc1\"] # Nomad sunucunuzun veri merkezi ad\u0131n\u0131 buraya girin (varsay\u0131lan \"dc1\")\n  type        = \"service\" # Uzun s\u00fcreli \u00e7al\u0131\u015fan bir servis\n\n  update {\n    max_parallel      = 1\n    min_healthy_time  = \"10s\"\n    healthy_deadline  = \"5m\"\n    auto_revert       = true\n    canary            = 0\n  }\n\n  group \"web\" {\n    count = 2 # Bu servisten 2 \u00f6rnek \u00e7al\u0131\u015ft\u0131r\n\n    network {\n      port \"http\" {\n        to = 8080 # Konteynerin 8080 portunu d\u0131\u015far\u0131ya a\u00e7\n      }\n    }\n\n    service {\n      name = \"hello-nomad-service\"\n      port = \"http\"\n      tags = [\"web\"]\n\n      check {\n        type     = \"http\"\n        path     = \"\/\"\n        interval = \"10s\"\n        timeout  = \"2s\"\n        # Nomad, bu portu otomatik olarak atayacak\n        # Bu nedenle, check'in portunu belirtirken \"http\" etiketini kullan\u0131yoruz\n        # Nomad, atanan dinamik portu otomatik olarak \u00e7\u00f6zecektir.\n        port     = \"http\"\n      }\n    }\n\n    task \"hello-nomad-app\" {\n      driver = \"docker\"\n\n      config {\n        image = \"hello-nomad:1.0.0\" # Yerel Docker imaj\u0131m\u0131z\n        ports = [\"http\"]\n      }\n\n      resources {\n        cpu    = 100 # 100 MHz CPU\n        memory = 64  # 64 MB RAM\n      }\n\n      env {\n        PORT = \"${NOMAD_PORT_http}\" # Nomad'\u0131n atad\u0131\u011f\u0131 portu uygulamaya ilet\n      }\n    }\n  }\n}<\/code><\/pre>\n<p>Bu job dosyas\u0131ndaki \u00f6nemli k\u0131s\u0131mlar:<\/p>\n<p>*   <strong><code>job \"hello-nomad\"<\/code><\/strong>: \u0130\u015fin ad\u0131n\u0131 tan\u0131mlar.<br \/>\n*   <strong><code>datacenters = [\"dc1\"]<\/code><\/strong>: \u0130\u015fin da\u011f\u0131t\u0131laca\u011f\u0131 veri merkezlerini belirtir. Varsay\u0131lan veri merkezi <code>dc1<\/code>&#8216;dir.<br \/>\n*   <strong><code>type = \"service\"<\/code><\/strong>: Bu i\u015fin uzun s\u00fcreli \u00e7al\u0131\u015fan bir servis oldu\u011funu belirtir.<br \/>\n*   <strong><code>update<\/code><\/strong>: G\u00fcncelleme stratejilerini tan\u0131mlar (\u00f6rne\u011fin, ka\u00e7 tane paralel g\u00fcncelleme yap\u0131laca\u011f\u0131).<br \/>\n*   <strong><code>group \"web\"<\/code><\/strong>: Bir grup g\u00f6revi tan\u0131mlar. Ayn\u0131 grup i\u00e7indeki g\u00f6revler ayn\u0131 node \u00fczerinde \u00e7al\u0131\u015ft\u0131r\u0131lmaya \u00e7al\u0131\u015f\u0131l\u0131r.<br \/>\n*   <strong><code>count = 2<\/code><\/strong>: Bu gruptan 2 \u00f6rnek \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131n\u0131 isteriz.<br \/>\n*   <strong><code>network<\/code><\/strong>: A\u011f yap\u0131land\u0131rmas\u0131n\u0131 tan\u0131mlar.<br \/>\n    *   <strong><code>port \"http\" { to = 8080 }<\/code><\/strong>: Nomad&#8217;dan dinamik bir port atamas\u0131n\u0131 isteriz ve bu portu konteynerin 8080 portuna y\u00f6nlendiririz. Nomad, atad\u0131\u011f\u0131 portu <code>NOMAD_PORT_http<\/code> ortam de\u011fi\u015fkeni olarak uygulamaya iletir.<br \/>\n*   <strong><code>service<\/code><\/strong>: Consul gibi bir servis ke\u015fif sistemiyle entegrasyon i\u00e7in servis tan\u0131m\u0131n\u0131 i\u00e7erir.<br \/>\n    *   <strong><code>check<\/code><\/strong>: Uygulaman\u0131n sa\u011fl\u0131\u011f\u0131n\u0131 kontrol etmek i\u00e7in bir HTTP sa\u011fl\u0131k kontrol\u00fc tan\u0131mlar.<br \/>\n*   <strong><code>task \"hello-nomad-app\"<\/code><\/strong>: \u00c7al\u0131\u015ft\u0131r\u0131lacak as\u0131l g\u00f6revi tan\u0131mlar.<br \/>\n    *   <strong><code>driver = \"docker\"<\/code><\/strong>: Bu g\u00f6revin bir Docker konteyneri olarak \u00e7al\u0131\u015faca\u011f\u0131n\u0131 belirtir.<br \/>\n    *   <strong><code>config { image = \"hello-nomad:1.0.0\"; ports = [\"http\"] }<\/code><\/strong>: Kullan\u0131lacak Docker imaj\u0131n\u0131 ve d\u0131\u015far\u0131ya a\u00e7\u0131lacak portlar\u0131 belirtir.<br \/>\n    *   <strong><code>resources { cpu = 100; memory = 64 }<\/code><\/strong>: G\u00f6rev i\u00e7in ayr\u0131lacak CPU (MHz) ve bellek (MB) kaynaklar\u0131n\u0131 belirtir.<br \/>\n    *   <strong><code>env { PORT = \"${NOMAD_PORT_http}\" }<\/code><\/strong>: Nomad&#8217;\u0131n atad\u0131\u011f\u0131 dinamik portu Go uygulamam\u0131z\u0131n kullanmas\u0131 i\u00e7in <code>PORT<\/code> ortam de\u011fi\u015fkeni olarak iletir.<\/p>\n<h3>Mikroservisi Nomad ile Da\u011f\u0131tma<\/h3>\n<p>\u015eimdi bu job dosyas\u0131n\u0131 kullanarak mikroservisimizi Nomad&#8217;a da\u011f\u0131tal\u0131m.<\/p>\n<h4>Da\u011f\u0131t\u0131m Plan\u0131n\u0131 \u00d6nizleme<\/h4>\n<p>Da\u011f\u0131t\u0131m\u0131 yapmadan \u00f6nce, Nomad&#8217;\u0131n ne yapaca\u011f\u0131n\u0131 g\u00f6rmek i\u00e7in <code>nomad plan<\/code> komutunu kullanabiliriz:<\/p>\n<pre><code class=\"language-bash\">nomad plan hello-nomad.nomad<\/code><\/pre>\n<p>Bu komut, Nomad&#8217;\u0131n hangi g\u00f6revleri olu\u015fturaca\u011f\u0131n\u0131, g\u00fcncelleyece\u011fini veya silece\u011fini g\u00f6steren bir \u00f6zet sunar.<\/p>\n<h4>Uygulamay\u0131 Da\u011f\u0131tma<\/h4>\n<p>Plan\u0131 onaylad\u0131ktan sonra, uygulamay\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in <code>nomad run<\/code> komutunu kullan\u0131n:<\/p>\n<pre><code class=\"language-bash\">nomad run hello-nomad.nomad<\/code><\/pre>\n<p>Nomad, job dosyas\u0131n\u0131 kabul edecek ve g\u00f6revleri planlamaya ba\u015flayacakt\u0131r.<\/p>\n<h4>Durumu Takip Etme<\/h4>\n<p>Job&#8217;un durumunu kontrol etmek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">nomad status hello-nomad<\/code><\/pre>\n<p>Bu komut, job&#8217;un genel durumunu, \u00e7al\u0131\u015fan \u00f6rnek say\u0131s\u0131n\u0131 ve her bir \u00f6rne\u011fin hangi node \u00fczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 g\u00f6sterir. <code>running<\/code> durumda 2 \u00f6rnek g\u00f6rmelisiniz.<\/p>\n<p>Belirli bir g\u00f6rev \u00f6rne\u011finin (allocation) detaylar\u0131n\u0131 g\u00f6rmek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">nomad status <allocation_id> # nomad status \u00e7\u0131kt\u0131s\u0131ndaki ID'lerden birini kullan\u0131n<\/code><\/pre>\n<p>G\u00f6revlerin loglar\u0131n\u0131 g\u00f6rmek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">nomad logs -f <allocation_id><\/code><\/pre>\n<h4>Servise Eri\u015fim<\/h4>\n<p><code>nomad status hello-nomad<\/code> \u00e7\u0131kt\u0131s\u0131nda, <code>Allocations<\/code> b\u00f6l\u00fcm\u00fcnde her bir \u00f6rne\u011fin hangi node \u00fczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve atanan dinamik portlar\u0131 g\u00f6receksiniz. \u00d6rne\u011fin:<\/p>\n<pre><code class=\"language-\">ID        Node ID   Task Group  Version  Desired  Status   Created     Modified\na1b2c3d4  e5f6g7h8  web         0        run      running  2m ago      2m ago\n  \u2514 Task: hello-nomad-app (running)\n    \u2514  Port: http -> 20000 (listen)<\/code><\/pre>\n<p>Burada <code>20000<\/code> gibi bir port numaras\u0131 g\u00f6receksiniz. Bu, Nomad&#8217;\u0131n uygulaman\u0131za atad\u0131\u011f\u0131 d\u0131\u015far\u0131dan eri\u015filebilir porttur. Sunucunuzun IP adresi ve bu portu kullanarak uygulaman\u0131za eri\u015febilirsiniz:<\/p>\n<pre><code class=\"language-bash\">curl http:\/\/<sunucu_ip_adresi>:<atanan_port><\/code><\/pre>\n<p>\u00d6rne\u011fin, <code>http:\/\/localhost:20000<\/code> adresine gitti\u011finizde &#8220;Hello from Nomad! Running on port 20000&#8221; gibi bir mesaj g\u00f6rmelisiniz.<\/p>\n<h3>Geli\u015fmi\u015f Nomad \u00d6zellikleri<\/h3>\n<p>Nomad, mikroservis da\u011f\u0131t\u0131m\u0131 i\u00e7in temel i\u015flevselli\u011fin \u00f6tesinde bir\u00e7ok geli\u015fmi\u015f \u00f6zellik sunar.<\/p>\n<h4>Servis Ke\u015ffi ve Y\u00fck Dengeleme (Consul ile)<\/h4>\n<p>Nomad, HashiCorp Consul ile derinlemesine entegrasyona sahiptir. <code>service<\/code> blo\u011fu, uygulamalar\u0131n otomatik olarak Consul&#8217;a kaydedilmesini sa\u011flar. Bu sayede di\u011fer servisler, <code>hello-nomad-service<\/code> ad\u0131n\u0131 kullanarak bu servisi ke\u015ffedebilir.<\/p>\n<p>Y\u00fck dengeleme i\u00e7in, Consul&#8217;un servis ke\u015ffi yeteneklerini Traefik veya Nginx gibi bir ters proxy\/y\u00fck dengeleyici ile birle\u015ftirebilirsiniz. Traefik, Consul&#8217;dan servis bilgilerini otomatik olarak \u00e7ekerek gelen istekleri do\u011fru servis \u00f6rneklerine y\u00f6nlendirebilir.<\/p>\n<h4>Sa\u011fl\u0131k Kontrolleri (Health Checks)<\/h4>\n<p>Yukar\u0131daki <code>hello-nomad.nomad<\/code> dosyas\u0131nda bir HTTP sa\u011fl\u0131k kontrol\u00fc tan\u0131mlad\u0131k. Nomad, bu kontrol\u00fc d\u00fczenli aral\u0131klarla \u00e7al\u0131\u015ft\u0131r\u0131r ve e\u011fer bir servis \u00f6rne\u011fi belirtilen s\u00fcre i\u00e7inde yan\u0131t vermezse veya hatal\u0131 bir yan\u0131t d\u00f6nerse, Nomad o \u00f6rne\u011fi sa\u011fl\u0131ks\u0131z kabul eder ve yeniden ba\u015flat\u0131r. Bu, uygulaman\u0131z\u0131n her zaman \u00e7al\u0131\u015f\u0131r durumda kalmas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>Rolling G\u00fcncellemeler ve Geri Alma<\/h4>\n<p><code>update<\/code> blo\u011fu, uygulaman\u0131z\u0131n yeni s\u00fcr\u00fcmlerini kesintisiz bir \u015fekilde da\u011f\u0131tman\u0131z\u0131 sa\u011flar. <code>max_parallel<\/code>, ayn\u0131 anda ka\u00e7 \u00f6rne\u011fin g\u00fcncellenece\u011fini belirlerken, <code>min_healthy_time<\/code> yeni da\u011f\u0131t\u0131lan bir \u00f6rne\u011fin ne kadar s\u00fcre sa\u011fl\u0131kl\u0131 kalmas\u0131 gerekti\u011fini tan\u0131mlar. <code>auto_revert = true<\/code> ayar\u0131, bir g\u00fcncelleme ba\u015far\u0131s\u0131z olursa Nomad&#8217;\u0131n otomatik olarak \u00f6nceki s\u00fcr\u00fcme geri d\u00f6nmesini sa\u011flar. Bu, da\u011f\u0131t\u0131m riskini \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r.<\/p>\n<h4>Kaynak Y\u00f6netimi<\/h4>\n<p><code>resources<\/code> blo\u011fu ile CPU ve bellek gibi kaynaklar\u0131 g\u00f6revlere tahsis edebilirsiniz. Bu, node&#8217;lar\u0131n\u0131z\u0131n a\u015f\u0131r\u0131 y\u00fcklenmesini \u00f6nler ve g\u00f6revlerin istikrarl\u0131 bir \u015fekilde \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar. Do\u011fru kaynak tahsisi, performans\u0131 optimize etmek ve maliyetleri d\u00fc\u015f\u00fcrmek i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h4>Depolama Entegrasyonu<\/h4>\n<p>Nomad, CSI (Container Storage Interface) s\u00fcr\u00fcc\u00fcleri arac\u0131l\u0131\u011f\u0131yla kal\u0131c\u0131 depolama \u00e7\u00f6z\u00fcmleriyle entegre olabilir. Bu, veritabanlar\u0131 veya kal\u0131c\u0131 veri gerektiren di\u011fer uygulamalar i\u00e7in \u00f6nemlidir.<\/p>\n<h4>S\u0131rlar Y\u00f6netimi (Secrets Management)<\/h4>\n<p>Hassas veriler (veritaban\u0131 \u015fifreleri, API anahtarlar\u0131 vb.) do\u011frudan job dosyalar\u0131na yaz\u0131lmamal\u0131d\u0131r. Nomad, HashiCorp Vault ile entegrasyon sa\u011flayarak bu t\u00fcr s\u0131rlar\u0131n g\u00fcvenli bir \u015fekilde y\u00f6netilmesini ve uygulamalara dinamik olarak enjekte edilmesini sa\u011flar. Bu, g\u00fcvenlik duru\u015funuzu \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftirir.<\/p>\n<h4>A\u011f Yap\u0131land\u0131rmas\u0131<\/h4>\n<p>Nomad, \u00e7e\u015fitli a\u011f modlar\u0131n\u0131 destekler:<\/p>\n<p>*   <strong>Host Network:<\/strong> Konteyner do\u011frudan host&#8217;un a\u011f aray\u00fcz\u00fcn\u00fc kullan\u0131r.<br \/>\n*   <strong>Bridge Network:<\/strong> Konteyner, host&#8217;ta olu\u015fturulan bir k\u00f6pr\u00fc a\u011f\u0131na ba\u011flan\u0131r ve NAT \u00fczerinden d\u0131\u015far\u0131ya \u00e7\u0131kar.<br \/>\n*   <strong>CNI (Container Network Interface):<\/strong> Daha geli\u015fmi\u015f a\u011f eklentileriyle entegrasyon.<\/p>\n<p><code>network<\/code> blo\u011fu, port e\u015flemelerini ve di\u011fer a\u011f ayarlar\u0131n\u0131 tan\u0131mlaman\u0131za olanak tan\u0131r.<\/p>\n<h3>\u0130zleme ve Loglama<\/h3>\n<p>Da\u011f\u0131t\u0131k mikroservis ortamlar\u0131nda izleme ve loglama, sorun giderme ve performans analizi i\u00e7in hayati \u00f6neme sahiptir.<\/p>\n<p>*   <strong>\u0130zleme (Monitoring):<\/strong> Prometheus gibi bir metrik toplama sistemi, Nomad metriklerini (CPU kullan\u0131m\u0131, bellek t\u00fcketimi, g\u00f6rev durumu) ve uygulama metriklerini toplayabilir. Grafana ile bu metrikler g\u00f6rselle\u015ftirilerek sistemin genel sa\u011fl\u0131\u011f\u0131 ve performans\u0131 izlenebilir.<br \/>\n*   <strong>Loglama (Logging):<\/strong> Nomad, g\u00f6revlerin stdout\/stderr \u00e7\u0131kt\u0131lar\u0131n\u0131 depolar. Ancak merkezi bir loglama \u00e7\u00f6z\u00fcm\u00fc (ELK Stack &#8211; Elasticsearch, Logstash, Kibana, veya Loki\/Promtail) kullanmak, t\u00fcm servislerden gelen loglar\u0131 tek bir yerden toplaman\u0131z\u0131, araman\u0131z\u0131 ve analiz etmenizi sa\u011flar. Konteyner loglar\u0131n\u0131 merkezi bir sisteme g\u00f6ndermek i\u00e7in Fluentd veya Filebeat gibi ara\u00e7lar kullan\u0131labilir.<\/p>\n<h3>En \u0130yi Uygulama Y\u00f6ntemleri<\/h3>\n<p>Nomad ile mikroservis da\u011f\u0131t\u0131m\u0131 yaparken baz\u0131 en iyi uygulama y\u00f6ntemlerini takip etmek, sa\u011flam, \u00f6l\u00e7eklenebilir ve y\u00f6netilebilir bir sistem olu\u015fturman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<p>*   <strong>Altyap\u0131y\u0131 Kod Olarak Y\u00f6netme (Infrastructure as Code &#8211; IaC):<\/strong> Nomad job dosyalar\u0131, altyap\u0131n\u0131z\u0131n bir par\u00e7as\u0131d\u0131r. Bunlar\u0131 Git gibi bir versiyon kontrol sisteminde tutun ve de\u011fi\u015fiklikleri kod incelemesi s\u00fcre\u00e7lerinden ge\u00e7irin. Terraform, Nomad k\u00fcmelerini ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00f6netmek i\u00e7in harika bir ara\u00e7t\u0131r.<br \/>\n*   <strong>De\u011fi\u015fmez Altyap\u0131 (Immutable Infrastructure):<\/strong> Da\u011f\u0131t\u0131lan konteyner imajlar\u0131n\u0131 veya VM&#8217;leri g\u00fcncellemek yerine, her zaman yeni bir imaj olu\u015fturun ve bunu da\u011f\u0131t\u0131n. Bu, tutarl\u0131l\u0131\u011f\u0131 art\u0131r\u0131r ve &#8220;\u00e7al\u0131\u015fan ama ne oldu\u011fu bilinmeyen&#8221; durumlar\u0131 \u00f6nler.<br \/>\n*   <strong>CI\/CD S\u00fcre\u00e7lerine Entegrasyon:<\/strong> Otomatikle\u015ftirilmi\u015f s\u00fcrekli entegrasyon ve s\u00fcrekli da\u011f\u0131t\u0131m (CI\/CD) boru hatlar\u0131 kurun. Kod de\u011fi\u015fiklikleri otomatik olarak test edilmeli, Docker imajlar\u0131 olu\u015fturulmal\u0131 ve Nomad&#8217;a da\u011f\u0131t\u0131lmal\u0131d\u0131r. Bu, da\u011f\u0131t\u0131m h\u0131z\u0131n\u0131 ve g\u00fcvenilirli\u011fini art\u0131r\u0131r.<br \/>\n*   <strong>Kaynak Tahsisi:<\/strong> Her g\u00f6rev i\u00e7in CPU ve bellek limitlerini ve rezervasyonlar\u0131n\u0131 dikkatlice belirleyin. Bu, kaynak \u00e7at\u0131\u015fmalar\u0131n\u0131 \u00f6nler ve node&#8217;lar\u0131n\u0131z\u0131n a\u015f\u0131r\u0131 y\u00fcklenmesini engeller.<br \/>\n*   <strong>G\u00fcvenlik Katmanlar\u0131:<\/strong><br \/>\n    *   <strong>A\u011f G\u00fcvenli\u011fi:<\/strong> G\u00fcvenlik gruplar\u0131 veya g\u00fcvenlik duvarlar\u0131 ile Nomad sunucular\u0131 ve istemcileri aras\u0131ndaki trafi\u011fi k\u0131s\u0131tlay\u0131n.<br \/>\n    *   <strong>ACL&#8217;ler (Access Control Lists):<\/strong> Nomad&#8217;\u0131n yerle\u015fik ACL sistemi ile kimin hangi i\u015fleri da\u011f\u0131tabilece\u011fini veya y\u00f6netebilece\u011fini kontrol edin.<br \/>\n    *   <strong>S\u0131rlar Y\u00f6netimi:<\/strong> Hassas verileri asla do\u011frudan job dosyalar\u0131na yazmay\u0131n; HashiCorp Vault gibi bir s\u0131r y\u00f6netimi \u00e7\u00f6z\u00fcm\u00fc kullan\u0131n.<br \/>\n*   <strong>Versiyonlama:<\/strong> Docker imajlar\u0131n\u0131z\u0131 ve Nomad job dosyalar\u0131n\u0131z\u0131 versiyonlay\u0131n. Bu, geri d\u00f6n\u00fc\u015fleri kolayla\u015ft\u0131r\u0131r ve belirli bir anda sisteminizin hangi durumda oldu\u011funu anlaman\u0131za yard\u0131mc\u0131 olur.<br \/>\n*   <strong>K\u00fc\u00e7\u00fck, Tek Amacl\u0131 Servisler:<\/strong> Mikroservislerin temel prensibine ba\u011fl\u0131 kal\u0131n: her servis tek bir sorumlulu\u011fa sahip olmal\u0131 ve k\u00fc\u00e7\u00fck olmal\u0131d\u0131r. Bu, y\u00f6netimi kolayla\u015ft\u0131r\u0131r ve ba\u011f\u0131ms\u0131z \u00f6l\u00e7eklenmeyi destekler.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Bu makalede, mikroservislerin Ubuntu i\u015fletim sistemi \u00fczerinde HashiCorp Nomad kullan\u0131larak nas\u0131l da\u011f\u0131t\u0131laca\u011f\u0131n\u0131 ve y\u00f6netilece\u011fini detayl\u0131 bir \u015fekilde inceledik. Nomad&#8217;\u0131n basitli\u011fi, esnekli\u011fi ve HashiCorp ekosistemiyle olan entegrasyonu, onu modern mikroservis da\u011f\u0131t\u0131mlar\u0131 i\u00e7in g\u00fc\u00e7l\u00fc ve cazip bir se\u00e7enek haline getirmektedir.<\/p>\n<p>Nomad, \u00f6zellikle Kubernetes&#8217;in karma\u015f\u0131kl\u0131\u011f\u0131ndan ka\u00e7\u0131nmak isteyen veya daha hafif, daha odaklanm\u0131\u015f bir orkestrasyon arac\u0131na ihtiya\u00e7 duyan ekipler i\u00e7in idealdir. Ubuntu&#8217;nun sa\u011flam ve yayg\u0131n kullan\u0131m\u0131yla birle\u015fti\u011finde, geli\u015ftiricilere ve operasyon ekiplerine mikroservislerini g\u00fcvenilir, \u00f6l\u00e7eklenebilir ve y\u00f6netilebilir bir \u015fekilde da\u011f\u0131tma imkan\u0131 sunar. Sa\u011fl\u0131k kontrolleri, rolling g\u00fcncellemeler, kaynak y\u00f6netimi ve servis ke\u015ffi gibi geli\u015fmi\u015f \u00f6zellikleriyle Nomad, mikroservislerin ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc basitle\u015ftirerek ekiplerin daha \u00e7ok i\u015f de\u011feri yaratmaya odaklanmas\u0131na olanak tan\u0131r.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Mikroservislerin Ubuntu \u00dczerinde Nomad ile Da\u011f\u0131t\u0131m\u0131\nMikroservis mimarisi, modern yaz\u0131l\u0131m geli\u015ftirmede esneklik, \u00f6l\u00e7eklenebilirlik ve ba\u011f\u0131","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1468],"tags":[],"class_list":{"0":"post-32578","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-ubuntu","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Mikroservislerin Ubuntu \u00dczerinde Nomad ile Da\u011f\u0131t\u0131m\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/mikroservislerin-ubuntu-uzerinde-nomad-ile-dagitimi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Mikroservislerin Ubuntu \u00dczerinde Nomad ile Da\u011f\u0131t\u0131m\u0131\" \/>\n<meta property=\"og:description\" content=\"Mikroservislerin Ubuntu \u00dczerinde Nomad ile Da\u011f\u0131t\u0131m\u0131 Mikroservis mimarisi, modern yaz\u0131l\u0131m geli\u015ftirmede esneklik, \u00f6l\u00e7eklenebilirlik ve ba\u011f\u0131\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/mikroservislerin-ubuntu-uzerinde-nomad-ile-dagitimi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-23T09:41:10+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mikroservislerin-ubuntu-uzerinde-nomad-ile-dagitimi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mikroservislerin-ubuntu-uzerinde-nomad-ile-dagitimi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Mikroservislerin Ubuntu \u00dczerinde Nomad ile Da\u011f\u0131t\u0131m\u0131\",\"datePublished\":\"2025-10-23T09:41:10+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mikroservislerin-ubuntu-uzerinde-nomad-ile-dagitimi\/\"},\"wordCount\":2816,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Ubuntu\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/mikroservislerin-ubuntu-uzerinde-nomad-ile-dagitimi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mikroservislerin-ubuntu-uzerinde-nomad-ile-dagitimi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/mikroservislerin-ubuntu-uzerinde-nomad-ile-dagitimi\/\",\"name\":\"Mikroservislerin Ubuntu \u00dczerinde Nomad ile Da\u011f\u0131t\u0131m\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-23T09:41:10+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mikroservislerin-ubuntu-uzerinde-nomad-ile-dagitimi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/mikroservislerin-ubuntu-uzerinde-nomad-ile-dagitimi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mikroservislerin-ubuntu-uzerinde-nomad-ile-dagitimi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mikroservislerin Ubuntu \u00dczerinde Nomad ile Da\u011f\u0131t\u0131m\u0131\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Mikroservislerin Ubuntu \u00dczerinde Nomad ile Da\u011f\u0131t\u0131m\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/mikroservislerin-ubuntu-uzerinde-nomad-ile-dagitimi\/","og_locale":"tr_TR","og_type":"article","og_title":"Mikroservislerin Ubuntu \u00dczerinde Nomad ile Da\u011f\u0131t\u0131m\u0131","og_description":"Mikroservislerin Ubuntu \u00dczerinde Nomad ile Da\u011f\u0131t\u0131m\u0131 Mikroservis mimarisi, modern yaz\u0131l\u0131m geli\u015ftirmede esneklik, \u00f6l\u00e7eklenebilirlik ve ba\u011f\u0131","og_url":"https:\/\/fatihsoysal.com\/blog\/mikroservislerin-ubuntu-uzerinde-nomad-ile-dagitimi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-23T09:41:10+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/mikroservislerin-ubuntu-uzerinde-nomad-ile-dagitimi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/mikroservislerin-ubuntu-uzerinde-nomad-ile-dagitimi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Mikroservislerin Ubuntu \u00dczerinde Nomad ile Da\u011f\u0131t\u0131m\u0131","datePublished":"2025-10-23T09:41:10+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/mikroservislerin-ubuntu-uzerinde-nomad-ile-dagitimi\/"},"wordCount":2816,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Ubuntu"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/mikroservislerin-ubuntu-uzerinde-nomad-ile-dagitimi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/mikroservislerin-ubuntu-uzerinde-nomad-ile-dagitimi\/","url":"https:\/\/fatihsoysal.com\/blog\/mikroservislerin-ubuntu-uzerinde-nomad-ile-dagitimi\/","name":"Mikroservislerin Ubuntu \u00dczerinde Nomad ile Da\u011f\u0131t\u0131m\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-23T09:41:10+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/mikroservislerin-ubuntu-uzerinde-nomad-ile-dagitimi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/mikroservislerin-ubuntu-uzerinde-nomad-ile-dagitimi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/mikroservislerin-ubuntu-uzerinde-nomad-ile-dagitimi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Mikroservislerin Ubuntu \u00dczerinde Nomad ile Da\u011f\u0131t\u0131m\u0131"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32578","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=32578"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32578\/revisions"}],"predecessor-version":[{"id":32579,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32578\/revisions\/32579"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32578"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32578"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32578"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}