Düzenle

Aracılığıyla paylaş


Mikro hizmet mimarileri için CI/CD

Azure

Daha hızlı sürüm döngüleri, mikro hizmet mimarilerinin başlıca avantajlarından biridir. Ancak iyi bir CI/CD işlemi olmadan mikro hizmetlerin söz verdiği çevikliği elde etmezsiniz. Bu makalede zorluklar açıklanır ve soruna yönelik bazı yaklaşımlar önerilir.

CI/CD nedir?

CI/CD'den bahsettiğimizde, çok sayıda ilgili işlemden bahsediyoruz: Sürekli tümleştirme, sürekli teslim ve sürekli dağıtım.

  • sürekli tümleştirme. Kod değişiklikleri genellikle ana dalda birleştirilir. Otomatik derleme ve test işlemleri, ana daldaki kodun her zaman üretim kalitesinde olmasını sağlar.

  • Sürekli teslim. CI işlemini geçen tüm kod değişiklikleri otomatik olarak üretim benzeri bir ortama yayımlanır. Canlı üretim ortamına dağıtım için el ile onay gerekebilir, ancak aksi takdirde otomatikleştirilmiştir. Hedef, kodunuzun her zaman üretime dağıtılacak hazır olmasıdır.

  • Sürekli dağıtım. Önceki iki adımı geçen kod değişiklikleri üretimotomatik olarak dağıtılır.

Mikro hizmet mimarisi için sağlam bir CI/CD işleminin bazı hedefleri şunlardır:

  • Her ekip, sahip olduğu hizmetleri diğer ekipleri etkilemeden veya kesintiye uğratmadan bağımsız olarak derleyebilir ve dağıtabilir.

  • Hizmetin yeni bir sürümü üretime dağıtılmadan önce doğrulama için geliştirme/test/Soru-Cevap ortamlarına dağıtılır. Kalite kapıları her aşamada uygulanır.

  • Hizmetin yeni bir sürümü, önceki sürümle yan yana dağıtılabilir.

  • Yeterli erişim denetimi ilkeleri var.

  • Kapsayıcılı iş yükleri için üretime dağıtılan kapsayıcı görüntülerine güvenebilirsiniz.

Güçlü bir CI/CD işlem hattı neden önemlidir?

Geleneksel monolitik bir uygulamada, çıktısı uygulama yürütülebilir dosyası olan tek bir derleme işlem hattı vardır. Tüm geliştirme iş akışları bu işlem hattına aktarılır. Yüksek öncelikli bir hata bulunursa, yeni özelliklerin yayımlanmasını geciktirebilecek bir düzeltmenin tümleştirilmesi, test edilmesi ve yayımlanması gerekir. İyi factored modüllerine sahip olarak ve kod değişikliklerinin etkisini en aza indirmek için özellik dallarını kullanarak bu sorunları azaltabilirsiniz. Ancak uygulama daha karmaşık hale geldikçe ve daha fazla özellik eklendikçe, monolit için yayın süreci daha kırılgan hale gelir ve kırılma olasılığı artar.

Mikro hizmetler felsefesine göre, her ekibin sıraya girmeleri gereken uzun bir yayın treni asla olmamalıdır. "A" hizmetini oluşturan ekip, "B" hizmetindeki değişikliklerin birleştirilmesini, test edilmesi ve dağıtılmasını beklemeden herhangi bir zamanda bir güncelleştirme yayınlayabilir.

CI/CD monolith Diyagramı

Yüksek bir yayın hızı elde etmek için, riski en aza indirmek için yayın işlem hattınızın otomatik ve son derece güvenilir olması gerekir. Üretime günde bir veya daha fazla kez yayın yaparsanız regresyonlar veya hizmet kesintileri nadir olmalıdır. Aynı zamanda, hatalı bir güncelleştirme dağıtılırsa, hizmetin önceki bir sürümüne hızla geri dönmek veya ileri gitmek için güvenilir bir yönteme sahip olmanız gerekir.

