Takip et

GitLab ve DigitalOcean Yönetilen Kubernetes ile CI/CD Hattı Oluşturma

GitLab ve DigitalOcean Yönetilen Kubernetes ile CI/CD Hattı Oluşturma Giriş Günümüzün hızla değişen yazılım geliştirme dünyasında, uy

GitLab ve DigitalOcean Yönetilen Kubernetes ile CI/CD Hattı Oluşturma

Giriş

Günümüzün hızla değişen yazılım geliştirme dünyasında, uygulamaları hızlı, güvenilir ve tekrarlanabilir bir şekilde dağıtabilmek kritik bir başarı faktörüdür. Sürekli Entegrasyon (CI) ve Sürekli Dağıtım (CD) pratikleri, bu hedefe ulaşmanın temelini oluşturur. Bu makalede, açık kaynaklı ve güçlü bir DevOps platformu olan GitLab’ı kullanarak, bulut tabanlı ve yönetilen bir Kubernetes hizmeti olan DigitalOcean Managed Kubernetes (DOKS) üzerinde otomatik bir CI/CD hattı nasıl oluşturulacağını adım adım inceleyeceğiz. Bu entegrasyon, geliştiricilere kodlarını hızlı bir şekilde test etme, konteynerleştirme ve üretim ortamına dağıtma yeteneği sunarak, geliştirme süreçlerini büyük ölçüde hızlandırır ve operasyonel yükü azaltır.

CI/CD Nedir?

Sürekli Entegrasyon (Continuous Integration – CI), geliştiricilerin kod değişikliklerini düzenli olarak merkezi bir depoya entegre etmelerini gerektiren bir yazılım geliştirme uygulamasıdır. Her entegrasyon, otomatik bir derleme ve test süreci tarafından doğrulanır. Bu, hataların erken tespit edilmesini sağlar, entegrasyon sorunlarını azaltır ve daha tutarlı bir kod tabanı oluşturur.

Sürekli Dağıtım (Continuous Deployment – CD), CI’nın bir uzantısıdır ve tüm testleri başarıyla geçen kod değişikliklerinin otomatik olarak üretim ortamına dağıtılmasını sağlar. Bu, manuel müdahaleyi ortadan kaldırır ve yazılımın müşterilere çok daha hızlı ulaşmasını sağlar. Sürekli Teslimat (Continuous Delivery) ise, üretim ortamına otomatik dağıtım yerine, insan onayına tabi tutularak dağıtıma hazır hale getirilmesi anlamına gelir; CD, Sürekli Teslimat’ın tam otomasyonlu halidir.

GitLab ve DigitalOcean Kubernetes’in Gücü

GitLab, kod depolama, sürüm kontrolü, proje yönetimi, CI/CD, güvenlik taraması ve daha fazlasını tek bir platformda sunan kapsamlı bir DevOps aracıdır. Entegre CI/CD motoru sayesinde, .gitlab-ci.yml dosyası aracılığıyla esnek ve güçlü otomasyon hatları oluşturmak mümkündür.

DigitalOcean Managed Kubernetes (DOKS), DigitalOcean’ın sunduğu, Kubernetes kümelerini yönetmeyi kolaylaştıran bir hizmettir. DOKS ile altyapı yönetimi yükünü DigitalOcean’a bırakarak, uygulamalarınızı ölçeklenebilir ve yüksek erişilebilir bir ortamda çalıştırmaya odaklanabilirsiniz. Otomatik yükseltmeler, yedeklemeler ve kolay ölçekleme gibi özellikler, DOKS’u geliştiriciler için cazip bir seçenek haline getirir.

Bu makalede, bir örnek uygulamayı Docker kullanarak konteynerleştirecek, GitLab Container Registry’ye itecek ve ardından Kubernetes manifestleri aracılığıyla DOKS kümesinde dağıtmak için bir GitLab CI/CD hattı oluşturacağız.

Ön Koşullar

Bu makaledeki adımları takip edebilmek için aşağıdaki ön koşullara sahip olmanız gerekmektedir:

