İçerik
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.
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:
- Ç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.
- Ö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.
- 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.
- 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.
- 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.
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.
Bucket’ımız üzerinde dosyalarımız da oluşmuş.
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