Spinnaker Nedir?

Spinnaker, büyük ölçekli dağıtılmış sistemlerin hızlı ve güvenli bir şekilde dağıtımını ve güncellemelerini yönetmek için kullanılan açık kaynaklı bir yazılım aracıdır. Genellikle, özellikle bulut tabanlı uygulamaların geliştirilmesi ve dağıtılması için kullanılır.

Spinnaker, çoklu bulut sağlayıcısı desteği sunar ve uygulamaların hızlı ve güvenli bir şekilde dağıtılması, geri alınması ve rulout/rollbacks yapılarak yönetilmesi için gerekli olan otomatikleştirilmiş iş akışlarını sağlar. Ayrıca, farklı ortamlarda (test, önbellek, üretim vb.) aynı uygulamanın birden fazla sürümünü yönetebilir ve uygulamanın güvenliği için kullanılan açık kaynaklı araçlara entegre edilebilir.

Argo ile Spinnaker Farkı Nedir?

Argo ve Spinnaker, büyük ölçekli dağıtılmış sistemlerin yönetimi için açık kaynaklı araçlardır. Her ikisi de, çoklu bulut sağlayıcılarını destekler ve ölçeklenebilir bir şekilde tasarlanmıştır.

Argo, Kubernetes üzerinde çalışan uygulamaların otomatikleştirilmiş iş akışlarını yönetmek için kullanılır. Argo, YAML formatında tanımlanan iş akışları aracılığıyla uygulamaların kurulumu, güncellenmesi ve ölçeklendirilmesi gibi işlemleri otomatikleştirebilir. Argo, genellikle Kubernetes üzerinde çalışan uygulamaların yönetimi için kullanılır.

argocd vs spinnaker

Spinnaker ise, Kubernetes dışındaki platformlarda da çalışabilen, çoklu bulut sağlayıcılarını ve ortamlarını destekleyen bir dağıtım aracıdır. Spinnaker, uygulamaların dağıtımı, güncellenmesi ve geri alınması gibi işlemleri yönetmek için önceden tanımlanmış iş akışları kullanır.

Argo ve Spinnaker arasındaki fark, öncelikle kullanım senaryolarına bağlıdır. Argo, genellikle Kubernetes üzerinde çalışan uygulamaların yönetimi için kullanılırken, Spinnaker, çoklu bulut sağlayıcılarını ve ortamlarını destekleyen daha geniş bir kullanım alanına sahiptir.

Neden Spinnaker?

Spinnaker, büyük ölçekli dağıtılmış sistemlerin yönetimi için birçok avantaj sunar ve bu nedenle tercih edilebilir. İşte Spinnaker’ı tercih etmenin bazı nedenleri:

  1. Çoklu bulut desteği: Spinnaker, çoklu bulut sağlayıcısını destekler ve AWS, Google Cloud, Microsoft Azure ve OpenStack gibi birçok bulut sağlayıcısıyla uyumludur. Bu sayede, farklı bulut sağlayıcılarında çalışan uygulamaların dağıtımını kolaylaştırır.
  2. Ölçeklenebilirlik: Spinnaker, ölçeklenebilir bir mimariye sahiptir ve yüksek yoğunluklu uygulama dağıtımlarını yönetmek için tasarlanmıştır.
  3. Otomatik iş akışları: Spinnaker, otomatik iş akışlarını destekleyen birçok özelliğe sahiptir. Bu özellikler sayesinde uygulamaların dağıtımı, testleri ve doğrulama süreçleri otomatikleştirilebilir ve bu da zaman ve kaynak tasarrufu sağlar.
  4. Hızlı dağıtım: Spinnaker, uygulamaların hızlı bir şekilde dağıtılmasını sağlar. Bu, hızlı geri bildirim döngüleri ve hızlı iterasyonlar için idealdir.
  5. Açık kaynak: Spinnaker, açık kaynaklı bir araçtır ve bu nedenle ücretsiz olarak kullanılabilir. Ayrıca, sürekli gelişim için birçok geliştirici tarafından desteklenir ve düzenli olarak güncellenir.
spinnaker

Tüm bu nedenlerden dolayı, büyük ölçekli dağıtılmış sistemlerin yönetimi için Spinnaker tercih edilebilir bir araçtır.

Google Cloud Üzerine Spinnaker Kurulumu

Halyard Kurulumu