* GitLab Hesabı: Bir GitLab hesabına sahip olmanız ve yeni bir proje oluşturma yetkiniz olması.
* DigitalOcean Hesabı: Bir DigitalOcean hesabına sahip olmanız ve Kubernetes kümesi oluşturma yetkiniz olması.
* Temel Docker Bilgisi: Dockerfile oluşturma ve Docker imajları ile çalışma konusunda temel bilgi.
* Temel Kubernetes Bilgisi: Kubernetes kavramları (Pod, Deployment, Service, Namespace) hakkında temel bilgi.
* kubectl Yüklü Olması: Kubernetes kümeleriyle etkileşim kurmak için komut satırı aracı.
* doctl Yüklü Olması (İsteğe Bağlı ama Önerilir): DigitalOcean API ile etkileşim kurmak için komut satırı aracı.
* Yerel Geliştirme Ortamı: Uygulamanızı geliştirmek ve Docker imajlarını yerel olarak test etmek için uygun bir ortam (Node.js, Python, Go vb. kurulu).

DigitalOcean Kubernetes (DOKS) Kümesi Oluşturma

Uygulamamızı dağıtacağımız temel altyapı, DigitalOcean Kubernetes kümesidir. Bu bölüm, bir DOKS kümesi oluşturma ve kubectl aracılığıyla ona bağlanma adımlarını kapsar.

DigitalOcean Hesap Oluşturma ve API Anahtarı

Eğer bir DigitalOcean hesabınız yoksa, öncelikle bir hesap oluşturmanız gerekmektedir. CI/CD hattımızın DigitalOcean kaynaklarıyla etkileşim kurabilmesi için bir API anahtarı oluşturmamız gerekecek.
1. DigitalOcean kontrol paneline giriş yapın.
2. Sol menüden “API” bölümüne gidin.
3. “Tokens/Keys” sekmesinde “Generate New Token” butonuna tıklayın.
4. Token’a bir isim verin (örn. gitlab-ci-token) ve “Read” ile “Write” izinlerini verin.
5. Oluşturulan token’ı kopyalayın. Bu token’ı daha sonra GitLab CI/CD ortam değişkenlerinde kullanacağız. Bu token’ı güvende tutun ve kimseyle paylaşmayın.

DOKS Kümesi Kurulumu

DOKS kümenizi DigitalOcean kontrol paneli veya doctl komut satırı aracı aracılığıyla oluşturabilirsiniz. Kontrol panelini kullanmak daha görsel ve kolaydır.

Kontrol Paneli Üzerinden:
1. DigitalOcean kontrol paneline giriş yapın.
2. Sol menüden “Kubernetes” seçeneğine tıklayın.
3. “Create Kubernetes Cluster” butonuna tıklayın.
4. Kümenizin özelliklerini yapılandırın:
* Kubernetes Version: En son stabil sürümü seçmeniz önerilir.
* Region: Uygulamanızın kullanıcılarına en yakın bölgeyi seçin.
* Node Pool: Kümenizin düğümlerinin boyutunu ve sayısını belirleyin. Geliştirme veya küçük projeler için daha küçük ve az sayıda düğümle başlayabilirsiniz (örn. 2 vCPU, 4 GB RAM, 2 düğüm).
* Cluster Name: Kümenize anlamlı bir isim verin (örn. gitlab-ci-cd-cluster).
5. “Create Cluster” butonuna tıklayarak kümenizi oluşturun. Kümenin oluşturulması birkaç dakika sürebilir.

doctl Komut Satırı Üzerinden (API anahtarınızı yapılandırdıktan sonra):

doctl auth init # Bu komutla API anahtarınızı yapılandırın
doctl kubernetes cluster create gitlab-ci-cd-cluster \
  --region nyc1 \
  --version 1.28.2-do.0 \
  --node-pool name=worker-pool,size=s-2vcpu-4gb,count=2

Bu komut, nyc1 bölgesinde gitlab-ci-cd-cluster adında, 1.28.2 Kubernetes sürümüne sahip ve s-2vcpu-4gb boyutunda iki adet düğüm içeren bir küme oluşturur.

kubectl ile Kümenize Bağlanma

Kümeniz oluşturulduktan sonra, yerel makinenizden kubectl aracını kullanarak kümenize bağlanmanız gerekir.
1. DigitalOcean kontrol panelinde, oluşturduğunuz Kubernetes kümesinin detay sayfasına gidin.
2. “Actions” menüsünden “Download Config File” seçeneğine tıklayın. Bu, kubeconfig.yaml dosyasını indirecektir.
3. İndirdiğiniz dosyayı ~/.kube/config dosyasıyla birleştirin veya ayrı bir dosya olarak kaydedip KUBECONFIG ortam değişkenini ayarlayın:

