GitLab Continuous Deployment’ı DigitalOcean Üzerinde GitLab Runner ile Otomatik Ölçeklendirme
Günümüzün hızla değişen yazılım geliştirme dünyasında, sürekli entegrasyon (CI) ve sürekli dağıtım (CD) süreçleri, ekiplerin daha hızlı, daha güvenilir ve daha verimli bir şekilde yazılım teslim etmelerini sağlayan temel taşlardır. GitLab CI/CD, geliştirme yaşam döngüsünün bu kritik aşamalarını otomatikleştirmek için güçlü ve entegre bir platform sunar. Ancak, dinamik iş yüklerine sahip projelerde, CI/CD işlerini yürüten GitLab Runner’ların statik bir altyapıda çalışması, performans darboğazlarına, yüksek maliyetlere veya kaynak israfına yol açabilir. İşte tam bu noktada, GitLab Runner’ların otomatik ölçeklendirilmesi devreye girer.
Bu makalede, GitLab Continuous Deployment süreçlerinizi DigitalOcean üzerinde GitLab Runner ile nasıl otomatik ölçeklendireceğinizi adım adım detaylı bir şekilde inceleyeceğiz. Bu sayede, CI/CD işlerinizin yoğunluğuna göre kaynaklarınızı dinamik olarak artırıp azaltabilecek, maliyetleri optimize ederken performans ve güvenilirliği en üst düzeye çıkarabileceksiniz.
Otomatik Ölçeklendirmenin Önemi
Otomatik ölçeklendirme, modern bulut tabanlı uygulamalar ve hizmetler için vazgeçilmez bir özelliktir. GitLab Runner bağlamında, bu yetenek, CI/CD altyapınızın esnekliğini, verimliliğini ve güvenilirliğini önemli ölçüde artırır.
Esneklik ve Maliyet Verimliliği
Yazılım geliştirme projeleri genellikle öngörülemeyen iş yükü dalgalanmaları yaşar. Bir gün onlarca pipeline aynı anda çalışırken, diğer gün birkaç tane bile olmayabilir. Statik bir altyapı, ya yoğun zamanlarda yetersiz kalır ya da sakin zamanlarda gereksiz kaynakları boşa harcar. Otomatik ölçeklendirme ile:
* Yük Dalgalanmalarına Adaptasyon: Pipeline iş yükü arttığında, sistem otomatik olarak yeni Runner örnekleri (DigitalOcean Droplet’leri) oluşturarak işlerin hızlı bir şekilde tamamlanmasını sağlar. İş yükü azaldığında ise gereksiz Droplet’leri otomatik olarak kapatır.
* Kaynakların Verimli Kullanımı: Yalnızca ihtiyaç duyulan kadar kaynak kullanılır, bu da bulut sağlayıcınıza (DigitalOcean) ödediğiniz maliyetleri önemli ölçüde düşürür. Gereksiz Droplet’ler çalışmadığı için boşta kalan kaynak maliyeti oluşmaz.
Performans ve Güvenilirlik
CI/CD süreçlerinin performansı, geliştirme hızını ve ürünün pazara çıkış süresini doğrudan etkiler. Otomatik ölçeklendirme, bu performansı ve süreçlerin güvenilirliğini artırır:
* Darboğazları Önleme: Yoğun iş yükü altında bile, yeterli sayıda Runner örneği oluşturularak pipeline’ların kuyrukta bekleme süresi minimuma indirilir. Bu, geliştiricilerin geri bildirimleri daha hızlı almasını ve sorunları daha erken tespit etmesini sağlar.
* Kesintisiz Çalışma: Herhangi bir Runner örneğinde meydana gelebilecek bir sorun, otomatik ölçeklendirme sayesinde diğer Droplet’ler tarafından telafi edilebilir. Yeni Droplet’ler hızla devreye alınarak CI/CD akışının kesintisiz devam etmesi sağlanır.
Bakım Kolaylığı
Manuel olarak CI/CD altyapısını yönetmek, özellikle büyük ekipler ve projeler için zaman alıcı ve hataya açık bir süreçtir. Otomatik ölçeklendirme, altyapının kendi kendini yönetmesini sağlayarak operasyonel yükü azaltır:
* Otomatik Altyapı Yönetimi: Geliştiricilerin veya DevOps mühendislerinin sürekli olarak Runner kapasitesini izlemesine ve ayarlamasına gerek kalmaz. Sistem, tanımlanan kurallara göre otomatik olarak hareket eder.
* Güncel ve Temiz Ortamlar: Her yeni CI/CD işi için sıfırdan oluşturulan bir Droplet, temiz ve tutarlı bir ortam sağlar. Bu, bağımlılık çakışmalarını veya önceki işlerden kalan artıkları ortadan kaldırır.
GitLab Runner ve Otomatik Ölçeklendirme Mimarisi
GitLab Runner, GitLab CI/CD’nin kalbinde yer alan ve pipeline işlerini yürüten temel bileşendir. Otomatik ölçeklendirme yeteneği, Runner’ın özel bir yapılandırma ile bulut sağlayıcılarla entegre olmasıyla mümkün olur.
GitLab Runner Nedir?
GitLab Runner, GitLab CI/CD pipeline’larında tanımlanan işleri (job) yürüten hafif bir ajandır. Farklı yürütme ortamlarını (executor) destekler:
* Shell: İşleri Runner’ın kurulu olduğu sunucuda doğrudan çalıştırır.
* Docker: İşleri Docker konteynerleri içinde çalıştırır. Her iş için yeni bir konteyner başlatılır.
* Docker Machine: İşleri dinamik olarak oluşturulan sanal makinelerde (VM) veya bulut sunucularında (DigitalOcean Droplet’leri gibi) Docker konteynerleri içinde çalıştırır. Otomatik ölçeklendirme için bu executor kullanılır.
* Kubernetes: İşleri Kubernetes kümesi içinde pod’lar olarak çalıştırır.
* VirtualBox, Parallels, SSH, Custom: Diğer özel veya sanallaştırma ortamları için.
Otomatik ölçeklendirme senaryomuzda, GitLab Runner’ı DigitalOcean üzerinde “docker+machine” executor’ı ile yapılandıracağız. Bu, Runner’ın DigitalOcean API’sini kullanarak CI/CD işleri için anında yeni Droplet’ler oluşturmasını ve işler tamamlandığında bunları silmesini sağlayacaktır.
Otomatik Ölçeklendirme Mekanizması
GitLab Runner’ın “docker+machine” executor’ı, arka planda Docker Machine aracını kullanır. Docker Machine, farklı bulut sağlayıcılarında (AWS, GCP, Azure, DigitalOcean vb.) veya sanallaştırma platformlarında (VirtualBox gibi) Docker ana bilgisayarları oluşturmak için kullanılan bir araçtır.
DigitalOcean entegrasyonu için, GitLab Runner’a DigitalOcean API token’ı ve SSH anahtarı sağlamamız gerekir. Runner, bu kimlik bilgileriyle DigitalOcean API’sine bağlanarak şunları yapar:
1. İş Yükü İzleme: Runner, bekleyen CI/CD işlerinin sayısını izler.
2. Droplet Oluşturma: Belirlenen eşiklerin (örneğin, belirli bir sayıda boşta Runner örneği olmadığında veya bekleyen iş sayısı arttığında) aşılması durumunda, Runner DigitalOcean’da yeni bir Droplet oluşturur. Bu Droplet, Docker kurulu ve GitLab Runner’ın kontrol edebileceği şekilde yapılandırılır.
3. İş Yürütme: Yeni Droplet hazır olduğunda, bekleyen CI/CD işlerinden birini bu Droplet üzerindeki bir Docker konteynerinde başlatır.
4. Droplet Silme: Bir Droplet belirli bir süre (idle_time) boşta kaldığında veya üzerinde tanımlanan maksimum iş sayısını (max_builds) tamamladığında, Runner bu Droplet’i otomatik olarak siler. Bu, maliyetlerin kontrol altında tutulmasını sağlar.
Bu mekanizma, config.toml dosyasında yapılan yapılandırmalarla yönetilir. Bu dosyadaki anahtar ayarlar şunlardır:
* concurrent: Aynı anda kaç işin paralel olarak çalışabileceğini belirler.
* limit: Bir Runner’ın aynı anda kaç işi işleyebileceğini sınırlar.
* IdleCount: Belirlenen sayıda boşta (idle) Droplet’in her zaman hazırda beklemesini sağlar.
* IdleTime: Bir Droplet’in silinmeden önce ne kadar süre boşta kalabileceğini belirler.
* MaxBuilds: Bir Droplet’in ömrü boyunca kaç işi çalıştırabileceğini belirler. Bu sayıya ulaşıldığında Droplet silinir ve yenisi oluşturulur, bu da ortamın tazeliğini korur.
* OffPeak: Belirli zaman dilimlerinde (örneğin, mesai saatleri dışında) farklı IdleTime ve IdleCount değerleri tanımlayarak maliyet optimizasyonu sağlar.
DigitalOcean Hesabı Hazırlığı
GitLab Runner’ın DigitalOcean üzerinde Droplet’ler oluşturabilmesi ve yönetebilmesi için bazı ön hazırlıkların yapılması gerekmektedir.
API Token Oluşturma
GitLab Runner’ın DigitalOcean hesabınıza programatik olarak erişebilmesi için bir API token’ına ihtiyacı vardır. Bu token, Runner’a Droplet oluşturma, silme, listeleme gibi yetkiler verir.
1. DigitalOcean Kontrol Paneline Giriş Yapın: Tarayıcınızdan DigitalOcean hesabınıza giriş yapın.
2. API Bölümüne Gidin: Sol menüden “API” seçeneğine tıklayın.
3. Yeni Token Oluşturun: “Tokens/Keys” sekmesi altında “Generate New Token” düğmesine tıklayın.
4. Token Detaylarını Girin:
* Token Name: Anlamlı bir isim verin (örn: gitlab-runner-autoscaling-token).
* Select Scopes: “Read” ve “Write” izinlerinin her ikisini de seçtiğinizden emin olun. “Write” izni, Runner’ın Droplet oluşturabilmesi ve silebilmesi için gereklidir.
5. Token’ı Kopyalayın: “Generate Token” düğmesine tıkladıktan sonra size gösterilen token’ı kopyalayın. Bu token yalnızca bir kez gösterilecektir. Kaybettiğiniz takdirde yenisini oluşturmanız gerekir. Bu token’ı güvenli bir yerde saklayın, çünkü DigitalOcean hesabınıza tam erişim sağlar.
SSH Anahtar Çifti Oluşturma ve DigitalOcean’a Ekleme
GitLab Runner, oluşturduğu Droplet’lere SSH üzerinden bağlanarak Docker’ı kurar ve CI/CD işlerini yürütür. Bu bağlantı için bir SSH anahtar çifti gereklidir.
1. SSH Anahtar Çifti Oluşturun:
* Runner’ı kuracağınız sunucuda veya yerel makinenizde bir terminal açın.
* Aşağıdaki komutu çalıştırın:
ssh-keygen -t rsa -b 4096 -C "gitlab-runner-key"
* Anahtar dosyasını kaydedeceğiniz yeri ve parolasını soracaktır. Varsayılan konumu (~/.ssh/id_rsa) kabul edebilir ve parola belirlemeyebilirsiniz (bu, otomatik işlemler için daha uygundur, ancak güvenlik risklerini göz önünde bulundurun).
* Bu işlem sonunda iki dosya oluşacaktır: id_rsa (özel anahtar) ve id_rsa.pub (genel anahtar).
2. Genel Anahtarı Kopyalayın:
* Genel anahtarınızın içeriğini kopyalayın:
cat ~/.ssh/id_rsa.pub
3. Genel Anahtarı DigitalOcean’a Ekleyin:
* DigitalOcean kontrol paneline geri dönün.
* Sol menüden “Settings” (Ayarlar) seçeneğine tıklayın.
* “Security” (Güvenlik) sekmesine gidin.
* “SSH keys” bölümünde “Add SSH Key” düğmesine tıklayın.
* Name: Anahtarınıza anlamlı bir isim verin (örn: gitlab-runner-ssh-key).
* SSH Public Key: Kopyaladığınız genel anahtar içeriğini buraya yapıştırın.
* “Add SSH Key” düğmesine tıklayarak anahtarı ekleyin.
Bu anahtar çifti, Runner’ın oluşturacağı tüm Droplet’lere otomatik olarak eklenecektir.
GitLab Runner Kurulumu ve Yapılandırması
Şimdi GitLab Runner’ı DigitalOcean’da Droplet’leri yönetecek olan “kontrol Droplet’ine” kurma ve yapılandırma zamanı.
GitLab Runner Kurulumu
Otomatik ölçeklenen Droplet’leri yönetecek olan GitLab Runner’ın kendisi de bir DigitalOcean Droplet’inde çalışmalıdır. Bu Droplet’in çok güçlü olmasına gerek yoktur; küçük bir boyutu (örn: Basic, 1GB RAM, 1vCPU) yeterli olacaktır. Ubuntu işletim sistemini tercih edebilirsiniz.
1. Kontrol Droplet’ini Oluşturun: DigitalOcean kontrol panelinden yeni bir Droplet oluşturun ve SSH ile bağlanın.
2. GitLab Runner Deposunu Ekleyin:
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash
3. GitLab Runner’ı Kurun:
sudo apt-get update
sudo apt-get install gitlab-runner
Bu komutlar, GitLab Runner’ı sunucunuza kuracak ve bir sistem hizmeti olarak başlatacaktır.
GitLab Runner Kaydı (Registration)
Kurulumdan sonra Runner’ı GitLab instance’ınıza kaydetmeniz gerekir. Bu adımda, Runner’ın hangi GitLab projesi veya grubuyla ilişkilendirileceğini ve hangi executor’ı kullanacağını belirtiriz.
1. Kayıt Komutunu Çalıştırın:
sudo gitlab-runner register
2. Soruları Yanıtlayın:
* Please enter the GitLab instance URL (e.g. https://gitlab.com/):
* Kendi GitLab URL’nizi girin (örn: https://gitlab.com veya kendi kurduğunuz instance’ın adresi).
* Please enter the registration token:
* GitLab projeniz veya grubunuzun “Settings > CI/CD > Runners” bölümünde bulabileceğiniz kayıt token’ını girin.
* Please enter a description for the runner:
* Runner için bir açıklama girin (örn: DigitalOcean Autoscaled Runner).
* Please enter tags for the runner (comma-separated):
* Bu Runner’ın hangi işleri alacağını belirlemek için etiketler girin (örn: digitalocean, autoscaled, docker). Bu etiketleri .gitlab-ci.yml dosyanızda kullanacaksınız.
* Please enter the executor: shell, docker, docker-autoscaling, docker-ssh, docker+machine, docker-ssh+machine, kubernetes, custom:
* docker+machine yazın. Bu, otomatik ölçeklendirme için DigitalOcean ile entegrasyonu sağlayacak executor’dır.
* Please enter the default Docker image (e.g. ruby:2.7):
* CI/CD işleriniz için varsayılan bir Docker imajı belirleyin (örn: ubuntu:latest veya alpine/git). Bu, .gitlab-ci.yml dosyasında özel bir imaj belirtilmediğinde kullanılacaktır.
* Please enter the DigitalOcean region (e.g. nyc3):
* Droplet’lerin oluşturulmasını istediğiniz DigitalOcean bölgesini girin (örn: fra1, nyc3, ams3).
* Please enter the DigitalOcean droplet size (e.g. s-1vcpu-1gb):
* Oluşturulacak Droplet’lerin boyutunu girin (örn: s-1vcpu-2gb). İş yükünüze uygun bir boyut seçin.
* Please enter the DigitalOcean image (e.g. ubuntu-20-04-x64):
* Kullanılacak Droplet imajını girin (örn: ubuntu-22-04-x64).
* Please enter the DigitalOcean SSH key name (e.g. my-ssh-key):
* Daha önce DigitalOcean’a eklediğiniz SSH anahtarınızın adını girin (örn: gitlab-runner-ssh-key).
* Please enter the DigitalOcean API access token:
* Daha önce oluşturduğunuz DigitalOcean API token’ını buraya yapıştırın.
Bu adımları tamamladığınızda, Runner GitLab’a kaydedilecek ve temel bir config.toml dosyası oluşturulacaktır.
config.toml Dosyasının Yapılandırılması
Otomatik ölçeklendirme ayarlarının çoğu /etc/gitlab-runner/config.toml dosyasında yapılır. Bu dosyayı bir metin düzenleyici ile açın (sudo nano /etc/gitlab-runner/config.toml).
Örnek bir config.toml dosyası şu şekilde görünecektir:
concurrent = 10 # Aynı anda çalışabilecek maksimum iş sayısı
[[runners]]
name = "DigitalOcean Autoscaled Runner"
url = "https://gitlab.com/" # Kendi GitLab URL'niz
token = "YOUR_RUNNER_TOKEN" # Kayıt sırasında verilen token
executor = "docker+machine"
limit = 5 # Bu runner'ın aynı anda işleyebileceği maksimum iş sayısı
[runners.docker]
tls_verify = false
image = "ubuntu:latest" # Varsayılan Docker imajı
privileged = false # Güvenlik için false olarak bırakın, sadece gerektiğinde true yapın
disable_cache = false
volumes = ["/cache"] # Önbellekleme için volume
shm_size = 0
[runners.machine]
IdleCount = 1 # Her zaman hazırda bekleyecek boşta Droplet sayısı
IdleTime = 600 # Bir Droplet'in silinmeden önce boşta kalabileceği saniye cinsinden süre (10 dakika)
MaxBuilds = 10 # Bir Droplet'in ömrü boyunca işleyebileceği maksimum iş sayısı
MachineDriver = "digitalocean"
MachineName = "gitlab-runner-%s" # Oluşturulacak Droplet'lerin isim şablonu (örn: gitlab-runner-12345)
MachineOptions = [
"digitalocean-image=ubuntu-22-04-x64", # Kullanılacak DigitalOcean imajı
"digitalocean-region=fra1", # Droplet'lerin oluşturulacağı bölge
"digitalocean-size=s-1vcpu-2gb", # Droplet boyutu
"digitalocean-ssh-user=root", # Droplet'e bağlanmak için SSH kullanıcısı
"digitalocean-ssh-key-path=/root/.ssh/id_rsa", # SSH özel anahtarının yolu (kontrol Droplet'i üzerinde)
"digitalocean-access-token=YOUR_DIGITALOCEAN_API_TOKEN", # DigitalOcean API token'ı
"digitalocean-private-networking=true", # Özel ağ kullanımı (isteğe bağlı)
"digitalocean-tags=gitlab-runner,autoscaled", # Droplet'lere eklenecek etiketler (isteğe bağlı)
"digitalocean-monitoring=true" # DigitalOcean monitoring özelliğini etkinleştir (isteğe bağlı)
# "digitalocean-user-data=./init-script.sh" # Başlangıçta çalıştırılacak script (isteğe bağlı)
]
# [runners.machine.autoscaling]
# Periods = [" 9-17 mon-fri"] # Mesai saatleri (UTC)
# IdleCount = 2
# IdleTime = 300 # Mesai saatlerinde daha hızlı ölçeklenmesi için
#
# [runners.machine.autoscaling]
# Periods = [" sat,sun", " 0-8,18-23 * mon-fri"] # Mesai dışı saatler
# IdleCount = 0
# IdleTime = 1800 # Mesai dışı saatlerde daha yavaş ölçeklenmesi için
Önemli Ayarların Açıklaması:
* concurrent (Global): GitLab Runner’ın aynı anda toplamda kaç CI/CD işini işleyebileceğini belirler. Bu değer, tüm Runner’lar genelinde bir üst sınırdır.
* limit (Runner Başına): Bu özel [[runners]] tanımının aynı anda kaç işi işleyebileceğini sınırlar. concurrent değerinden büyük olamaz.
* [runners.docker]:
* image: Oluşturulan Droplet’lerdeki Docker konteynerlerinde kullanılacak varsayılan Docker imajı.
* privileged: true olarak ayarlanırsa, konteynerler daha fazla yetkiye sahip olur. Genellikle güvenlik nedeniyle false bırakılması önerilir.
* [runners.machine]:
* IdleCount: Her zaman hazırda bekleyecek minimum boşta Droplet sayısı. Bu, yeni bir iş geldiğinde hemen başlatılabilen hazır Droplet’lerin olmasını sağlar.
* IdleTime: Bir Droplet’in silinmeden önce ne kadar süre boşta kalabileceğini (saniye cinsinden) belirler. Bu süre dolduğunda ve Droplet üzerinde iş yoksa silinir.
* MaxBuilds: Bir Droplet’in ömrü boyunca çalıştırabileceği maksimum iş sayısı. Bu sayıya ulaşıldığında, Droplet silinir ve yeni işler için yeni bir Droplet oluşturulur. Bu, Droplet’lerin “kirlenmesini” önler.
* MachineDriver: digitalocean olarak ayarlanmalıdır.
* MachineName: Oluşturulacak Droplet’lerin adlandırma şablonu. %s kısmı, Docker Machine tarafından otomatik olarak bir ID ile değiştirilir.
* MachineOptions: DigitalOcean’a özel yapılandırma seçenekleri listesi. Bunlar, Droplet’in nasıl oluşturulacağını (imaj, bölge, boyut vb.) ve Runner’ın Droplet’e nasıl erişeceğini (SSH anahtarı, API token’ı) belirler.
* digitalocean-ssh-key-path: Kontrol Droplet’i üzerindeki SSH özel anahtarınızın tam yolu. /root/.ssh/id_rsa olarak ayarladığınızdan emin olun, çünkü GitLab Runner genellikle root kullanıcısı altında çalışır.
* digitalocean-user-data: İsteğe bağlı olarak, yeni oluşturulan Droplet’lerde başlangıçta çalıştırılacak bir cloud-init script’i belirtebilirsiniz. Bu, ek yazılımları kurmak veya özel yapılandırmalar yapmak için kullanışlıdır.
* [runners.machine.autoscaling] (OffPeak): Belirli zaman dilimlerinde farklı IdleCount ve IdleTime değerleri tanımlamanıza olanak tanır. Bu, maliyetleri daha da optimize etmek için harika bir yoldur. Örneğin, mesai saatleri dışında IdleCount‘ı düşürüp IdleTime‘ı artırabilirsiniz.
config.toml dosyasını düzenledikten sonra kaydedin ve GitLab Runner hizmetini yeniden başlatın:
sudo gitlab-runner restart
Bu, yeni yapılandırmanın etkin olmasını sağlayacaktır.
Otomatik Ölçeklendirmeyi Test Etme
Yapılandırmanızın doğru çalıştığından emin olmak için basit bir CI/CD pipeline’ı oluşturup tetikleyelim ve DigitalOcean kontrol panelinden Droplet oluşumunu gözlemleyelim.
Basit Bir GitLab CI/CD Pipeline Oluşturma
GitLab projenizin kök dizininde .gitlab-ci.yml adında bir dosya oluşturun veya mevcut dosyanızı düzenleyin:
stages:
- build
- deploy
build_job:
stage: build
script:
- echo "Building application..."
- apt-get update -y && apt-get install -y curl # Örnek: Bir paket kur
- curl -sL https://deb.nodesource.com/setup_16.x | bash - # Örnek: Node.js kur
- apt-get install -y nodejs
- node -v
- sleep 120 # Uzun süren bir build'i simüle et
tags:
- digitalocean # Runner kaydederken verdiğiniz etiketlerden biri
- autoscaled # Runner kaydederken verdiğiniz etiketlerden biri
deploy_job:
stage: deploy
script:
- echo "Deploying application..."
- sleep 60 # Dağıtımı simüle et
tags:
- digitalocean
- autoscaled
Bu örnek pipeline:
* build ve deploy olmak üzere iki aşamaya sahiptir.
* Her aşamada basit echo komutları ve sleep komutları, işlerin biraz zaman almasını sağlamak için kullanılmıştır.
* tags bölümünde, Runner kaydederken verdiğiniz etiketleri kullandığınızdan emin olun. Bu etiketler, GitLab’ın bu işleri otomatik ölçeklenen Runner’ınıza atamasını sağlar.
Pipeline’ı Çalıştırma ve Droplet Oluşumunu Gözlemleme
1. Değişiklikleri Push Edin: .gitlab-ci.yml dosyasını GitLab projenize commit edin ve push edin. Bu, otomatik olarak bir pipeline tetikleyecektir.
2. GitLab UI’dan Takip Edin: GitLab projenizin “CI/CD > Pipelines” bölümüne gidin. Yeni pipeline’ınızın çalıştığını göreceksiniz. İlk başta işler “pending” (beklemede) durumunda olabilir.
3. DigitalOcean Kontrol Panelini Gözlemleyin: Ayrı bir tarayıcı sekmesinde DigitalOcean kontrol panelinizdeki “Droplets” bölümüne gidin.
* Birkaç dakika içinde, gitlab-runner-XXXXX adında yeni Droplet’lerin oluşmaya başladığını görmelisiniz.
* Bu Droplet’ler hazırlandıkça, GitLab’daki işler “running” (çalışıyor) durumuna geçecektir.
* Birden fazla işi aynı anda tetikleyerek (concurrent ve limit ayarlarınıza bağlı olarak), birden fazla Droplet’in aynı anda oluştuğunu gözlemleyebilirsiniz.
4. İşlerin Tamamlanmasını Bekleyin: Pipeline’daki tüm işler tamamlandığında, Droplet’lerin IdleTime ve MaxBuilds ayarlarınıza göre belirli bir süre sonra otomatik olarak silindiğini göreceksiniz.
Ek Kontrol Komutları (Kontrol Droplet’inde):
* GitLab Runner durumunu kontrol etme:
sudo gitlab-runner status
* Kayıtlı Runner’ları listeleme:
sudo gitlab-runner list
* Docker Machine tarafından yönetilen makineleri listeleme:
docker-machine ls
Bu komut, Docker Machine’in hangi Droplet’leri yönettiğini ve durumlarını (Running, Stopped, Provisioning vb.) gösterecektir.
Bu test süreci, otomatik ölçeklendirme yapılandırmanızın beklendiği gibi çalıştığını doğrulamak için kritik öneme sahiptir.
En İyi Uygulamalar ve İpuçları
GitLab Runner ile otomatik ölçeklendirmeyi DigitalOcean üzerinde uygularken, güvenliği, performansı ve maliyet verimliliğini sağlamak için bazı en iyi uygulamaları göz önünde bulundurmak önemlidir.
Güvenlik
* API Token’ı Yönetimi: DigitalOcean API token’ınız, hesabınıza tam erişim sağlar. Bu token’ı asla genel depolarda paylaşmayın ve Runner’ın config.toml dosyasında saklarken dosya izinlerinin doğru ayarlandığından emin olun (chmod 600 /etc/gitlab-runner/config.toml). Mümkünse, token’ı bir sır yönetimi çözümünde (HashiCorp Vault gibi) tutun ve Runner’ın bu sırra erişmesini sağlayın.
* SSH Anahtarları: SSH özel anahtarınızı da aynı şekilde koruyun. digitalocean-ssh-key-path yolu, Runner’ın çalıştırıldığı kullanıcının erişebileceği bir konumda olmalı ve doğru izinlere sahip olmalıdır.
* Firewall Kuralları: DigitalOcean Droplet’leriniz için güvenlik duvarı kurallarını dikkatlice yapılandırın. Yalnızca gerekli portlara (örneğin, GitLab ile iletişimi sağlamak için 443 veya 80) izin verin.
* privileged Modu: runners.docker altındaki privileged = true ayarı, Docker konteynerine çok geniş yetkiler verir ve güvenlik riskleri taşır. Yalnızca gerçekten gerekli olduğunda kullanın ve risklerini anladığınızdan emin olun.
* Runner Kontrol Droplet’i Güvenliği: Otomatik ölçeklenen Droplet’leri yöneten kontrol Droplet’inin kendisi de güvende olmalıdır. Düzenli güncellemeler yapın, gereksiz servisleri kapatın ve güçlü parolalar/SSH anahtarları kullanın.
Performans ve Maliyet Optimizasyonu
* IdleTime ve IdleCount Optimizasyonu: Bu ayarlar, maliyet ve performans arasındaki dengeyi sağlar.
* Düşük IdleTime, Düşük IdleCount: Maliyetleri düşürür ancak yeni işler için Droplet’lerin başlatılmasını beklemek zorunda kalabilirsiniz.
* Yüksek IdleTime, Yüksek IdleCount: İşler daha hızlı başlar ancak boşta kalan Droplet’ler için daha fazla ödeme yaparsınız.
* İş yükü kalıplarınızı analiz ederek projenize en uygun değerleri bulun.
* Doğru Droplet Boyutu (digitalocean-size): CI/CD işlerinizin gereksinimlerine uygun Droplet boyutunu seçin. Çok küçük bir boyut işleri yavaşlatırken, çok büyük bir boyut gereksiz maliyetlere yol açar. CPU yoğun işler için daha fazla vCPU, bellek yoğun işler için daha fazla RAM içeren boyutları tercih edin.
* OffPeak Ayarları: Mesai saatleri dışında veya hafta sonları gibi düşük iş yükü dönemlerinde IdleCount‘ı düşürmek ve IdleTime‘ı artırmak için OffPeak ayarlarını kullanın. Bu, önemli ölçüde maliyet tasarrufu sağlayabilir.
* Önbellekleme (cache): GitLab CI/CD’nin önbellekleme özelliğini kullanarak pipeline’lar arasındaki bağımlılıkları ve ara sonuçları depolayabilirsiniz. Bu, her işin sıfırdan başlamasını engelleyerek iş sürelerini kısaltır ve performans artırır. config.toml dosyasındaki [runners.cache] bölümünü yapılandırmayı unutmayın. DigitalOcean Spaces gibi bir S3 uyumlu depolama hizmetini önbellek depolama alanı olarak kullanabilirsiniz.
* Önceden Kurulmuş İmajlar: digitalocean-image olarak, CI/CD işlerinizin temel bağımlılıklarını (örneğin, Node.js, Python, Java) içeren özel bir imaj kullanabilirsiniz. Bu, her Droplet başlatıldığında bu bağımlılıkların yeniden kurulmasını önleyerek iş başlatma sürelerini hızlandırır.
* MaxBuilds Ayarı: MaxBuilds değeri, Droplet’lerin belirli sayıda işten sonra yenilenmesini sağlar. Bu, Droplet’lerin “kirlenmesini” önler ve tutarlı bir ortam sağlar. Çok yüksek bir değer, bir Droplet’in uzun süre çalışmasına neden olabilirken, çok düşük bir değer sık sık Droplet oluşturma/silme döngülerine yol açabilir.
Hata Ayıklama ve İzleme
* GitLab Runner Logları: Runner kontrol Droplet’inde /var/log/gitlab-runner/runner.log dosyasını düzenli olarak kontrol edin. Bu loglar, Runner’ın DigitalOcean API ile iletişiminde veya Droplet oluşturma/silme işlemlerinde oluşan hataları içerir.
* DigitalOcean Droplet Logları: Oluşturulan Droplet’lerdeki sistem loglarını (örn: /var/log/syslog, cloud-init.log) kontrol edin. Özellikle digitalocean-user-data ile bir başlangıç script’i kullanıyorsanız, bu script’in doğru çalıştığından emin olmak için logları inceleyin.
* GitLab CI/CD Pipeline Logları: GitLab UI’daki pipeline ve iş logları, CI/CD işlerinin neden başarısız olduğunu anlamak için ilk başvurulacak yerdir.
* DigitalOcean Monitoring: DigitalOcean’ın yerleşik izleme araçlarını kullanarak Droplet’lerin CPU, RAM, disk ve ağ kullanımını takip edin. Bu, otomatik ölçeklendirme ayarlarınızı optimize etmenize yardımcı olabilir.
* docker-machine ls: Runner kontrol Droplet’inde bu komutu düzenli olarak çalıştırarak Docker Machine’in yönettiği Droplet’lerin durumunu kontrol edin.
Sürüm Yönetimi
* config.toml Dosyası: config.toml dosyanızı bir versiyon kontrol sisteminde (GitLab projenizin kendisi gibi) saklayın. Bu, yapılandırma değişikliklerini izlemenizi, geri almanızı ve ekip üyeleri arasında paylaşmanızı sağlar. Hassas bilgileri (API token’ları gibi) doğrudan dosyada tutmak yerine, GitLab CI/CD değişkenleri veya güvenli sır yönetimi çözümleri kullanmayı düşünün.
* Runner İmajları: GitLab Runner’ı ve Docker imajlarını düzenli olarak güncelleyin. Bu, güvenlik yamalarını almanızı ve yeni özelliklerden yararlanmanızı sağlar.
Sonuç
GitLab Continuous Deployment süreçlerinizi DigitalOcean üzerinde GitLab Runner ile otomatik ölçeklendirmek, modern yazılım geliştirme yaklaşımlarının temel bir bileşenidir. Bu makalede ele aldığımız adımları ve en iyi uygulamaları takip ederek, CI/CD altyapınızı dinamik, maliyet-etkin ve yüksek performanslı bir hale getirebilirsiniz.
Otomatik ölçeklendirme sayesinde, yoğun iş yükü dönemlerinde bile pipeline’larınızın hızlı ve kesintisiz çalışmasını sağlayabilir, aynı zamanda düşük iş yükü zamanlarında gereksiz kaynak maliyetlerinden kaçınabilirsiniz. DigitalOcean’ın esnek bulut altyapısı ve GitLab Runner’ın güçlü otomatik ölçeklendirme yetenekleri birleştiğinde, geliştirme ekipleriniz daha verimli çalışabilir, yazılımlarınızı daha hızlı teslim edebilir ve nihayetinde daha rekabetçi ürünler ortaya çıkarabilir. Bu rehber, sağlam ve otomatik ölçeklenen bir CI/CD ortamı kurmak için size gerekli tüm araçları ve bilgiyi sunmaktadır. Artık bu çözümü kendi projelerinizde hayata geçirmeye hazırsınız.