Zorluklar

  • birçok küçük bağımsız kod temel alır. Her ekip kendi derleme işlem hattı ile kendi hizmetini oluşturmakla sorumludur. Bazı kuruluşlarda ekipler ayrı kod depoları kullanabilir. Ayrı depolar, sistemin nasıl derlendiği bilgisinin ekiplere yayıldığı ve kuruluştaki hiç kimsenin uygulamanın tamamını nasıl dağıtacağını bilmediği bir duruma yol açabilir. Örneğin, yeni bir kümeye hızla dağıtmanız gerekiyorsa olağanüstü durum kurtarma senaryosunda ne olur?

    Azaltma: Bu bilgilerin her ekipte "gizli" olmaması için hizmetleri derlemek ve dağıtmak için birleşik ve otomatik bir işlem hattına sahip olun.

  • Birden çok dil ve çerçeve. Her ekip kendi teknoloji karışımını kullandığında, kuruluş genelinde çalışan tek bir derleme süreci oluşturmak zor olabilir. Derleme süreci, her ekibin dile veya çerçeveye göre uyarlayabilecek kadar esnek olması gerekir.

    Azaltma: Her hizmet için derleme işlemini kapsayıcıya alma. Bu şekilde, derleme sisteminin kapsayıcıları çalıştırabilmesi gerekir.

  • tümleştirme ve yük testi. Ekipler güncelleştirmeleri kendi hızlarında yayınlarken, özellikle hizmetlerin diğer hizmetlere bağımlılıkları olduğunda güçlü uçtan uca test tasarlamak zor olabilir. Ayrıca, tam bir üretim kümesi çalıştırmak pahalı olabilir, bu nedenle her ekibin yalnızca test için üretim ölçeklerinde kendi tam kümesini çalıştırması pek olası değildir.

  • yayın yönetimi. Her ekip üretime bir güncelleştirme dağıtabilmelidir. Bu, her ekip üyesinin bunu yapma izni olduğu anlamına gelmez. Ancak merkezi bir Release Manager rolüne sahip olmak dağıtımların hızını azaltabilir.

    Azaltma: CI/CD işleminiz ne kadar otomatik ve güvenilir olursa merkezi bir yetkiliye o kadar az ihtiyaç duyulmalıdır. Buna göre, ana özellik güncelleştirmelerini yayımlamak için küçük hata düzeltmelerine karşı farklı ilkeleriniz olabilir. Merkezi olmayan olmak, sıfır idare anlamına gelmez.

  • hizmet güncelleştirmelerini. Bir hizmeti yeni bir sürüme güncelleştirdiğinizde, buna bağlı olan diğer hizmetleri bozmamalıdır.

    Azaltma: Hataya neden olmayan değişiklikler için mavi-yeşil veya kanarya sürümü gibi dağıtım tekniklerini kullanın. Hataya neden olan API değişiklikleri için yeni sürümü önceki sürümle yan yana dağıtın. Bu şekilde, önceki API'yi kullanan hizmetler güncelleştirilebilir ve yeni API için test edilebilir. Aşağıdaki hizmetleri güncelleştirme bölümüne bakın.

Monorepo ve çoklu depo karşılaştırması

CI/CD iş akışı oluşturmadan önce kod tabanının nasıl yapılandırılacağını ve yönetileceğini bilmeniz gerekir.

  • Ekipler ayrı depolarda mı yoksa bir monorepoda mı (tek depo) çalışıyor?
  • Dallanma stratejiniz nedir?
  • Kim üretime kod gönderebilir? Yayın yöneticisi rolü var mı?

Monorepo yaklaşımı iyiye gitmekte ama her ikisinin de avantajları ve dezavantajları vardır.

  Monorepo Birden çok depo
Avantajları Kod paylaşımı
Kodu ve araçları standart hale getirmek daha kolay
Kodu yeniden düzenlemek daha kolay
Bulunabilirlik - kodun tek görünümü
Ekip başına sahipliği temizle
Potansiyel olarak daha az birleştirme çakışması
Mikro hizmetlerin ayrıştırmasını zorunlu kılmaya yardımcı olur
Zorlukları Paylaşılan kodda yapılan değişiklikler birden çok mikro hizmeti etkileyebilir
Birleştirme çakışmaları için daha fazla potansiyel
Araçlar büyük bir kod tabanına ölçeklendirilmelidir
Erişim denetimi
Daha karmaşık dağıtım işlemi
Kodu paylaşmak daha zor
Kodlama standartlarını zorunlu kılmak daha zor
Bağımlılık yönetimi
Kod tabanını dağıtma, zayıf bulunabilirlik
Paylaşılan altyapı eksikliği

Hizmetleri güncelleştirme

Zaten üretimde olan bir hizmeti güncelleştirmek için çeşitli stratejiler vardır. Burada üç yaygın seçeneği ele alıyoruz: Sıralı güncelleştirme, mavi-yeşil dağıtım ve kanarya sürümü.

Sıralı güncelleştirmeler

Sıralı bir güncelleştirmede hizmetin yeni örneklerini dağıtırsınız ve yeni örnekler istekleri hemen almaya başlar. Yeni örnekler ortaya çıktıkçe, önceki örnekler kaldırılır.

Örnek. Kubernetes'te, Dağıtımiçin pod belirtimini güncelleştirdiğinizde varsayılan davranış sıralı güncelleştirmelerdir. Dağıtım denetleyicisi güncelleştirilmiş podlar için yeni bir ReplicaSet oluşturur. Ardından, istenen çoğaltma sayısını korumak için eskisini ölçeklendirirken yeni ReplicaSet'in ölçeğini büyütür. Yenileri hazır olana kadar eski podları silmez. Kubernetes güncelleştirmenin geçmişini tutar, böylece gerekirse güncelleştirmeyi geri alabilirsiniz.