mkdir -p ~/.kube
    mv path/to/your/kubeconfig.yaml ~/.kube/config-gitlab-ci-cd
    export KUBECONFIG=~/.kube/config-gitlab-ci-cd:$KUBECONFIG # Mevcut config'lerinizle birleştirin

4. Bağlantıyı test etmek için aşağıdaki komutu çalıştırın:

kubectl get nodes

Bu komut, kümenizdeki düğümleri listelemelidir. Eğer düğümleri görüyorsanız, kubectl başarıyla yapılandırılmıştır.

ÖNEMLİ: Bu kubeconfig dosyası, kümenize tam erişim sağlar. Bu dosyayı güvende tutmanız ve daha sonra GitLab CI/CD ortam değişkenlerinde kullanmak üzere base64 ile kodlanmış halini almanız gerekecektir.

Uygulamayı Konteynerleştirme (Docker)

CI/CD hattımızın ilk adımı, uygulamamızı bir Docker imajı haline getirmektir. Bu, uygulamanın tüm bağımlılıklarıyla birlikte taşınabilir ve izole bir ortamda çalışmasını sağlar. Örnek olarak, basit bir Node.js uygulamasını konteynerleştirelim.

Dockerfile Oluşturma

Uygulama dizininizin kök dizininde Dockerfile adında bir dosya oluşturun:

# Node.js için resmi bir temel imaj kullan
FROM node:18-alpine

Çalışma dizinini ayarla

WORKDIR /app

package.json ve package-lock.json dosyalarını kopyala

Bağımlılıkları önbelleğe almak için bu adımı ayrı yapın

COPY package*.json ./

Bağımlılıkları yükle

RUN npm install

Uygulama kaynak kodunu kopyala

COPY . .

Uygulamanın dinleyeceği portu açığa çıkar

EXPOSE 3000

Uygulamayı başlatma komutu

CMD [ "node", "server.js" ]

Örnek server.js dosyası:

const http = require('http');

const hostname = '0.0.0.0';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Merhaba Dunya! Bu benim GitLab CI/CD uygulamam.\n');
});

