AWS EKS Üzerinde Uçtan Uca Mikroservis Dağıtımı: Jenkins, Docker, Kubernetes ve Argo CD ile CI/CD
Günümüzün hızla değişen yazılım dünyasında, uygulamaların esneklik, ölçeklenebilirlik ve hızlı teslimat yetenekleri kritik öneme sahiptir. Mikroservis mimarisi, bu ihtiyaçları karşılamak için güçlü bir çözüm sunsa da, bu hizmetlerin dağıtımı ve yönetimi karmaşık bir süreç olabilir. AWS EKS (Elastic Kubernetes Service) ile Kubernetes’in gücünü bulut ortamında kullanırken, Jenkins ile sürekli entegrasyon (CI), Docker ile konteynerleştirme ve Argo CD ile GitOps tabanlı sürekli dağıtım (CD) yaklaşımlarını birleştirerek, uçtan uca otomatize edilmiş, verimli ve güvenilir bir CI/CD boru hattı oluşturabiliriz. Bu makale, bu bileşenlerin nasıl entegre edileceğini ve mikroservislerinizi sorunsuz bir şekilde nasıl dağıtacağınızı detaylı bir şekilde açıklayacaktır.
Mikroservis Mimarisi ve AWS EKS’in Rolü
Modern uygulama geliştirmenin temel taşlarından biri olan mikroservis mimarisi, büyük ve monolitik uygulamaları daha küçük, bağımsız ve yönetilebilir hizmetlere bölerek geliştirme süreçlerini hızlandırır, hata izolasyonunu artırır ve ölçeklenebilirliği kolaylaştırır. Ancak bu bağımsız hizmetlerin yaşam döngüsünü yönetmek, dağıtmak ve izlemek geleneksel yöntemlerle zorlayıcı olabilir.
Mikroservislerin Temelleri ve Avantajları
Mikroservisler, her biri kendi iş mantığına, veri tabanına ve API’sine sahip, bağımsız olarak geliştirilebilen, dağıtılabilen ve ölçeklenebilen küçük hizmetlerdir. Bu yapı, farklı ekiplerin aynı anda farklı hizmetler üzerinde çalışmasına olanak tanır, teknoloji yığını esnekliği sunar ve bir hizmetteki hatanın tüm sistemi çökertmesini engeller. Bu avantajlar, özellikle büyük ve karmaşık sistemler için vazgeçilmezdir.
AWS EKS Nedir ve Neden Tercih Edilmeli?
Amazon Elastic Kubernetes Service (EKS), AWS bulutunda Kubernetes kümelerini çalıştırmayı kolaylaştıran yönetilen bir hizmettir. EKS, Kubernetes kontrol düzlemini (master düğümler) sizin için yönetir, böylece altyapı yönetimi yükünü azaltır ve yüksek erişilebilirlik, güvenlik ve ölçeklenebilirlik sağlar. Mikroservislerinizi EKS üzerinde çalıştırmak, Kubernetes’in güçlü orkestrasyon yeteneklerinden faydalanırken, AWS’in güvenilir ve ölçeklenebilir altyapısını kullanmanızı sağlar.
EKS Kümesi Kurulumuna Genel Bakış
EKS kümesi kurulumu genellikle eksctl gibi araçlar veya AWS Yönetim Konsolu üzerinden gerçekleştirilir. Bir EKS kümesi oluşturmak, kontrol düzlemini yapılandırmayı, worker düğümlerini (EC2 örnekleri) sağlamayı ve bu düğümlerin kümeye katılmasını sağlamayı içerir. Ayrıca, VPC, alt ağlar, güvenlik grupları gibi ağ yapılandırmaları da bu sürecin önemli bir parçasıdır. Doğru yapılandırılmış bir EKS kümesi, mikroservisleriniz için sağlam bir temel oluşturur.
Docker ile Konteynerleştirme ve Görüntü Yönetimi
Mikroservis mimarisinin ve Kubernetes’in temelini konteynerler oluşturur. Docker, uygulamaları ve bağımlılıklarını izole edilmiş, taşınabilir birimler olan konteynerler içinde paketlemeyi sağlayan lider bir platformdur.
Docker Nedir ve Mikroservisler İçin Önemi
Docker, uygulamaların farklı ortamlarda (geliştirme, test, üretim) tutarlı bir şekilde çalışmasını garanti eder. Her mikroservis, kendi Docker konteyneri içinde çalışarak bağımlılık çakışmalarını önler ve dağıtım süreçlerini basitleştirir. Bu, “bir kez inşa et, her yerde çalıştır” felsefesini mümkün kılar.
Dockerfile Oluşturma ve Görüntü İnşa Süreci
Bir Dockerfile, Docker görüntüsünü oluşturmak için kullanılan talimatları içeren metin tabanlı bir dosyadır. Bir mikroservis için tipik bir Dockerfile, temel bir işletim sistemi görüntüsü seçmekle başlar, uygulama kodunu kopyalar, bağımlılıkları yükler ve uygulamanın nasıl başlatılacağını tanımlar. Örneğin:
# Temel Python görüntüsü
FROM python:3.9-slim-buster
# Çalışma dizini oluştur
WORKDIR /app
# Bağımlılıkları kopyala ve yükle
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Uygulama kodunu kopyala
COPY . .
# Uygulamanın çalışacağı portu belirt
EXPOSE 8000
# Uygulamayı başlat
CMD ["python", "app.py"]
Bu Dockerfile, uygulamanızın bağımlılıklarıyla birlikte bir Docker görüntüsüne nasıl dönüştürüleceğini gösterir. Bu görüntü daha sonra bir konteyner kayıt defterine (registry) gönderilir.
Amazon ECR (Elastic Container Registry) Kullanımı
Amazon ECR, Docker konteyner görüntülerinin depolanması, yönetilmesi ve dağıtılması için tam olarak yönetilen bir AWS hizmetidir. ECR, AWS ekosistemiyle sorunsuz bir şekilde entegre olur ve EKS kümelerinizden görüntülere güvenli ve hızlı erişim sağlar. Görüntüleri ECR'ye göndermek, CI/CD boru hattınızın önemli bir adımıdır.
Jenkins ile Sürekli Entegrasyon (CI) Boru Hattı
Jenkins, açık kaynaklı, genişletilebilir bir otomasyon sunucusu olup, sürekli entegrasyon ve sürekli teslimat (CI/CD) boru hatlarını otomatikleştirmek için yaygın olarak kullanılır. Mikroservis mimarisinde, her kod değişikliğinin otomatik olarak test edilmesini ve doğrulanmasını sağlar.
Jenkins'in Rolü ve Kurulumu
Jenkins, kod deposundaki değişiklikleri izler, otomatik olarak derleme, test ve Docker görüntüsü oluşturma işlemlerini tetikler. AWS üzerinde Jenkins'i bir EC2 örneğine kurabilir veya bir EKS kümesi içinde bir Pod olarak çalıştırabilirsiniz. Kurulum sonrası gerekli eklentilerin (örneğin Docker, Kubernetes, AWS kimlik bilgileri) yapılandırılması önemlidir.
Jenkinsfile ile Deklaratif Boru Hattı Tanımlama
Jenkins boru hatları, genellikle kod depolarında Jenkinsfile adı verilen dosyalar aracılığıyla tanımlanır. Bu deklaratif yaklaşım, boru hattı yapılandırmasını kodla birlikte sürüm kontrolünde tutmayı sağlar. İşte basit bir CI aşamasını gösteren Jenkinsfile snippet'i:
pipeline {
agent any
stages {
stage('Checkout Code') {
steps {
git 'https://github.com/your-repo/your-microservice.git'
}
}
stage('Build Docker Image') {
steps {
script {
def appImage = docker.build("my-microservice:${env.BUILD_ID}")
appImage.push()
// ECR'ye push için kimlik doğrulama ve etiketleme adımları eklenmeli
}
}
}
stage('Run Tests') {
steps {
sh 'python -m pytest' // Varsayımsal test komutu
}
}
}
}
CI Adımları: Kod Derleme, Test Etme, Docker Görüntüsü Oluşturma ve ECR'ye Gönderme
Jenkins boru hattı genellikle şu adımları içerir:
- Kod Çekme: Git deposundan en son kodu çeker.
- Derleme: Uygulama kodunu derler (eğer derleme gerekiyorsa).
- Test Etme: Birim testleri, entegrasyon testleri gibi otomatik testleri çalıştırır.
- Docker Görüntüsü Oluşturma: Uygulama kodundan bir Docker görüntüsü oluşturur.
- Görüntüyü ECR'ye Gönderme: Oluşturulan Docker görüntüsünü Amazon ECR'ye iter. Bu görüntü, daha sonra Kubernetes tarafından dağıtım için kullanılacaktır.
Kubernetes ile Dağıtım ve Yönetim
Kubernetes, konteynerleştirilmiş iş yüklerini ve hizmetleri otomatikleştirmek, ölçeklendirmek ve yönetmek için açık kaynaklı bir platformdur. EKS üzerinde, Kubernetes'in gücünden tam anlamıyla faydalanabiliriz.
Kubernetes Temel Kavramları (Pod, Deployment, Service)
- Pod: Kubernetes'teki en küçük dağıtılabilir birimdir. Bir veya daha fazla konteyneri barındırır ve ortak depolama ile ağ kaynaklarını paylaşır.
- Deployment: Pod'ların deklaratif olarak güncellenmesini ve yönetilmesini sağlar. Bir uygulamanın belirli bir sürümünü çalıştıran Pod'ların sayısını ve nasıl güncelleneceğini tanımlar.
- Service: Bir grup Pod'a ağ erişimi sağlayan soyut bir yapıdır. Yük dengeleme ve hizmet keşfi için kullanılır.
Mikroservisler İçin Kubernetes Manifestleri
Kubernetes'e dağıtılacak her mikroservis için YAML formatında manifest dosyaları oluşturulur. Bu dosyalar, Deployment, Service, Ingress gibi Kubernetes kaynaklarını tanımlar. İşte basit bir Deployment ve Service manifesti örneği:
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-microservice-deployment
spec:
replicas: 3
selector:
matchLabels:
app: my-microservice
template:
metadata:
labels:
app: my-microservice
spec:
containers:
- name: my-microservice
image: .dkr.ecr..amazonaws.com/my-microservice:latest # ECR görüntüsü
ports:
- containerPort: 8000
---
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-microservice-service
spec:
selector:
app: my-microservice
ports:
- protocol: TCP
port: 80
targetPort: 8000
type: LoadBalancer # Dışarıdan erişim için
EKS Üzerinde Dağıtım Stratejileri
Kubernetes, farklı dağıtım stratejilerini destekler: Rolling Update (varsayılan), Blue/Green ve Canary. Bu stratejiler, yeni sürümlerin risksiz bir şekilde üretime alınmasını sağlar. Argo CD gibi araçlar, bu stratejileri GitOps prensipleriyle entegre ederek daha kontrollü bir dağıtım süreci sunar.
Argo CD ile Sürekli Dağıtım (CD) ve GitOps
Geleneksel CI/CD boru hatlarında, dağıtım adımı genellikle Jenkins gibi bir CI aracı tarafından tetiklenir. Ancak GitOps yaklaşımı, altyapı ve uygulama konfigürasyonunu Git deposunda tek kaynak olarak tutarak, dağıtımın daha güvenli ve denetlenebilir olmasını sağlar. Argo CD, Kubernetes için GitOps tabanlı deklaratif bir sürekli dağıtım aracıdır.
GitOps Nedir ve Neden Argo CD?
GitOps, operasyonel süreçleri Git kullanarak otomatikleştiren bir yaklaşımdır. Uygulama ve altyapı durumu, Git deposundaki deklaratif tanım dosyalarıyla eşleşmelidir. Argo CD, Git deposundaki Kubernetes manifestlerini sürekli olarak izler ve kümedeki gerçek durumu bu deklaratif durumla senkronize eder. Bu, manuel müdahaleyi azaltır, hata olasılığını düşürür ve geri alma işlemlerini kolaylaştırır.
Argo CD Kurulumu ve Temel Konfigürasyon
Argo CD, Kubernetes kümesine basit YAML manifestleri ile kurulabilir. Kurulumdan sonra, Argo CD UI veya CLI aracılığıyla Git depolarınızı ve dağıtmak istediğiniz uygulamaları tanımlarsınız. Argo CD, otomatik senkronizasyon, durum takibi ve görselleştirme gibi özellikler sunar.
Uygulama Tanımlama ve Senkronizasyon Süreci
Argo CD'de bir uygulama tanımlamak, genellikle uygulamanın Kubernetes manifestlerinin bulunduğu Git deposunun URL'sini, hedef Kubernetes kümesini ve manifestlerin yolunu belirtmeyi içerir. Argo CD, bu Git deposunu düzenli olarak yoklar ve herhangi bir değişiklik algıladığında, kümedeki kaynakları Git'teki deklaratif durumla eşleşecek şekilde otomatik olarak günceller veya manuel senkronizasyon seçeneği sunar.
# argocd-application.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-microservice-app
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/your-org/your-gitops-repo.git # Kubernetes manifestlerinin olduğu repo
targetRevision: HEAD
path: k8s/my-microservice # Manifestlerin repo içindeki yolu
destination:
server: https://kubernetes.default.svc # Hedef küme
namespace: default
syncPolicy:
automated:
prune: true
selfHeal: true
Uçtan Uca CI/CD Boru Hattının Birleştirilmesi
Şimdiye kadar ele aldığımız tüm bileşenleri bir araya getirerek, geliştirme ortamından üretime kadar tam otomatik bir boru hattı oluşturabiliriz.
Jenkins ve Argo CD Entegrasyonu
Jenkins, CI aşamasını (kod çekme, derleme, test, Docker görüntüsü oluşturma ve ECR'ye gönderme) tamamladıktan sonra, bir sonraki adımda Argo CD'yi tetikleyebilir. Bu tetikleme genellikle Git deposundaki Kubernetes manifestlerinin (örneğin, Deployment YAML dosyasındaki Docker görüntü etiketi) güncellenmesiyle yapılır. Jenkins, yeni oluşturulan Docker görüntüsü etiketiyle Kubernetes manifestini güncelleyip Git'e push ettiğinde, Argo CD bu değişikliği algılar ve otomatik olarak EKS kümesindeki uygulamayı günceller.
Boru Hattı Akışı: Geliştirmeden Üretime
- Geliştirici, kodunu Git deposuna (örn. GitHub, GitLab) push eder.
- Jenkins, bu değişikliği algılar ve CI boru hattını başlatır.
- Jenkins, kodu derler, testleri çalıştırır ve yeni bir Docker görüntüsü oluşturur.
- Oluşturulan Docker görüntüsü Amazon ECR'ye gönderilir.
- Jenkins, uygulamanın Kubernetes manifestindeki (GitOps deposunda bulunan) Docker görüntü etiketini yeni etiketle günceller ve bu değişikliği GitOps deposuna push eder.
- Argo CD, GitOps deposundaki değişikliği algılar.
- Argo CD, EKS kümesindeki uygulamanın durumunu Git'teki deklaratif durumla senkronize eder, böylece yeni Docker görüntüsüne sahip Pod'lar dağıtılır.
- Yeni sürüm, EKS üzerinde canlıya alınır.
İzleme ve Günlükleme (Prometheus, Grafana, CloudWatch)
Uygulamaların sağlıklı çalıştığından emin olmak için kapsamlı izleme ve günlükleme çözümleri entegre etmek hayati öneme sahiptir. Prometheus metrik toplama, Grafana görselleştirme için, AWS CloudWatch ise EKS kümesi günlükleri ve metrikleri için kullanılabilir. Bu araçlar, olası sorunları hızlıca tespit etmenize ve çözmenize yardımcı olur.
Sonuç
AWS EKS üzerinde Jenkins, Docker, Kubernetes ve Argo CD'yi bir araya getiren bu uçtan uca CI/CD boru hattı, mikroservislerinizi geliştirme, test etme ve dağıtma şeklinizi kökten dönüştürür. Bu entegre yaklaşım, manuel hataları azaltır, dağıtım hızını artırır, sistem kararlılığını iyileştirir ve ekiplerin daha verimli çalışmasına olanak tanır. GitOps felsefesiyle birleşen bu güçlü araçlar, modern bulut tabanlı uygulamalarınız için ölçeklenebilir, güvenilir ve sürdürülebilir bir dağıtım stratejisi sunar. Artık karmaşık altyapı yönetimi yerine, yenilikçi özellikler geliştirmeye odaklanabilirsiniz.
SSS (Sık Sorulan Sorular)
- Argo CD yerine Jenkins ile CD yapılabilir mi?
- Evet, Jenkins ile de CD yapılabilir. Ancak Argo CD'nin GitOps odaklı yapısı, Kubernetes dağıtımları için daha deklaratif, güvenli ve denetlenebilir bir yaklaşım sunar. Argo CD, küme durumunu Git ile senkronize tutarak manuel müdahaleyi ve konfigürasyon kaymasını (drift) minimize eder.
- EKS yerine farklı bir Kubernetes hizmeti kullanılabilir mi?
- Kesinlikle. Bu makalede açıklanan prensipler ve araçlar (Jenkins, Docker, Kubernetes, Argo CD) bulut sağlayıcısından bağımsızdır. Google Kubernetes Engine (GKE), Azure Kubernetes Service (AKS) veya kendi yönettiğiniz bir Kubernetes kümesi üzerinde de benzer bir boru hattı kurulabilir. AWS ECR yerine diğer konteyner kayıt defterleri (Docker Hub, GitLab Container Registry) kullanılabilir.
- Bu kurulumun maliyetleri nelerdir?
- Maliyetler, kullanılan AWS kaynaklarına (EKS kontrol düzlemi, EC2 worker düğümleri, ECR depolama, EBS birimleri, ağ trafiği), Jenkins sunucusunun boyutuna ve trafiğe bağlı olarak değişir. EKS'in kendisi kontrol düzlemi için saatlik bir ücret alır. EC2 örnekleri ve diğer AWS hizmetleri kullandıkça öde modeliyle faturalandırılır. Maliyetleri optimize etmek için doğru boyutlandırma ve gereksiz kaynakları kapatma önemlidir.
- Güvenlik bu süreçte nasıl sağlanır?
- Güvenlik, boru hattının her aşamasında kritik öneme sahiptir. Şunları içermelidir:
- Kimlik ve Erişim Yönetimi (IAM): AWS IAM rolleri ve politikaları ile Jenkins, EKS ve ECR'ye minimum yetki prensibiyle erişim sağlanmalı.
- Ağ Güvenliği: VPC, güvenlik grupları ve ağ ACL'leri ile EKS kümesine ve uygulamalara erişim kısıtlanmalı.
- Konteyner Güvenliği: Güvenli temel görüntüler kullanma, güvenlik taramaları yapma (örn. Clair, Trivy) ve çalışma zamanı güvenliği (örn. Falco) uygulama.
- Kod Güvenliği: Statik kod analizi (SAST) ve dinamik kod analizi (DAST) araçları ile güvenlik açıklarını tespit etme.
- Sırlar Yönetimi: AWS Secrets Manager veya Kubernetes Secrets gibi araçlarla hassas verileri güvenli bir şekilde yönetme.