Bugün GitOps'un prensiplerinden, modellerinden ve bu modellerin OpenShift platformunda nasıl uygulandığından bahsedeceğiz. Bu konuyla ilgili etkileşimli bir kılavuz mevcuttur
Özetle GitOps, altyapı ve uygulama yapılandırmalarını yönetmek için Git çekme isteklerini kullanmaya yönelik bir dizi uygulamadır. GitOps'taki Git deposu, sistemin durumu hakkında tek bir bilgi kaynağı olarak kabul edilir ve bu durumdaki herhangi bir değişiklik tamamen izlenebilir ve denetlenebilir.
GitOps'ta değişiklik izleme fikri kesinlikle yeni değildir; bu yaklaşım, uygulama kaynak koduyla çalışırken neredeyse evrensel olarak uzun süredir kullanılmaktadır. GitOps, altyapı ve uygulama konfigürasyon yönetiminde benzer özellikleri (incelemeler, çekme istekleri, etiketler vb.) basitçe uygular ve kaynak kodu yönetiminde olduğu gibi benzer faydalar sağlar.
GitOps için akademik bir tanım veya onaylanmış kurallar dizisi yoktur; yalnızca bu uygulamanın üzerine inşa edildiği bir dizi ilke vardır:
- Sistemin bildirimsel açıklaması Git deposunda saklanır (yapılandırmalar, izleme vb.).
- Durum değişiklikleri çekme istekleri yoluyla yapılır.
- Çalışan sistemlerin durumu, Git push istekleri kullanılarak depodaki verilerle uyumlu hale getirilir.
GitOps İlkeleri
- Sistem tanımları kaynak kodu olarak tanımlanır
Sistem yapılandırması kod olarak ele alınır, böylece tek bir gerçek kaynak olarak hizmet veren Git deposunda saklanabilir ve otomatik olarak sürümü oluşturulabilir. Bu yaklaşım, sistemlerdeki değişikliklerin kullanıma sunulmasını ve geri alınmasını kolaylaştırır.
- Sistemlerin istenen durumu ve konfigürasyonu Git'te ayarlanır ve versiyonlanır
Sistemlerin istenen durumunu Git'te depolayıp sürümlendirerek, sistemlerde ve uygulamalarda yapılan değişiklikleri kolayca kullanıma sunabiliyor ve geri alabiliyoruz. Kod sahipliğini kontrol etmek ve orijinalliğini doğrulamak için Git'in güvenlik mekanizmalarını da kullanabiliriz.
- Yapılandırma değişiklikleri çekme istekleri aracılığıyla otomatik olarak uygulanabilir
Git çekme isteklerini kullanarak değişikliklerin depodaki konfigürasyonlara nasıl uygulandığını kolayca kontrol edebiliriz. Örneğin, gözden geçirilmeleri veya CI testlerinden geçmeleri vb. için diğer ekip üyelerine verilebilirler.
Aynı zamanda yönetici yetkilerini sola ve sağa dağıtmaya gerek yoktur. Yapılandırma değişikliklerini gerçekleştirmek için kullanıcıların yalnızca bu yapılandırmaların depolandığı Git deposunda uygun izinlere ihtiyacı vardır.
- Konfigürasyonların kontrolsüz kayması sorununun düzeltilmesi
Sistemin istenen durumu Git deposunda saklandıktan sonra tek yapmamız gereken, sistemin mevcut durumunun istenen durumla eşleşmesini sağlayacak yazılımı bulmaktır. Durum böyle değilse, bu yazılımın - ayarlara bağlı olarak - ya tutarsızlığı kendi başına ortadan kaldırması ya da konfigürasyon sapması hakkında bizi bilgilendirmesi gerekir.
OpenShift için GitOps Modelleri
Küme İçi Kaynak Uzlaştırıcıları
Bu modele göre küme, Git deposundaki Kubernetes kaynaklarını (YAML dosyaları) kümenin gerçek kaynaklarıyla karşılaştırmaktan sorumlu bir denetleyiciye sahiptir. Tutarsızlıklar tespit edilirse kontrolör bildirimler gönderir ve muhtemelen tutarsızlıkları düzeltmek için harekete geçer. Bu GitOps modeli Anthos Config Management ve Weaveworks Flux'ta kullanılır.
Dış Kaynak Uzlaştırıcısı (Push)
Bu model, “Git deposu - Kubernetes kümesi” çiftlerinde kaynakların senkronizasyonundan sorumlu bir veya daha fazla denetleyiciye sahip olduğumuzda, önceki modelin bir varyasyonu olarak düşünülebilir. Buradaki fark, yönetilen her kümenin mutlaka kendi ayrı denetleyicisine sahip olmamasıdır. Git - k8s küme çiftleri genellikle denetleyicinin senkronizasyonu nasıl gerçekleştirmesi gerektiğini tanımlayabilen CRD'ler (özel kaynak tanımları) olarak tanımlanır. Bu modelde denetleyiciler, CRD'de belirtilen Git deposunu yine CRD'de belirtilen Kubernetes küme kaynaklarıyla karşılaştırır ve karşılaştırma sonuçlarına göre uygun eylemleri gerçekleştirir. Özellikle ArgoCD'de bu GitOps modeli kullanılmaktadır.
OpenShift platformunda GitOps
Çok kümeli Kubernetes altyapısının yönetimi
Kubernetes'in yaygınlaşması ve çoklu bulut stratejileri ile uç bilişimin popülerliğinin artmasıyla birlikte müşteri başına ortalama OpenShift kümesi sayısı da artıyor.
Örneğin, uç bilişimi kullanırken, bir müşterinin kümeleri yüzlerce, hatta binlerce olarak dağıtılabilir. Sonuç olarak, genel bulutta ve şirket içinde birçok bağımsız veya koordineli OpenShift kümesini yönetmek zorunda kalıyor.
Bu durumda, özellikle birçok sorunun çözülmesi gerekir:
- Kümelerin aynı durumda olup olmadığını kontrol edin (yapılandırmalar, izleme, depolama vb.)
- Bilinen bir duruma göre kümeleri yeniden oluşturun (veya geri yükleyin).
- Bilinen bir duruma göre yeni kümeler oluşturun.
- Değişiklikleri birden çok OpenShift kümesinde kullanıma sunun.
- Birden çok OpenShift kümesindeki değişiklikleri geri alın.
- Şablonlu konfigürasyonları farklı ortamlara bağlayın.
Uygulama Yapılandırmaları
Uygulamalar, yaşam döngüleri boyunca genellikle bir üretim kümesine ulaşmadan önce bir kümeler zincirinden (geliştirme, aşama vb.) geçer. Ayrıca, kullanılabilirlik ve ölçeklenebilirlik gereksinimleri nedeniyle müşteriler genellikle uygulamaları birden fazla şirket içi kümeye veya genel bulut platformunun birden çok bölgesine dağıtır.
Bu durumda aşağıdaki görevlerin çözülmesi gerekir:
- Uygulamaların (ikili dosyalar, yapılandırmalar vb.) kümeler (geliştirme, aşama vb.) arasında taşınmasını sağlayın.
- Çeşitli OpenShift kümelerinde uygulamalarda (ikili dosyalar, yapılandırmalar vb.) değişiklikler yapın.
- Uygulamalardaki değişiklikleri bilinen önceki bir duruma geri alın.
OpenShift GitOps Kullanım Durumları
1. Git deposundaki değişiklikleri uygulama
Bir küme yöneticisi, OpenShift küme yapılandırmalarını bir Git deposunda saklayabilir ve bunları zahmetsizce yeni kümeler oluşturmak ve bunları Git deposunda depolanan bilinen duruma benzer bir duruma getirmek için otomatik olarak uygulayabilir.
2. Secret Manager ile senkronizasyon
Yönetici aynı zamanda OpenShift gizli nesnelerini bunun için özel olarak oluşturulmuş araçları kullanarak yönetmek amacıyla Vault gibi uygun yazılımlarla senkronize etme yeteneğinden de yararlanacaktır.
3. Drift konfigürasyonlarının kontrolü
Yönetici, yalnızca OpenShift GitOps'un gerçek yapılandırmalar ile depoda belirtilenler arasındaki tutarsızlıkları kendisi belirlemesi ve uyarması durumunda lehte olacaktır, böylece sürüklenmeye hızlı bir şekilde yanıt verebilirler.
4. Yapılandırma sapması ile ilgili bildirimler
Yöneticinin kendi başına hızlı bir şekilde uygun önlemleri almak için yapılandırma sapması durumları hakkında hızlı bir şekilde bilgi edinmek istediği durumlarda faydalıdırlar.
5. Sürüklenirken konfigürasyonların manuel senkronizasyonu
Yöneticinin, yapılandırmada değişiklik olması durumunda OpenShift kümesini Git deposuyla senkronize etmesine ve kümeyi hızlı bir şekilde bilinen önceki bir duruma döndürmesine olanak tanır.
6.Sürüklenirken konfigürasyonların otomatik senkronizasyonu
Yönetici ayrıca OpenShift kümesini bir sapma algılandığında depoyla otomatik olarak senkronize olacak şekilde yapılandırabilir, böylece küme yapılandırması her zaman Git'teki yapılandırmalarla eşleşir.
7. Birkaç küme - bir depo
Yönetici, birkaç farklı OpenShift kümesinin yapılandırmalarını tek bir Git deposunda saklayabilir ve gerektiğinde bunları seçerek uygulayabilir.
8. Küme yapılandırmalarının hiyerarşisi (devralma)
Yönetici, depodaki küme yapılandırmalarının hiyerarşisini ayarlayabilir (kalıtımla aşama, üretim, uygulama portföyü vb.). Başka bir deyişle, konfigürasyonların bir veya daha fazla kümeye uygulanması gerekip gerekmediğini belirleyebilir.
Örneğin, bir yönetici Git deposunda "Üretim kümeleri (üretim) → Sistem X kümeleri → Sistem X'in üretim kümeleri" hiyerarşisini ayarlarsa, sistem X'in üretim kümelerine aşağıdaki yapılandırmaların bir kombinasyonu uygulanır:
- Tüm üretim kümeleri için ortak olan yapılandırmalar.
- System X kümesi için yapılandırmalar.
- X sistemi üretim kümesine ilişkin yapılandırmalar.
9. Şablonlar ve yapılandırma geçersiz kılmaları
Yönetici, örneğin, bunların uygulanacağı belirli kümeler için yapılandırmaya ince ayar yapmak amacıyla, devralınan bir dizi yapılandırmayı ve bunların değerlerini geçersiz kılabilir.
10. Yapılandırmalar ve uygulama yapılandırmaları için seçmeli dahil etme ve hariç tutma
Yönetici, belirli konfigürasyonların belirli özelliklere sahip kümelere uygulanması veya uygulanmaması için koşulları ayarlayabilir.
11. Şablon desteği
Geliştiriciler, her bir uygulama için en uygun formatı kullanmak amacıyla uygulama kaynaklarının nasıl tanımlanacağını (Helm Chart, saf Kubernetes yaml, vb.) seçebilme olanağından yararlanacak.
OpenShift platformundaki GitOps araçları
Argo CD'si
ArgoCD, Harici Kaynak Uzlaştırma modelini uygular ve kümeler ile Git depoları arasındaki bire çok ilişkilerin düzenlenmesi için merkezi bir kullanıcı arayüzü sunar. Bu programın dezavantajları arasında ArgoCD çalışmadığında uygulamaların yönetilememesi yer almaktadır.
Akı
Flux, Küme İçi Kaynak Uzlaştırma modelini uygular ve sonuç olarak, zayıf bir nokta olan tanım deposunun merkezi yönetimi yoktur. Öte yandan, tam da merkezileşme eksikliği nedeniyle, bir küme başarısız olsa bile uygulamaları yönetme yeteneği devam ediyor.
ArgoCD'nin OpenShift'e kurulması
ArgoCD mükemmel bir komut satırı arayüzü ve web konsolu sunar, bu nedenle Flux ve diğer alternatifleri burada ele almayacağız.
ArgoCD'yi OpenShift 4 platformunda dağıtmak için küme yöneticisi olarak şu adımları izleyin:
ArgoCD bileşenlerini OpenShift platformunda dağıtma
# Create a new namespace for ArgoCD components
oc create namespace argocd
# Apply the ArgoCD Install Manifest
oc -n argocd apply -f https://raw.githubusercontent.com/argoproj/argo-cd/v1.2.2/manifests/install.yaml
# Get the ArgoCD Server password
ARGOCD_SERVER_PASSWORD=$(oc -n argocd get pod -l "app.kubernetes.io/name=argocd-server" -o jsonpath='{.items[*].metadata.name}')
ArgoCD Sunucusunun OpenShift Route tarafından görülebilecek şekilde iyileştirilmesi
# Patch ArgoCD Server so no TLS is configured on the server (--insecure)
PATCH='{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"argocd-server"}],"containers":[{"command":["argocd-server","--insecure","--staticassets","/shared/app"],"name":"argocd-server"}]}}}}'
oc -n argocd patch deployment argocd-server -p $PATCH
# Expose the ArgoCD Server using an Edge OpenShift Route so TLS is used for incoming connections
oc -n argocd create route edge argocd-server --service=argocd-server --port=http --insecure-policy=Redirect
ArgoCD Cli Aracını Dağıtma
# Download the argocd binary, place it under /usr/local/bin and give it execution permissions
curl -L https://github.com/argoproj/argo-cd/releases/download/v1.2.2/argocd-linux-amd64 -o /usr/local/bin/argocd
chmod +x /usr/local/bin/argocd
ArgoCD Sunucusu yönetici şifresini değiştirme
# Get ArgoCD Server Route Hostname
ARGOCD_ROUTE=$(oc -n argocd get route argocd-server -o jsonpath='{.spec.host}')
# Login with the current admin password
argocd --insecure --grpc-web login ${ARGOCD_ROUTE}:443 --username admin --password ${ARGOCD_SERVER_PASSWORD}
# Update admin's password
argocd --insecure --grpc-web --server ${ARGOCD_ROUTE}:443 account update-password --current-password ${ARGOCD_SERVER_PASSWORD} --new-password
Bu adımları tamamladıktan sonra ArgoCD WebUI web konsolu veya ArgoCD Cli komut satırı aracı aracılığıyla ArgoCD Sunucusu ile çalışabilirsiniz.
GitOps - Asla Çok Geç Değil
"Tren gitti" - bir şeyler yapma fırsatının kaçırıldığı bir durum hakkında söyledikleri budur. OpenShift söz konusu olduğunda, bu harika yeni platformu hemen kullanmaya başlama arzusu, rotaların, dağıtımların ve diğer OpenShift nesnelerinin yönetimi ve bakımında genellikle tam olarak bu durumu yaratır. Ama şans her zaman tamamen kaybedilir mi?
Konuyla ilgili yazı serimize devam ediyoruz
oc create -f https://raw.githubusercontent.com/openshift/federation-dev/master/labs/lab-4-assets/namespace.yaml
oc create -f https://raw.githubusercontent.com/openshift/federation-dev/master/labs/lab-4-assets/deployment.yaml
oc create -f https://raw.githubusercontent.com/openshift/federation-dev/master/labs/lab-4-assets/service.yaml
oc expose svc/httpd -n simple-app
Yani el yapımı bir uygulamamız var. Artık kullanılabilirlik kaybı olmadan GitOps yönetimi altında aktarılması gerekiyor. Kısaca şunu yapıyor:
- Kod için bir Git deposu oluşturun.
- Mevcut nesnelerimizi dışa aktarıp Git deposuna yüklüyoruz.
- GitOps araçlarını seçme ve dağıtma.
- Depomuzu bu araç setine ekliyoruz.
- Uygulamayı GitOps araç setimizde tanımlıyoruz.
- GitOps araç setini kullanarak uygulamanın bir test çalıştırmasını gerçekleştiriyoruz.
- GitOps araç setini kullanarak nesneleri senkronize ediyoruz.
- Nesnelerin budanmasını ve otomatik senkronizasyonunu etkinleştirin.
Önceki de belirtildiği gibi
Örneğimizde GitHub üzerinde yeni bir genel depo oluşturacağız. İstediğiniz gibi adlandırabilirsiniz, biz blogpost adını kullanıyoruz.
YAML nesne dosyaları yerel olarak veya Git'te saklanmadıysa oc veya kubectl ikili dosyalarını kullanmanız gerekecektir. Aşağıdaki ekran görüntüsünde ad alanımız, dağıtımımız, hizmetimiz ve rotamız için YAML istiyoruz. Bundan önce yeni oluşturulan depoyu ve cd'yi buraya kopyaladık.
oc get namespace simple-app -o yaml --export > namespace.yaml
oc get deployment httpd -o yaml -n simple-app --export > deployment.yaml
oc get service httpd -o yaml -n simple-app --export > service.yaml
oc get route httpd -o yaml -n simple-app --export > route.yaml
Şimdi Argo CD'sinin senkronize edemediği alanı kaldırmak için Distribution.yaml dosyasını düzenleyelim.
sed -i '/sgeneration: .*/d' deployment.yaml
Ayrıca güzergahın da değişmesi gerekiyor. Önce çok satırlı bir değişken belirleyeceğiz ve ardından ingress: null değerini bu değişkenin içeriğiyle değiştireceğiz.
export ROUTE=" ingress:
- conditions:
- status: 'True'
type: Admitted"
sed -i "s/ ingress: null/$ROUTE/g" route.yaml
Böylece dosyaları sıraladık, geriye kalan tek şey onları Git deposuna kaydetmek. Bundan sonra bu depo tek bilgi kaynağı haline gelir ve nesnelerde herhangi bir manuel değişiklik yapılması kesinlikle yasaklanmalıdır.
git commit -am ‘initial commit of objects’
git push origin master
Ayrıca ArgoCD'yi zaten dağıtmış olduğunuz gerçeğinden yola çıkıyoruz (bunun nasıl yapılacağı - önceki bölüme bakın)
argocd repo add https://github.com/cooktheryan/blogpost
Şimdi uygulamayı oluşturalım. Uygulama, GitOps araç setinin hangi depoyu ve yolları kullanacağını, nesneleri yönetmek için hangi OpenShift'e ihtiyaç duyulduğunu, deponun hangi belirli dalına ihtiyaç duyulduğunu ve kaynakların otomatik olarak senkronize edilmesi gerekip gerekmediğini anlaması için değerleri ayarlar.
argocd app create --project default
--name simple-app --repo https://github.com/cooktheryan/blogpost.git
--path . --dest-server https://kubernetes.default.svc
--dest-namespace simple-app --revision master --sync-policy none
Argo CD'sinde bir uygulama belirtildiğinde, araç seti halihazırda konuşlandırılmış nesneleri depodaki tanımlara göre kontrol etmeye başlar. Örneğimizde otomatik senkronizasyon ve temizleme devre dışı olduğundan öğeler henüz değişmedi. Lütfen Argo CD arayüzünde ArgoCD'nin sağladığı bir etiket olmadığından uygulamamızın “Senkronizasyon Dışı” durumuna sahip olacağını unutmayın.
Bu nedenle senkronizasyona biraz sonra başladığımızda nesneler yeniden konuşlandırılmayacaktır.
Şimdi dosyalarımızda hata olmadığından emin olmak için bir test çalıştırması yapalım.
argocd app sync simple-app --dry-run
Hata yoksa senkronizasyona devam edebilirsiniz.
argocd app sync simple-app
Uygulamamız üzerinde argocd get komutunu çalıştırdıktan sonra uygulama durumunun Sağlıklı veya Senkronize olarak değiştiğini görmeliyiz. Bu, Git deposundaki tüm kaynakların artık halihazırda dağıtılmış olan kaynaklara karşılık geldiği anlamına gelecektir.
argocd app get simple-app
Name: simple-app
Project: default
Server: https://kubernetes.default.svc
Namespace: simple-app
URL: https://argocd-server-route-argocd.apps.example.com/applications/simple-app
Repo: https://github.com/cooktheryan/blogpost.git
Target: master
Path: .
Sync Policy: <none>
Sync Status: Synced to master (60e1678)
Health Status: Healthy
...
Artık hiçbir şeyin manuel olarak oluşturulmadığından ve depoda bir nesne oluşturulduğunda veya güncellendiğinde bir dağıtımın gerçekleşeceğinden emin olmak için otomatik senkronizasyonu ve temizlemeyi etkinleştirebilirsiniz.
argocd app set simple-app --sync-policy automated --auto-prune
Böylece başlangıçta hiçbir şekilde GitOps kullanmayan bir uygulamayı GitOps kontrolü altına başarıyla aldık.
Kaynak: habr.com