Spinnaker’i dağıtmak için halyard’a ihtiyacımız vardır. Halyard’ı ayrı olarak bir docker container’ı içerisinde kullanacağız. Halyard’ı local makinemize kurabilriiz. Diğer yöntemi ise doğrudan debian/ubuntu işletim sistemine kurmak.

Docker ile kurulum senaryosu

Aşağıdaki komutta eklediğimiz volume kısmını “/Users/sezer.sanlikan/.hal” kendi local dizinize göre değiştirebilirsiniz.

Aynı şekilde .kube volume kısmını da “/Users/sezer.sanlikan/.kube” kendi local dizininize göre değiştirebilirsiniz.

docker run -d -p 8084:8084 -p 9000:9000 \
    --name halyard --restart=always \
    -v /Users/sezer.sanlikan/.hal:/home/spinnaker/.hal \
    -v /Users/sezer.sanlikan/.kube:/home/spinnaker/.kube \
    us-docker.pkg.dev/spinnaker-community/docker/halyard:stable

Container içerisine giriyoruz.

docker exec -it halyard bash

Debian/Ubuntu için Bash script ile kurulum senaryosu

curl -O https://raw.githubusercontent.com/spinnaker/halyard/master/install/debian/InstallHalyard.sh && sudo bash InstallHalyard.sh

Google Cloud Storage (GCS) Ayarlaması

Spinnaker’ı dağıtmak için bir storage’a ihtiyacınız vardır. Mevcutta aşağıdaki seçenekler ile deploy edebilirsiniz;

  azs
    Manage and view Spinnaker configuration for the "azs" persistent store.

  edit
    Edit Spinnaker's persistent storage.

  gcs
    Manage and view Spinnaker configuration for the "gcs" persistent store.

  oracle
    Manage and view Spinnaker configuration for the "oracle" persistent store.

  s3
    Manage and view Spinnaker configuration for the "s3" persistent store.

Biz bu aşamada GCS ile devam edeceğiz. Bu nedenle Google Cloud üzerinde bir bucket oluşturup, ilgili bucket üzerinde yetkili olan bir service account üretiyoruz. Çıkan json dosyasını aşağıdaki şekilde komutla beraber giriyoruz.

Project: Google Cloud üzerinde bucket’ın olduğu proje adı

Json-path: Google Cloud üzerinden aldığınız service account’a ait credentials json dosyası.

Bucket Location: Bucket’ın bulunduğu google cloud üzerindeki lokasyon bilgisi

Bucket: Google Cloud üzerinde oluşturduğunuz Bucket’ın adı.

hal config storage gcs edit \
    --project commons \
    --json-path gcs-credentials.json \
    --bucket-location europe-west3 \
    --bucket spinnaker-common-poc-bucket

Komutu girdikten sonra başarılı olursa aşağıdaki gibi bir çıktı almalıyız.

+ Get current deployment
  Success
+ Get persistent store
  Success
+ Edit persistent store
  Success
Validation in halconfig:

+ Successfully edited persistent store "gcs".

GKE (Google Kubernetes Engine) Ayarlamaları

Google Cloud üzerinde varsayım olarak Google Kubernetes Engine (GKE)’ye sahip olduğunuzu düşünürsek aşağıdaki şekilde adımlara devam ediyoruz.

Öncelikle provider olarak Kubernetes’i set ediyoruz.

hal config provider kubernetes enable

Çıktı aşağıdaki gibi olmalı;

+ Get current deployment
  Success
+ Edit the kubernetes provider
  Success
Validation in halconfig:

+ Successfully enabled kubernetes

Credentials İşlemleri

Ardından Halyard Container’ı ayağa kaldırırken local .kube dizinimizi volume olarak set ettiğimizden local bilgisayarınızda GKE için login olup kube-context’i aktif edin. Dolayısıyla container içerisinde de aynı context’i kullanacağımızdan bir sonraki komutu uygulayabileceğiz. Yine de service account ile login olmak için aşağıdaki komutu localinizden kullanmanız için bırakıyorum.

gcloud auth activate-service-account [email protected] --key-file=xx-credential-service-account.json

Alternatif olarak aşağıdaki şekilde normal hesabınızla da login olabilirsiniz.

gcloud auth login

Ek olarak aşağıdaki plugin’i de kurmanız gerekecektir.

gcloud components install gke-gcloud-auth-plugin

Daha sonra kubecontext’i aktif etmek için aşağıdaki komutları kullanın.