server.listen(port, hostname, () => {
  console.log(Sunucu http://${hostname}:${port}/ adresinde calisiyor);
});

Örnek package.json dosyası:

{
  "name": "my-node-app",
  "version": "1.0.0",
  "description": "A simple Node.js app for GitLab CI/CD",
  "main": "server.js",
  "scripts": {
    "start": "node server.js"
  },
  "dependencies": {
    "express": "^4.18.2"
  },
  "author": "",
  "license": "ISC"
}

Yerel Olarak Docker İmajını Test Etme

Dockerfile’ınızı oluşturduktan sonra, yerel makinenizde imajı derleyip çalıştırarak uygulamanızın konteyner içinde doğru çalıştığından emin olun.

1. Uygulama dizininizde terminali açın.
2. Docker imajını derleyin:

docker build -t my-node-app:latest .

3. Derlenen imajı çalıştırın:

docker run -p 8080:3000 my-node-app:latest

4. Tarayıcınızda http://localhost:8080 adresine giderek uygulamanın çalıştığını doğrulayın.

GitLab Projesi Kurulumu

Uygulama kodumuzu ve CI/CD yapılandırmamızı GitLab’da barındıracağız.

Yeni Bir GitLab Projesi Oluşturma

1. GitLab hesabınıza giriş yapın.
2. Sol menüden “Projects” > “Your projects” yolunu izleyin veya doğrudan sağ üstteki “New project” butonuna tıklayın.
3. “Create blank project” seçeneğini seçin.
4. Projenize bir isim verin (örn. gitlab-doks-ci-cd).
5. Görünürlük seviyesini (Public, Internal, Private) seçin.
6. “Create project” butonuna tıklayın.

Uygulama Kodunu GitLab’a Yükleme

Yerel uygulama kodunuzu yeni oluşturduğunuz GitLab projesine push edin.

# Yerel Git deposu başlatma (eğer henüz yapmadıysanız)
git init

Dosyaları ekle

git add .

İlk commit'i yap

git commit -m "Initial commit of Node.js app"

GitLab projenizin URL'sini uzak depo olarak ekle

git remote add origin https://gitlab.com/your-username/gitlab-doks-ci-cd.git # Kendi URL'nizle değiştirin

Kodu GitLab'a push et

git push -u origin master

Artık uygulama kodunuz GitLab’da barındırılıyor.

GitLab Container Registry Kullanımı

GitLab, her projeye entegre bir Container Registry (Docker Registry) sunar. Bu, Docker imajlarınızı depolamak ve yönetmek için harici bir hizmete ihtiyaç duymadan GitLab içinde kalmanızı sağlar.

Container Registry’nin Önemi

CI/CD hattımızda Docker imajları oluşturduktan sonra, bu imajları Kubernetes kümemizin erişebileceği bir yere depolamamız gerekir. GitLab Container Registry, bu amaç için idealdir. İmajları burada depolayarak, Kubernetes Deployment manifestlerimizde doğrudan GitLab Registry’den çekebiliriz. Bu, güvenlik ve entegrasyon açısından büyük avantaj sağlar.

Kimlik Doğrulama ve İmaj Yükleme

GitLab CI/CD hattımız, GitLab Container Registry’ye kimlik doğrulaması yaparak imajları yükleyecektir. CI/CD işleri, varsayılan olarak CI_REGISTRY_USER (genellikle gitlab-ci-token) ve CI_REGISTRY_PASSWORD (işe özel token) ortam değişkenleri aracılığıyla Registry’ye erişim sağlar.

Bir imajı GitLab Container Registry’ye yüklemek için, önce docker login komutuyla kimlik doğrulaması yapmanız ve ardından docker push komutunu kullanmanız gerekir. CI/CD hattımızda bu adımlar otomatik olarak gerçekleştirilecektir.

GitLab Container Registry adresi genellikle registry.gitlab.com/your-username/your-project-name şeklindedir. GitLab CI/CD içinde bu adres CI_REGISTRY ve CI_REGISTRY_IMAGE değişkenleriyle otomatik olarak sağlanır.

Kubernetes Dağıtım Manifestleri Oluşturma

Uygulamamızı Kubernetes kümesinde dağıtmak için Kubernetes manifest dosyaları (YAML) oluşturmamız gerekir. Bu dosyalar, uygulamanızın nasıl çalıştırılacağını, nasıl erişileceğini ve nasıl ölçekleneceğini tanımlar. Uygulama kodunuzun kök dizininde .k8s adında bir dizin oluşturup manifest dosyalarını buraya yerleştirebilirsiniz.

Namespace Tanımlama (İsteğe Bağlı ama Önerilir)

Uygulamalarınızı izole etmek ve kaynakları daha iyi yönetmek için bir Namespace oluşturmak iyi bir pratiktir.
.k8s/namespace.yaml:

apiVersion: v1
kind: Namespace
metadata:
  name: my-app-namespace

Deployment Manifesti

Deployment, uygulamanızın Pod’larını yönetir ve bunların kümenizde istenen durumda çalışmasını sağlar.
.k8s/deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-node-app-deployment
  namespace: my-app-namespace # Namespace belirtin
  labels:
    app: my-node-app
spec:
  replicas: 2 # Uygulamanızın 2 kopyasını çalıştırın
  selector:
    matchLabels:
      app: my-node-app
  template:
    metadata:
      labels:
        app: my-node-app
    spec:
      containers:
      - name: my-node-app
        image: registry.gitlab.com/your-username/gitlab-doks-ci-cd:latest # CI/CD ile güncellenecek
        ports:
        - containerPort: 3000
        resources: # Kaynak limitleri ve istekleri tanımlayın (iyi bir pratik)
          requests:
            memory: "64Mi"
            cpu: "100m"
          limits:
            memory: "128Mi"
            cpu: "200m"

ÖNEMLİ: image alanını kendi GitLab Container Registry adresinizle güncelleyin. CI/CD hattı bu latest etiketi yerine commit SHA veya dinamik bir etiket kullanacaktır.

Service Manifesti

Service, Pod’larınıza ağ erişimi sağlar. Dışarıdan erişim için NodePort veya LoadBalancer tipi bir Service kullanabiliriz. DOKS üzerinde LoadBalancer tipi kullanmak, DigitalOcean’ın otomatik olarak bir Load Balancer sağlamasını ve uygulamanıza dışarıdan bir IP adresi atamasını sağlar.
.k8s/service.yaml:

apiVersion: v1
kind: Service
metadata:
  name: my-node-app-service
  namespace: my-app-namespace
  labels:
    app: my-node-app
spec:
  selector:
    app: my-node-app
  type: LoadBalancer # Dışarıdan erişim için DigitalOcean Load Balancer sağlar
  ports:
    - protocol: TCP
      port: 80 # Servisin dinleyeceği port
      targetPort: 3000 # Pod'un dinlediği port

Ingress Manifesti (İsteğe Bağlı)

Daha gelişmiş yönlendirme, SSL sonlandırma ve birden fazla servisi tek bir alan adı altında yönetmek için Ingress kullanabilirsiniz. Ingress kullanabilmek için kümenizde bir Ingress Controller (örn. Nginx Ingress Controller) kurulu olması gerekir. Bu kurulum DigitalOcean’da genellikle tek tıkla yapılabilir veya manuel olarak eklenebilir. Bu makalede LoadBalancer Service kullanacağımız için Ingress’i atlayabiliriz, ancak üretim ortamları için Ingress daha esnek bir çözümdür.

GitLab CI/CD Pipeline (.gitlab-ci.yml) Yapılandırması

Bu bölüm, projemizin kök dizininde .gitlab-ci.yml dosyasını oluşturarak CI/CD hattımızı tanımlayacağımız en kritik kısımdır. Bu dosya, GitLab Runner’ların hangi adımları hangi sırada gerçekleştireceğini belirler.

Pipeline Aşamaları (Stages)

CI/CD hattımızı mantıksal aşamalara ayırmak, süreci daha anlaşılır ve yönetilebilir kılar. Genellikle build, test ve deploy aşamaları kullanılır.

stages:
  - build
  - deploy

Build Aşaması: Docker İmajı Oluşturma ve Yükleme

Bu aşamada, uygulama kodumuzdan bir Docker imajı oluşturacak ve bunu GitLab Container Registry’ye yükleyeceğiz. docker:dind (Docker-in-Docker) hizmetini kullanarak bir Docker ortamı sağlarız.

build-image:
  stage: build
  image: docker:latest # Bu iş için Docker CLI içeren bir imaj kullan
  services:
    - docker:dind # Docker-in-Docker hizmetini etkinleştir
  variables:
    DOCKER_HOST: tcp://docker:2375 # DIND servisine bağlanmak için
    DOCKER_TLS_CERTDIR: "" # TLS'i devre dışı bırak (güvenli değil, sadece örnek için)
    # Production ortamında TLS kullanmalı ve DOCKER_TLS_CERTDIR'i yapılandırmalısınız
  before_script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  script:
    - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA .
    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
    - docker tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA $CI_REGISTRY_IMAGE:latest # latest etiketini de güncelleyin
    - docker push $CI_REGISTRY_IMAGE:latest
  rules:
    - if: $CI_COMMIT_BRANCH == "master" # Sadece master branch'ine yapılan push'larda çalıştır

Açıklama:
* image: docker:latest: Bu işin çalışacağı Docker imajını belirtir.
* services: - docker:dind: İş içinde Docker komutlarını çalıştırabilmek için bir Docker daemon’ı sağlar.
* variables: DOCKER_HOST ve DOCKER_TLS_CERTDIR DIND servisiyle iletişim kurmak için ayarlanır.
* before_script: GitLab Container Registry’ye kimlik doğrulaması yapar. $CI_REGISTRY_USER ve $CI_REGISTRY_PASSWORD GitLab tarafından otomatik olarak sağlanan gizli değişkenlerdir.
* script:
* docker build: Uygulamamızın Dockerfile’ından bir imaj derler. $CI_REGISTRY_IMAGE değişkeni GitLab Registry’deki projemizin imaj yolunu içerir (örn. registry.gitlab.com/your-username/your-project). $CI_COMMIT_SHORT_SHA ise mevcut commit’in kısa SHA değeridir ve imajı benzersiz bir şekilde etiketlemek için kullanılır.
* docker push: Derlenen imajı GitLab Container Registry’ye yükler.
* docker tag: latest etiketini de mevcut imaja işaret edecek şekilde günceller.
* docker push: latest etiketli imajı da yükler.
* rules: Bu işin ne zaman çalışacağını belirler. Burada sadece master (veya main) dalına yapılan commit’lerde çalışması sağlanmıştır.

Deploy Aşaması: Kubernetes’e Dağıtım

Bu aşamada, oluşturduğumuz Docker imajını Kubernetes kümemize dağıtacağız. Bunun için kubectl komutlarını kullanacağız.

deploy-to-kubernetes:
  stage: deploy
  image: bitnami/kubectl:latest # kubectl aracı içeren bir imaj kullan
  before_script:
    # Kubeconfig dosyasını base64'ten çözerek geçici bir dosyaya yaz
    - echo $KUBECONFIG_BASE64 | base64 -d > kubeconfig.yaml
    - export KUBECONFIG=$(pwd)/kubeconfig.yaml # kubectl'in bu dosyayı kullanmasını sağla
    - kubectl config use-context $(kubectl config get-contexts -o name | grep -E 'gitlab-ci-cd-cluster|do-nyc1-gitlab-ci-cd-cluster' | head -n 1) # Kümenizin context adını dinamik olarak bulmaya çalışır
    - kubectl get nodes # Bağlantıyı test etmek için
  script:
    # Namespace oluştur (eğer yoksa)
    - kubectl apply -f .k8s/namespace.yaml || true # Hata verirse devam et
    # Deployment manifestindeki imaj etiketini güncelle
    - sed -i "s|image: registry.gitlab.com/your-username/gitlab-doks-ci-cd:latest|image: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA|g" .k8s/deployment.yaml
    # Kubernetes manifestlerini uygula
    - kubectl apply -f .k8s/
  rules:
    - if: $CI_COMMIT_BRANCH == "master"
  environment:
    name: production
    url: http://my-node-app-service.my-app-namespace.svc.cluster.local # Bu URL küme içi erişim için, dışarıdan erişim için LoadBalancer IP'sini kullanın

Açıklama:
* image: bitnami/kubectl:latest: kubectl aracını içeren bir Docker imajı kullanır.
* before_script:
* KUBECONFIG_BASE64 adında bir GitLab CI/CD ortam değişkeni tanımlayacağız. Bu değişken, base64 ile kodlanmış Kubernetes kubeconfig dosyamızı içerecek. Burada bu değişkeni çözüp geçici bir dosyaya yazarız.
* export KUBECONFIG: kubectl‘in bu geçici dosyayı kullanmasını sağlar.
* kubectl config use-context: Kümenizin doğru context’ini seçer. DigitalOcean’da context adı genellikle do-bölge-kümeadı formatındadır.
* kubectl get nodes: Küme bağlantısının başarılı olup olmadığını kontrol eder.
* script:
* kubectl apply -f .k8s/namespace.yaml || true: Namespace’i oluşturur. Eğer zaten varsa hata vermesini engellemek için || true eklenmiştir.
* sed -i "s|...|...|g" .k8s/deployment.yaml: Bu komut, deployment.yaml dosyasındaki Docker imaj etiketini dinamik olarak, build aşamasında oluşturduğumuz ve $CI_COMMIT_SHORT_SHA ile etiketlediğimiz imajla günceller. your-username/gitlab-doks-ci-cd kısmını kendi projenizin yoluyla güncellemeyi unutmayın!
* kubectl apply -f .k8s/: .k8s dizinindeki tüm manifest dosyalarını Kubernetes kümesine uygular. Bu, Deployment ve Service’i oluşturur veya günceller.
* rules: Sadece master dalına yapılan push’larda çalışır.
* environment: GitLab UI’da dağıtımın hangi ortama yapıldığını ve ilgili URL’yi gösterir.

GitLab CI/CD Ortam Değişkenleri ve Gizlilik Yönetimi

CI/CD hattımızın güvenli bir şekilde çalışabilmesi için hassas bilgileri (kubeconfig, Docker kimlik bilgileri vb.) ortam değişkenleri olarak saklamamız gerekir. GitLab, bunu “Settings” > “CI/CD” > “Variables” altında yönetmenize olanak tanır.

Gerekli Değişkenler:

1. KUBECONFIG_BASE64:
* Değer: DigitalOcean kümenizden indirdiğiniz kubeconfig.yaml dosyasının base64 ile kodlanmış hali.

base64 -w 0 ~/.kube/config-gitlab-ci-cd # macOS/Linux için
        # veya PowerShell'de: [System.Convert]::ToBase64String([System.IO.File]::ReadAllBytes("C:\path\to\kubeconfig.yaml"))

* Tip: File (önerilir) veya Variable
* Masked: Evet (gizli tutmak için)
* Protected: Evet (sadece korumalı dallar ve etiketler için)

2. DOCKER_USERNAME ve DOCKER_PASSWORD: GitLab Container Registry’ye manuel olarak login olmanız gerekirse kullanabilirsiniz, ancak $CI_REGISTRY_USER ve $CI_REGISTRY_PASSWORD genellikle yeterlidir. Eğer harici bir registry kullanıyorsanız bu değişkenleri tanımlamanız gerekir.

Bu değişkenleri GitLab projenizin “Settings” > “CI/CD” > “Variables” bölümüne eklemeyi unutmayın. KUBECONFIG_BASE64 değişkenini kesinlikle Masked olarak işaretleyin.

CI/CD Pipeline’ı Test Etme

Tüm yapılandırmaları tamamladıktan sonra, CI/CD hattımızın beklendiği gibi çalışıp çalışmadığını test etme zamanı.

Değişiklikleri Push Etme

.gitlab-ci.yml ve .k8s dizinindeki manifest dosyalarını GitLab projenize push edin:

git add .gitlab-ci.yml .k8s/
git commit -m "Add GitLab CI/CD pipeline and Kubernetes manifests"
git push origin master # Veya hangi dalı kullanıyorsanız

Bu push işlemi, GitLab’da otomatik olarak bir pipeline tetikleyecektir.

Pipeline Çalışmasını İzleme

1. GitLab projenize gidin.
2. Sol menüden “CI/CD” > “Pipelines” seçeneğine tıklayın.
3. Yeni tetiklenen pipeline’ı göreceksiniz. Üzerine tıklayarak detaylarına gidin.
4. Pipeline’daki her bir işin (build-image, deploy-to-kubernetes) durumunu ve günlüklerini (logs) izleyebilirsiniz. Herhangi bir hata durumunda, günlükler sorunu tespit etmenize yardımcı olacaktır.

Uygulamanın Doğrulanması

Pipeline başarıyla tamamlandığında, uygulamanız DigitalOcean Kubernetes kümenize dağıtılmış olmalıdır.

1. Kubernetes Pod’larını kontrol edin:

kubectl get pods -n my-app-namespace

İki adet my-node-app-deployment Pod’unun Running durumda olduğunu görmelisiniz.

2. Kubernetes Service’i kontrol edin:

kubectl get svc -n my-app-namespace

my-node-app-service adında bir Service göreceksiniz. EXTERNAL-IP sütununda bir IP adresi atanmış olmalıdır. Bu IP adresi, DigitalOcean Load Balancer tarafından sağlanan genel IP’dir. IP’nin atanması birkaç dakika sürebilir.

3. Uygulamaya Tarayıcıdan Erişin:
kubectl get svc komutundan aldığınız EXTERNAL-IP adresini tarayıcınızda açın. Uygulamanızın “Merhaba Dunya! Bu benim GitLab CI/CD uygulamam.” mesajını göstermesi gerekir.

Tebrikler! GitLab ve DigitalOcean Kubernetes kullanarak tam otomatik bir CI/CD hattı oluşturdunuz. Artık master dalına yaptığınız her kod değişikliği otomatik olarak derlenecek, konteynerleştirilecek ve Kubernetes kümenize dağıtılacaktır.

İleri Seviye Konular ve En İyi Uygulamalar

Kurduğumuz temel CI/CD hattı harika bir başlangıç noktasıdır, ancak gerçek dünya uygulamaları için dikkate alınması gereken birçok ileri seviye konu ve en iyi uygulama bulunmaktadır.

Ortam Bazlı Dağıtımlar (Staging, Production)

Genellikle uygulamaları doğrudan üretim ortamına dağıtmadan önce bir hazırlık (staging) ortamında test etmek istenir. GitLab CI/CD, farklı dallara (örn. develop için staging, master için production) veya manuel tetiklemelere dayalı olarak farklı dağıtım işleri tanımlamanıza olanak tanır.

* rules veya only/except anahtar kelimeleri: Farklı dallar için farklı dağıtım işleri tanımlayın.
* GitLab Environments: GitLab, dağıtımlarınızı ortamlara göre düzenlemenizi sağlar. Bu, hangi sürümün hangi ortamda çalıştığını takip etmeyi kolaylaştırır.
* Kubernetes Namespaces: Her ortam için ayrı Kubernetes Namespace’leri kullanmak, kaynak izolasyonu ve yönetimi sağlar.

Geri Alma (Rollback) Stratejileri

Yeni bir dağıtımın sorunlara yol açması durumunda, hızlı bir şekilde önceki stabil sürüme geri dönebilmek kritik öneme sahiptir. Kubernetes Deployment’ları, yerleşik geri alma yeteneklerine sahiptir:

kubectl rollout undo deployment/my-node-app-deployment -n my-app-namespace

CI/CD hattınıza manuel veya otomatik bir geri alma adımı ekleyebilirsiniz.

Helm Charts ile Dağıtımı Yönetme

Uygulamalarınız büyüdükçe ve Kubernetes manifestleriniz karmaşıklaştıkça, Helm Charts kullanmak dağıtımı basitleştirir. Helm, Kubernetes uygulamaları için bir paket yöneticisidir.

* Şablonlama: Helm, manifest dosyalarınızı şablonlamanıza olanak tanır, böylece farklı ortamlar için değerleri kolayca değiştirebilirsiniz.
* Sürümleme: Uygulamanızın dağıtımlarını sürümleyebilir ve kolayca geri alabilirsiniz.
* Bağımlılık Yönetimi: Birden fazla Kubernetes kaynağını tek bir paket olarak yönetmenizi sağlar.

Helm kullanmak için CI/CD hattınızdaki kubectl apply adımlarını helm upgrade --install komutlarıyla değiştirmeniz gerekir.

İzleme ve Günlükleme (Monitoring & Logging)

Dağıtılan uygulamalarınızın sağlığını ve performansını sürekli izlemek önemlidir.

* DigitalOcean Monitoring: DOKS, düğüm metrikleri ve bazı temel Pod metrikleri için DigitalOcean izlemesiyle entegredir.
* Prometheus ve Grafana: Kubernetes için endüstri standardı izleme araçlarıdır. Kümenize kurularak detaylı metrikler toplayabilir ve görselleştirebilirsiniz.
* Elastic Stack (ELK) veya Loki: Uygulama günlüklerini toplamak, depolamak ve analiz etmek için kullanılabilir.

Otomatik Ölçekleme (Autoscaling)

Uygulamanızın trafiği değiştikçe, kaynakları otomatik olarak ayarlamak maliyetleri optimize eder ve performansı artırır.

* Horizontal Pod Autoscaler (HPA): Pod’larınızın CPU veya bellek kullanımına göre otomatik olarak ölçeklenmesini sağlar.
* Cluster Autoscaler: Düğüm kaynakları yetersiz kaldığında kümenize otomatik olarak yeni düğümler ekler (DOKS bunu otomatik olarak yönetir, ancak yapılandırma gerekebilir).

Sonuç

Bu makalede, GitLab ve DigitalOcean Managed Kubernetes’i bir araya getirerek güçlü ve otomatik bir CI/CD hattı oluşturmayı adım adım öğrendik. Uygulamamızı konteynerleştirdik, GitLab Container Registry’ye ittik ve Kubernetes manifestleri aracılığıyla DOKS kümemize dağıttık. Bu süreç, geliştirme hızını artırır, insan hatasını azaltır ve uygulamaların daha hızlı ve güvenilir bir şekilde müşterilere ulaşmasını sağlar.

Kurduğumuz bu temel hattı, ileri seviye konuları ve en iyi uygulamaları (ortam bazlı dağıtımlar, Helm, izleme, otomatik ölçekleme) entegre ederek daha da geliştirebilirsiniz. DevOps yolculuğunuzda bu entegrasyon, modern bulut tabanlı uygulama dağıtımının temel taşlarından birini oluşturacaktır. Bu altyapı ile, kodunuzu yazmaya ve yenilik yapmaya odaklanırken, dağıtım süreçlerinizin sorunsuz ve otomatik bir şekilde ilerlediğinden emin olabilirsiniz.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.