Örnek. Azure Service Fabric varsayılan olarak sıralı güncelleştirme stratejisini kullanır. Bu strateji, mevcut API'leri değiştirmeden yeni özelliklere sahip bir hizmet sürümünü dağıtmak için en uygun yöntemdir. Service Fabric, uygulama türünü düğümlerin bir alt kümesine veya bir güncelleştirme etki alanına güncelleştirerek bir yükseltme dağıtımı başlatır. Ardından tüm etki alanları yükseltilene kadar sonraki güncelleştirme etki alanına iletilir. Bir yükseltme etki alanı güncelleştirilemezse, uygulama türü tüm etki alanlarında önceki sürüme geri döner. Birden çok hizmeti olan bir uygulama türünün (ve tüm hizmetlerin bir yükseltme dağıtımının parçası olarak güncelleştirilmesi durumunda) hataya açık olduğunu unutmayın. Bir hizmet güncelleştiremezse, uygulamanın tamamı önceki sürüme geri alınır ve diğer hizmetler güncelleştirilmez.

Güncelleştirmelerin sıralı olması, güncelleştirme işlemi sırasında eski ve yeni sürümlerin bir karışımının çalışması ve trafik almasıdır. Bu süre boyunca, tüm istekler iki sürümden birine yönlendirebilir.

Hataya neden olan API değişiklikleri için, önceki sürümün tüm istemcileri güncelleştirilene kadar her iki sürümü de yan yana desteklemek iyi bir uygulamadır. Bkz. API sürüm oluşturma.

Mavi-yeşil dağıtım

Mavi-yeşil dağıtımda, yeni sürümü önceki sürümle birlikte dağıtırsınız. Yeni sürümü doğruladıktan sonra, tüm trafiği bir kerede önceki sürümden yeni sürüme geçirebilirsiniz. Anahtardan sonra, herhangi bir sorun için uygulamayı izlersiniz. Bir sorun olursa eski sürüme geri dönebilirsiniz. Sorun olmadığını varsayarsak eski sürümü silebilirsiniz.

Daha geleneksel monolitik veya N katmanlı bir uygulama ile mavi-yeşil dağıtım genellikle iki özdeş ortam sağlama anlamına geliyordu. Yeni sürümü bir hazırlama ortamına dağıtabilir, ardından istemci trafiğini hazırlama ortamına (örneğin VIP adreslerini değiştirerek) yeniden yönlendirebilirsiniz. Mikro hizmetler mimarisinde güncelleştirmeler mikro hizmet düzeyinde gerçekleşir, bu nedenle genellikle güncelleştirmeyi aynı ortama dağıtır ve değiştirmek için bir hizmet bulma mekanizması kullanırsınız.

Örnek. Kubernetes'te mavi-yeşil dağıtımlar yapmak için ayrı bir küme hazırlamanız gerekmez. Bunun yerine seçicilerden yararlanabilirsiniz. Yeni bir pod belirtimi ve farklı bir etiket kümesiyle yeni bir Dağıtım kaynağı oluşturun. Önceki dağıtımı silmeden veya ona işaret eden hizmeti değiştirmeden bu dağıtımı oluşturun. Yeni podlar çalıştırıldıktan sonra hizmetin seçicisini yeni dağıtımla eşleşecek şekilde güncelleştirebilirsiniz.

Mavi-yeşil dağıtımın bir dezavantajı, güncelleştirme sırasında hizmet için iki kat fazla pod çalıştırmanızdır (geçerli ve sonraki). Podlar çok fazla CPU veya bellek kaynağı gerektiriyorsa kaynak tüketimini işlemek için kümenin ölçeğini geçici olarak genişletmeniz gerekebilir.

Kanarya sürümü

Kanarya sürümünde, güncelleştirilmiş bir sürümü az sayıda istemciye dağıtacaksınız. Ardından, tüm istemcilere dağıtmadan önce yeni hizmetin davranışını izlersiniz. Bu, denetimli bir şekilde yavaş dağıtım yapmanızı, gerçek verileri gözlemlemenizi ve tüm müşteriler etkilenmeden önce sorunları tespit etmenizi sağlar.

İstekleri hizmetin farklı sürümlerine dinamik olarak yönlendirmeniz gerektiğinden, kanarya sürümünün yönetilmesi mavi-yeşil veya sıralı güncelleştirmeden daha karmaşıktır.

Örnek. Kubernetes'te bir Service iki çoğaltma kümesine (her sürüm için bir tane) yayılacak şekilde yapılandırabilir ve çoğaltma sayılarını el ile ayarlayabilirsiniz. Ancak Kubernetes'in podlar arasında yük dengelemesi yapma şekli nedeniyle bu yaklaşım oldukça ayrıntılıdır. Örneğin, toplam 10 çoğaltmanız varsa trafiği yalnızca 10% artışla kaydırabilirsiniz. Bir hizmet ağı kullanıyorsanız, daha gelişmiş bir kanarya sürüm stratejisi uygulamak için hizmet ağı yönlendirme kurallarını kullanabilirsiniz.

Sonraki adımlar