gcloud components install gke-gcloud-auth-plugin
gcloud container clusters get-credentials gke-cluster-name --zone europe-west3-c

Yukarıdaki komut otomatik olarak .kube dizinindeki config’e ilgili context’i ekleyecektir. Aktif olarak kontrol etmek için “kubectl get nodes” gibi bir komut kullanabilirsiniz.

Eğer container içerisinde aşağıdaki hatayı alırsanız;

Unable to connect to the server: getting credentials: exec: fork/exec /usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/bin/gke-gcloud-auth-plugin: no such file or directory

Aşağıdaki komutu çalıştırıp önce gcloud ve gcloud auth plugin’i kuralım container içerisinde.

cd /home/spinnaker/
export USE_GKE_GCLOUD_AUTH_PLUGIN=True
curl https://sdk.cloud.google.com | bash
gcloud components install gke-gcloud-auth-plugin

Daha sonra /home/spinnaker/.kube dizinindeki config dosyamızdaki aşağıdaki kısmı;

cmd-path: /usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/bin/gcloud

Bununla değiştirelim

cmd-path: /home/spinnaker/google-cloud-sdk/bin/gcloud

Bu kısmı;

command: /usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/bin/gke-gcloud-auth-plugin

Bununla değiştirelim.

command: /home/spinnaker/google-cloud-sdk/bin/gke-gcloud-auth-plugin

Artık Halyard container’ı içerisinden kubectl aracılığı ile google kubernetes engine’i yönetebileceğiz.

Halyard Context Ayarı

Credentials işlemlerimizin son aşamasında Halyard cli ile beraber kubernetes context’ini mevcut context’imiz ile set ediyoruz.

hal config provider kubernetes account add gcloud-account \
    --provider-version v2 \
    --context $(kubectl config current-context)

Çıktı aşağıdaki gibi olacaktır.

+ Get current deployment
  Success
+ Add the gcloud-account account
  Success
Validation in halconfig:

+ Successfully added account gcloud-account for provider
  kubernetes.

Spinnaker Deploy to k8s

Son olarak eklediğimiz context account’u set ediyoruz.

hal config deploy edit \
    --type distributed \
    --account-name gcloud-account

Çıktı aşağıdaki gibi olacaktır.

+ Get current deployment
  Success
+ Get the deployment environment
  Success
+ Edit the deployment environment
  Success
Validation in halconfig:

+ Successfully updated your deployment environment.

Artık Spinnaker’ı k8s’e deploy etmek için hazırız.

hal deploy apply

Çıktı aşağıdaki gibi olacaktır.

+ Get current deployment
  Success
+ Prep deployment
  Success
Validation in default.stats:
- INFO Stats are currently ENABLED. Usage statistics are being
  collected. Thank you! These stats inform improvements to the product, and that
  helps the community. To disable, run `hal config stats disable`. To learn more
  about what and how stats data is used, please see
  https://spinnaker.io/docs/community/stay-informed/stats.

Validation in halconfig:

Validation in default.security:

+ Preparation complete... deploying Spinnaker
+ Get current deployment
  Success
+ Apply deployment
  Success
+ Deploy spin-redis
  Success
+ Deploy spin-clouddriver
  Success
+ Deploy spin-front50
  Success
+ Deploy spin-orca
  Success
+ Deploy spin-deck
  Success
+ Deploy spin-echo
  Success
+ Deploy spin-gate
  Success
+ Deploy spin-rosco
  Success
+ Run `hal deploy connect` to connect to Spinnaker.

Podlarımızın durumunu aşağıdaki komut ile bir müddet sonra kontrol edelim.

kubectl get pods --namespace spinnaker

Tüm podlarımızın ayağa kalktığını görüyoruz.

image

Bucket’ımız üzerinde dosyalarımız da oluşmuş.

image 1

Arayüz Erişimi (UI Access) İçin Ingress

Google Cloud üzerinde mevcut bir ingress controller’ınızın olduğunu düşünürsek, aşağıdaki ingress’i kubectl ile ayağa kaldırmanız yeterli olacaktır.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: spinnaker-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
  - host: spinnaker.n11.com
    http:
      paths:
      - path: /deck(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: spin-deck
            port:
              name: http
      - path: /gate(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: spin-gate
            port:
              name: http

Yukarıdaki yaml kodlarını ingress.yaml dosyasına kaydedip aşağıdaki komutu uygulayabilirsiniz.

kubectl apply -f ingress.yaml -n spinnaker