Docker ve Kubernetes ile en iyi mimari - efsane mi gerçek mi?

Docker ve Kubernet'ler döneminde yazılım geliştirme dünyası nasıl değişti? Bir mimariyi bir kerede ve tüm bu teknolojileri kullananlar için inşa etmek mümkün mü? Her şey kaplarda “paketlendiğinde” gelişme ve entegrasyon süreçlerini birleştirmek mümkün müdür? Bu kararların gereklilikleri nelerdir? Hangi kısıtlamaları devreye sokarlar? Geliştiricilerin hayatını kolaylaştıracak mı yoksa yerine gereksiz komplikasyonlar ekleyebilecekler mi?

Bu (ve diğer bazı) sorulara ışık tutmanın zamanı geldi! (Metin ve orijinal resimlerde.)

Bu makale sizi gerçek hayattan gelişim süreçlerine mimarlığa ve gerçek hayata dönüş yolculuğuna götürecek ve bu durakların her birinde en önemli sorulara cevap verecektir. Bir mimarinin parçası olması gereken bir takım bileşenleri ve prensipleri belirlemeye ve bunların uygulama alanlarına girmeden birkaç örnek göstermeye çalışacağız.

Makalenin sonucu sizi üzebilir veya memnun edebilir. Hepsi deneyiminize, bu üç bölümden oluşan hikayeyi algılayışınıza ve belki de okuma sırasındaki ruh halinize bağlıdır. Aşağıdaki yorumlarınızı veya sorularınızı göndererek ne düşündüğünüzü bana bildirin!

Gerçek hayattan kalkınma iş akışlarına

Çoğunlukla, şimdiye kadar gördüğüm veya onurlandırdığım tüm gelişim süreçleri, basit bir hedefe hizmet etti - bir fikrin doğuşu ile üretime teslim edilmesi arasındaki süreyi, bir miktar kod kalitesini korurken.

Bu fikrin iyi veya kötü olması önemli değil. Kötü fikirler gelir ve hızla gider - siz sadece onları deneyin ve parçalamak için aşağı çevirin. Burada bahsetmeye değer olan şey, kötü bir fikirden geri dönmenin iş akışınızı otomatikleştiren bir robotun omuzlarına düşmesidir.

Sürekli entegrasyon ve teslimat, yazılım geliştirme dünyasında hayat kurtarıcı gibi görünüyor. Sonuçta bundan daha kolay ne olabilir? Bir fikrin var, kodun sende, öyleyse git! Hafif bir sorun olmasa bile kusursuz olurdu - entegrasyon ve teslimat süreci, şirketinize özgü teknoloji ve iş süreçlerinden ayrı olarak resmileştirilmesi oldukça zordur.

Bununla birlikte, görevin ortaya çıkan karmaşıklığına rağmen, yaşam sürekli olarak bizi (her şeyden önce her durumda yararlı olabilecek kusursuz bir mekanizma inşa etmeye biraz daha yaklaştıran) mükemmel fikirlere atıyor. Benim için böyle bir mekanizmaya en son adım, soyutlama düzeyi ve ideolojik yaklaşımın, sorunların% 80'inin hemen hemen aynı yöntemler kullanılarak çözülebileceğini düşündüren Docker ve Kubernetes oldu.

Kalan% 20, belli ki hiçbir yere gitmedi. Ancak bu, içsel yaratıcı dehalarınızı yinelenen rutin görevlerle uğraşmak yerine ilginç çalışmalara odaklayabileceğiniz yerdir. “Mimari çerçeveye” sadece bir kez bakmak, çözülen sorunların% 80'ini unutabilmenizi sağlayacaktır.

Tüm bunlar ne anlama geliyor ve Docker, geliştirme iş akışının sorunlarını tam olarak nasıl çözüyor? Çoğu çalışma ortamı için de yeterli olan basit bir sürece bakalım:

Uygun bir yaklaşımla, aşağıdaki dizideki her şeyi otomatikleştirebilir ve birleştirebilir ve aylarca bunu unutabilirsiniz.

Bir geliştirme ortamı kurmak

Bir proje, yerel makinede uygulamayı / hizmeti çalıştırmak için ne ve nasıl yapmanız gerektiğini düşünmekte zorlanabileceğiniz bir docker-compose.yml dosyası içermelidir. Basit bir liman oluşturucu komuta komutu, uygulamanızı tüm bağımlılıklarıyla başlatmalı, veritabanını demirbaşlarla doldurmalı, kabın içine yerel kodu yüklemeli, anında derleme için kod izlemeyi etkinleştirmeli ve sonunda beklenen bağlantı noktasında yanıt vermeye başlamalıdır. Yeni bir servis kurarken bile, nasıl başlayacağınız, nerede değişiklik yapacağınız veya hangi çerçeveleri kullanacağınız konusunda endişelenmenize gerek yok. Tüm bunlar önceden standart talimatlarda açıklanmalı ve farklı kurulumlar için servis şablonları tarafından belirtilmelidir: ön uç, arka uç ve alt.

Otomatik test

“Kara kutu” hakkında bilmek istediğiniz tek şey (neden daha sonra metinde takip edeceğime kapsayıcı dediğimle ilgili olarak) içinde her şey yolunda. Evet veya Hayır. 1 veya 0. Konteynırın içinde uygulanabilecek sonlu sayıda komut ve tüm bağımlılıklarını tanımlayan docker-compose.yml komutuna sahip olduğunuzda, uygulama detaylarına çok fazla odaklanmadan testi otomatikleştirebilir ve birleştirebilirsiniz.

Örneğin, böyle!

Burada test, sadece ve çok fazla test değil, aynı zamanda işlevsel test, entegrasyon testi, (kod stili) ve çoğaltılması, eski bağımlılıkların kontrolü, kullanılmış paketler için lisans ihlalleri ve daha birçok şey anlamına gelir. Mesele şu ki bunların hepsi Docker resminizin içine yerleştirilmelidir.

Sistem teslimi

Projenizi ne zaman ve nereye yüklemek istediğiniz hiç önemli değil. Sonuç, kurulum işlemi gibi, daima aynı olmalıdır. Ayrıca, tüm ekosistemin hangi kısmından kuracağınız ya da hangi repodan alacağınız konusunda hiçbir fark yoktur. Buradaki en önemli bileşen boşuna. Belirtmeniz gereken tek şey, kurulumu kontrol eden değişkenlerdir.

İşte bana bu sorunu çözmede oldukça etkili görünen algoritma:

  1. Tüm Docker dosyalarınızdan görüntüler toplayın (örneğin, bunun gibi)
  2. Bir meta-proje kullanarak, bu görüntüleri Kube API'sı yoluyla Kubernet'lere gönderin. Teslimat başlatmak genellikle birkaç girdi parametresi gerektirir:
  • Kube API bitiş noktası
  • farklı bağlamlara göre değişen bir “gizli” nesne (yerel / showroom / evreleme / üretim)
  • görüntülenecek sistemlerin adları ve bu sistemler için Docker görüntülerinin etiketleri (önceki adımda elde edilir)
Tüm sistem ve hizmetleri kapsayan bir meta projenin bir örneği olarak (diğer bir deyişle, ekosistemin nasıl düzenlendiğini ve güncellemelerin nasıl yapıldığını açıklayan bir proje) Kube ile entegrasyon için Ansible oyun kitaplarını bu modülle kullanmayı tercih ediyorum. API. Bununla birlikte, sofistike otomatistler diğer seçeneklere başvurabilirler ve daha sonra kendi seçimlerim üzerinde duracağım. Ancak, mimariyi yönetmek için merkezi / birleşik bir yol düşünmeniz gerekir. Birine sahip olmak, tüm hizmetleri / sistemleri rahatça ve düzenli bir şekilde yönetmenize izin verecek ve yaklaşan benzer teknolojilerin ve benzer işlevleri yerine getiren sistemlerin size getirebileceği komplikasyonları etkisiz hale getirecektir.

Tipik olarak, ortamın kurulması aşağıdakilerde gereklidir:

  • “ShowRoom” - sistemin bazı manuel kontrolleri veya hata ayıklamaları için
  • “Evreleme” - yakın ortamlar ve harici sistemlerle entegrasyonlar için (genellikle ShowRoom’un aksine DMZ’de bulunur)
  • “Üretim” - son kullanıcı için gerçek ortam

Entegrasyon ve teslimatta süreklilik

Docker görüntülerini (veya “kara kutuları”) test etmenin birleştirilmiş bir yöntemini kullanıyorsanız, bu tür testlerin sonuçlarının git dalınızın yukarı akışına veya ana dallarına özellik dalını sorunsuz bir şekilde (ve açık bir şekilde vicdanla) dahil etmenize izin vereceğini varsayabilirsiniz. deposu.

Belki de, buradaki tek anlaşma kırıcı, entegrasyon ve teslimat sırasıdır. Herhangi bir sürüm olmadığında, paralel özellik dallarına sahip bir sistemde “yarış koşulunu” nasıl önlersiniz?

Bu nedenle, bu sürece yalnızca rekabet olmadığında başlanması gerekir, aksi takdirde “yarış koşulu” aklınızı kaçırmaya devam edecektir:

  1. Özellik dalını yukarı akış yönünde güncellemeye çalışın (git rebase / merge)
  2. Dockerfiles'tan görüntüler oluşturun
  3. Tüm yerleşik görüntüleri test edin
  4. Adım 2'deki görüntüleri olan sistemler teslim edilinceye kadar başlayın ve bekleyin
  5. Bir önceki adım başarısız olursa, eko sistemi önceki durumuna geri döndürün
  6. Özellik dalı birleştirme girişini birleştir ve depoya gönder

Herhangi bir adımdaki herhangi bir başarısızlık teslimat işlemini sonlandırmalı ve başarısız bir test veya bir birleştirme çatışması olsun, hatayı düzeltmek için görevi geliştiriciye iade etmelidir.

Bu işlemi birden fazla depoyla çalışmak için kullanabilirsiniz. Her bir depo için tüm işlemleri tekrar tekrar yapmak yerine, tüm depoları için her adımı (A ve B depoları için 1. adım, A ve B depoları için 2. adım, vb.) Yapmanız yeterlidir. , repo B için 1 - 6 arasındaki adımlar, vb.).

Ek olarak, Kubernetes, çeşitli AB testlerini ve risk analizlerini gerçekleştirmek için parçalardaki güncellemeleri sunmanıza izin verir. Kubernetes, hizmetleri (erişim noktaları) ve uygulamaları ayırarak dahili olarak yapar. Sorun analizini kolaylaştırmak ve olası bir geri dönüşü sağlamak için her zaman bir bileşenin yeni ve eski sürümlerini istediğiniz oranda dengeleyebilirsiniz.

Geri alma sistemleri

Mimari bir çerçeveye zorunlu olan gereksinimlerden biri, herhangi bir konuşlandırmayı tersine çevirme yeteneğidir. Bu da, bir dizi açık ve örtük nüansa neden olur. İşte bunlardan en önemlilerinden bazıları:

  • Hizmet, geri dönüş değişikliklerinin yanı sıra ortamını da ayarlayabilmelidir. Örneğin, veritabanı geçişi, RabbitMQ şeması vb.
  • Ortamı geri almak mümkün değilse, hizmet polimorfik olmalı ve kodun hem eski hem de yeni sürümlerini desteklemelidir. Örneğin: veritabanı geçişleri hizmetin eski sürümlerini bozmamalıdır (genellikle 2 veya 3 geçmiş sürüm)
  • Herhangi bir servis güncellemesinin geriye dönük uyumluluğu. Genellikle, bu API uyumluluğu, mesaj formatları vb.
Bir Kubernetes kümesindeki durumların geri alınması oldukça basittir (kubectl rollout'u dağıtma / bazı dağıtıcıları çalıştırma ve Kubernet'ler önceki "anlık görüntüyü" geri yükleyecektir) ancak bunun çalışması için meta projenizin bu anlık görüntü hakkında bilgi içermesi gerekir. Daha karmaşık dağıtım geri alma algoritmaları, bazen gerekli olmalarına rağmen, kesinlikle önerilmez.

İşte geri alma mekanizmasını tetikleyebilecek olan:

  • Yayımlandıktan sonra yüksek uygulama hatası yüzdesi
  • Kilit izleme noktalarından gelen sinyaller
  • Başarısız duman testleri
  • Manuel mod - insan faktörü

Bilgi güvenliği ve denetiminin sağlanması

Kurşun geçirmez güvenliği sihirli bir şekilde “inşa edebilen” ve ekosisteminizi hem dış hem de iç tehditlerden koruyabilecek tek bir iş akışı yoktur, bu nedenle mimari çerçevenizin her birinin şirketin standartlarına ve güvenlik politikalarına dikkat ederek yapıldığından emin olmanız gerekir. seviye ve tüm alt sistemlerde.

Önerilen çözümün her üç seviyesini daha sonra, sistem bütünlüğü için de kritik öneme sahip olan izleme ve uyarı bölümlerinde ele alacağım.

Kubernet'lerde erişim kontrolü, ağ politikaları, olayların denetimi ve bilgi güvenliğine ilişkin diğer güçlü araçlar, saldırılara ve veri sızıntılarına karşı koyabilecek ve önlenebilecek mükemmel bir koruma alanı oluşturmak için kullanılabilecek bir dizi sağlam mekanizmaya sahiptir .

Geliştirme iş akışlarından mimariye

Geliştirme iş akışları ve ekosistem arasında sıkı bir entegrasyon kurma girişimi ciddiye alınmalıdır. Geleneksel gereksinim kümesine bir mimariye (esneklik, ölçeklenebilirlik, kullanılabilirlik, güvenilirlik, tehditlere karşı koruma vb.) Böyle bir entegrasyon için bir gereksinim eklemek, mimari çerçevenizin değerini büyük ölçüde artırabilir. Altyapının toplam otomasyonuna ve optimizasyonuna yönelik mantıklı bir adım olan “DevOps” (Geliştirme Operasyonu) adlı bir kavramın ortaya çıkmasına neden olması çok önemli bir özelliktir. Bununla birlikte, iyi tasarlanmış bir mimari ve güvenilir alt sistemler verildiğinde, DevOps görevleri en aza indirilebilir.

Mikro hizmet mimarisi

Hizmet odaklı bir mimarinin - hizmetlerin neden “mikro” olması gerektiği de dahil olmak üzere SOA'nın faydalarının ayrıntılarına girmeye gerek yok. Sadece Docker ve Kubernet'leri kullanmaya karar verdiyseniz, monolitik bir mimariye sahip olmanın zor ve hatta ideolojik olarak yanlış olduğunu anlarsınız (ve kabul edersiniz). Tek bir işlemi yürütmek ve ısrarla çalışmak üzere tasarlanan Docker, bizi DDD çerçevesi (Domain-Driven Development) çerçevesinde düşünmeye zorlar. Docker'da, paketlenmiş kod bazı açık bağlantı noktalarına sahip bir kara kutu olarak değerlendirilir.

Ekosistemin kritik bileşenleri ve çözümleri

Kullanılabilirliği ve güvenilirliği artırılmış sistemler tasarlama deneyimimden, mikro hizmetlerin çalışması için çok önemli olan birkaç bileşen var. Bu bileşenlerin her birini daha sonra listeleyip konuşacağım ve bir Kubernetes ortamı bağlamında bunlara atıfta bulunsam da, listeme başka bir platform için kontrol listesi olarak başvurabilirsiniz.

Siz (benim gibi), bu bileşenlerin her birini normal bir Kubernetes servisi olarak yönetmenin harika olacağı sonucuna varacaksanız, bunları “üretim” dışındaki ayrı bir kümede çalıştırmanızı öneririm. Örneğin, bir “evreleme” kümesi, çünkü üretim ortamı dengesiz olduğunda hayatınızı kurtarabilir ve imajının, kodunun ya da izleme araçlarının bir kaynağına ihtiyacınız olduğunda umutsuzca hayatınızı kurtarabilir. Bu, tavuk ve yumurta problemini çözer, tabiri caizse.

Kimlik servisi

Her zamanki gibi, hepsi sunuculara, sanal makinelere, uygulamalara, ofis postasına, vb. Erişimle başlar. Büyük kurumsal platformlardan birinin (IBM, Google, Microsoft) müşterisi iseniz veya müşteriniz olmak istiyorsanız, erişim sorunu satıcının hizmetlerinden biri tarafından ele alınacaktır. Ancak, kendi çözümünüzü almak istiyorsanız, yalnızca sizin tarafınızdan ve bütçeniz dahilinde yönetilsin mi?

Bu liste uygun çözüme karar vermenize ve onu kurmak ve sürdürmek için gereken çabayı tahmin etmenize yardımcı olacaktır. Elbette, seçiminiz şirketin güvenlik politikasına uygun olmalı ve bilgi güvenliği departmanı tarafından onaylanmalıdır.

Otomatik servis sağlama

Kubernet'ler fiziksel makinelerde / bulut VM'lerde (docker, kubelet, kube proxy, etcd cluster) yalnızca bir avuç parça bulundurmayı gerektirse de, yeni makinelerin ve küme yönetiminin eklenmesini otomatikleştirmeniz gerekir. İşte bunu yapmanın birkaç basit yolu:

  • KOPS - bu araç iki bulut sağlayıcısından birine küme yüklemenizi sağlar - AWS veya GCE
  • Teraform - bu her ortam için altyapıyı yönetmeni sağlar ve IAC (Kod olarak Altyapı) ideolojisini izler.
  • Ansible - her türlü otomasyon için çok yönlü alet
Şahsen, hem sunucularla hem de k8s nesneleriyle çalışmama ve her türlü otomasyonu gerçekleştirmeme izin verdiği için üçüncü seçeneği tercih ediyorum (biraz Kubernetes entegrasyon modülü ile). Ancak, hiçbir şey Teraform ve Kubernetes modülünü kullanmanıza engel olamaz. KOPS “çıplak metal” ile iyi çalışmıyor ancak yine de AWS / GCE ile kullanmak için harika bir araç!

Git deposu ve görev izci

Geliştiricilerin ve diğer ilgili rollerin tam teşekküllü çalışmalarını sağlamak için, ekip çalışması ve kod depolama tartışmaları için bir yeriniz olması gerektiğini söylemeye gerek yok. Hangi hizmetin bu servis için en iyi olduğunu belirleme konusunda zorlandım, ancak görev takibi için benim kişisel altın standartım redmine (ücretsiz) ya da Jira (ücretli) ve kod deposu - “eski okul” [gerrit] ( https://www.gerritcodereview.com/) (ücretsiz) veya bitbucket (ücretli).

Bir kurumsal ortamda işbirliğine dayalı çalışma için en tutarlı (ticari olmasına rağmen) iki yığına dikkat etmek önemlidir: Atlassian ve Jetbrains. Bunlardan herhangi birini bağımsız bir çözüm kullanabilir veya her ikisinin çeşitli bileşenlerini birleştirebilirsiniz.

Bir izleyici ve havuz kombinasyonundan en iyi şekilde yararlanmak için entegrasyon stratejileri hakkında düşünün. Örneğin, kodun ve ilgili görevlerin bütünlüğünü sağlamak için birkaç ipucu (elbette kendi yaklaşımınızı seçebilirsiniz):

  • Uzak bir havuza “itme” yeteneği, yalnızca itmeye çalıştığı bir dalın ilgili görev numarasına sahip olması durumunda etkinleştirilmelidir (TASK-1 / feature-34)
  • Herhangi bir dal, yalnızca belirli sayıda pozitif kod inceleme yinelemesinden sonra birleştirilmeye hazır olmalıdır
  • İlgili görev “Devam Ediyor” veya benzeri bir durum değilse, herhangi bir dal gelecekteki güncellemeler için engellenmeli ve devre dışı bırakılmalıdır.
  • Otomasyon için amaçlanan herhangi bir adım geliştiricilere doğrudan uygulanmamalıdır
  • Yalnızca yetkili geliştiriciler ana şubeyi doğrudan değiştirebilmelidir - otomasyon robotu tarafından kontrol edilen her şey
  • Bir şube, ilgili görev “Teslimat İçin” veya benzeri dışında bir durumdaysa birleşme için uygun olmamalıdır

Docker Kayıt Defteri

Hizmetlerin saklanması ve sunulması için kritik önem taşıdığından Docker görüntü yönetim sistemine özel dikkat gösterilmelidir. Ek olarak, bu sistem kullanıcılara ve kullanıcı gruplarına erişimi desteklemeli, eski ve gereksiz görüntüleri silebilmeli, bir GUI ve RESTful API kullanabilmelidir.

Kubernet kümenizde bile kurulabilen bir bulut çözümü (örneğin, hub.docker.com) veya özel olarak barındırılan bir hizmet kullanabilirsiniz. Docker Registry için kurumsal bir çözüm olarak konumlanan Vmware Harbor, sonuncusuna güzel bir örnektir. En kötü durumda, görüntüleri saklamak ve karmaşık bir sisteme ihtiyaç duymak istemiyorsanız eski Docker Kayıt Defterini bile kullanabilirsiniz.

CI / CD ve servis dağıtım sistemi

Daha önce tartıştığımız bileşenlerin hiçbiri (git repo, görev izleyici, Ansible Playbook'lar ile meta proje, dış bağımlılıklar), bir boşlukta asılı kalmış gibi birbirinden ayrı çalışabilir. Onları birbirine bağlayan sürekli entegrasyon ve teslimat hizmetidir.

CI - Sürekli Entegrasyon CD'si - Sürekli Teslimat

Servis oldukça basit olmalı ve sistem teslimatı veya konfigürasyonu ile ilgili herhangi bir mantıktan mahrum olmalıdır. Bir CI / CD servisinin yapması gereken dış dünyadaki olaylara tepki vermek (git depodaki değişiklikler, görev izleyicinin etrafındaki görevleri taşımak) ve meta projede açıklanan eylemleri başlatmaktır. Ek olarak, servis tüm depoların kontrol noktasını ve onları yönetmek için bir araç (şube birleşmesi, yukarı / ana güncellemeler).

Tarihsel olarak Jetbrains - TeamCity'den oldukça güçlü fakat çok basit bir araç kullandım, ancak başka bir şeyi denemeye karar verirseniz, örneğin, ücretsiz Jenkins.

Yukarıda tarif ettiğimiz şemada, entegrasyon hizmeti esas olarak aşağıdaki gibi dört ana süreci ve yardımcı bir süreci başlatmaktan sorumludur:

  • Otomatik servis testi - genellikle tek bir havuz için, bir şube durumu değiştiğinde veya durum “Otomatik Testleri Bekliyor” olarak değiştirildiğinde (veya benzeri)
  • Hizmet sunumu - genellikle, bir meta projeden ve bir dizi hizmet için (sırasıyla bir dizi havuz), durum QA ve üretim ortamı dağıtımı için sırasıyla “Showroom Bekleniyor” veya “Teslimat Bekleniyor” olarak değiştiğinde
  • Geri alma - bir kural olarak, bir meta projeden ve tek bir hizmetin belirli bir kısmı için veya bir hizmetin tamamı için, harici bir etkinlik tarafından tetiklenen veya başarısız bir teslimat durumunda
  • Hizmetin kaldırılması - Bu, Kalite Güvencesi durumu sona erdiğinde ya da ortama artık ihtiyaç duyulmadığında, tüm ekosistemi tek bir test ortamından (showroom) tamamen kaldırmak için gereklidir.
  • Görüntü oluşturucu (yardımcı işlem) - servis dağıtım işlemine entegre edilebilir veya Docker görüntülerini derleyip Docker Kayıt Defterine göndermek için bağımsız olarak kullanılabilir. Genellikle yaygın olarak kullanılan görüntüleri yönetir (DB, genel servisler veya sık değişiklik gerektirmeyen servisler)

Log toplama ve analiz sistemi

Herhangi bir Docker konteynerinin günlüklerini erişilebilir hale getirmesinin tek yolu, bunları konteynerde çalışan kök işleminin STDOUT veya STDERR'sine yazmaktır. Servis geliştiricisi, günlük verilerinin yanında ne olacağı umrumda değil, asıl mesele, gerektiğinde kullanılabilir olması ve tercihen geçmişte belirli bir noktaya kadar kayıt içermesi gerektiğidir. Bu beklentileri yerine getirme konusundaki tüm sorumluluk Kubernet'lere ve ekosistemi destekleyen mühendislere aittir.

Resmi belgelerde, büyük metin verilerinin toplanması ve depolanması için bir hizmet seçmenize yardımcı olacak, günlüklerle çalışmak için temel (ve iyi bir) stratejinin açıklamasını bulabilirsiniz.

Bir kayıt sistemi için önerilen hizmetler arasında, aynı belgeler veri toplamak için akıcılık (kümenin her bir düğümünde bir aracı olarak başlatıldığında) ve verilerin depolanması ve endekslenmesi için Elasticsearch'den bahseder. Her ikisinin de verimliliği, bu çözümün verimliliğine katılmasanız bile, ancak güvenilir ve kullanımı kolaydır, bu yüzden en azından iyi bir başlangıç ​​olduğunu düşünüyorum.

Elasticsearch, kaynak yoğun bir çözümdür, ancak iyi ölçeklenir ve hem bireysel bir düğümü hem de gereken boyutta bir kümeyi çalıştırmak için hazır Docker görüntülerine sahiptir.

İzleme sistemi

Kodunuz olabildiğince mükemmel, arızalar olur ve daha sonra bunları üretimde ince bir tarakla incelemek ve “her şey yerel makinemde iyi çalıştığında neyin yanlış gittiğini” anlamaya çalışırsınız. Yavaş veritabanı sorguları, yanlış önbellekleme, yavaş diskler veya harici bir kaynakla bağlantı, ekosistemdeki işlemler, darboğazlar ve düşük ölçekli bilgi işlem hizmetleri, kodunuzu bir kod altında yürütmek için harcanan zamanı izlemek ve tahmin etmek zorunda kalmanızın nedenlerinden bazılarıdır. Gerçek yük

Opentracing ve Zipkin, çoğu modern programlama dili için ve kodu uyguladıktan sonra herhangi bir ilave yük eklemeden bu görevle baş edebilir. Elbette toplanan tüm veriler, bileşenlerden biri olarak kullanılan uygun bir yerde saklanmalıdır.

Tüm enstrümanlar, mesaj kuyrukları, veritabanları ve benzerleri üzerinden “Kod İadesi” yapılırken ve “Trace Id” iletilirken ortaya çıkan karmaşıklıklar yukarıda belirtilen geliştirme standartları ve servis şablonları tarafından çözülür. İkincisi, yaklaşımın tek biçimliliği ile de ilgilenir.

İzleme ve uyarı

Prometheus, modern sistemlerde fiili standart haline geldi ve daha da önemlisi, neredeyse kutudan çıkan Kubernet'lerde destekleniyor. İzleme ve uyarılar hakkında daha fazla bilgi edinmek için resmi Kubernetes belgelerine başvurabilirsiniz.

İzleme, bir kümeye kurulması gereken birkaç yardımcı sistemden biridir. Küme, izlemeye tabi olan bir varlıktır. Ancak bir izleme sisteminin izlenmesi (totolojiden dolayı) yalnızca dışarıdan (örneğin aynı “evreleme” ortamından) yapılabilir. Bu durumda, çapraz kontrol, son derece birleşik ekosisteminizin mimarisini zorlaştırmayacak herhangi bir dağınık ortam için uygun bir çözüm olarak son derece faydalıdır.

Tüm izleme aralığı tamamen mantıksal olarak üç ayrı seviyeye ayrılmıştır. İşte her seviyede takip noktalarının en önemli örnekleri olduğunu düşünüyorum:

  • Fiziksel seviye: - Ağ kaynakları ve kullanılabilirliği - Diskler (g / Ç, kullanılabilir alan) - Bağımsız düğümlerin temel kaynakları (CPU, RAM, LA)
  • Küme seviyesi: - Her düğümdeki ana küme sistemlerinin mevcudiyeti (kubelet, kubeAPI, DNS, etcd, vb.) - Ücretsiz kaynak sayısı ve tekdüze dağıtım - Hizmetlere göre izin verilen ve fiili kaynak tüketiminin izlenmesi - Yeniden yükleme bölmeler
  • Hizmet seviyesi: - Her türlü uygulama izlemesi - veri tabanı içeriğinden API çağrı sıklığına - API ağ geçidi üzerindeki HTTP hatalarının sayısı - Kuyrukların boyutu ve çalışanların kullanımı - Veri tabanı için çoklu ölçümler (çoğaltma gecikmesi, zaman ve işlem sayısı, yavaş talepler ve daha fazlası) - HTTP dışı işlemler için hata analizi - Günlük sistemine gönderilen isteklerin izlenmesi (istekleri metriklere dönüştürebilirsiniz)

Her seviyedeki uyarı bildirimlerine gelince, e-postaya, SMS'e bildirim gönderebilen veya cep telefonu numarasına çağrı yapabilen sayısız harici hizmetten birini kullanmanızı tavsiye ederim. Prometheus’un alarm yöneticisi ile yakın bir entegrasyona sahip olan başka bir sistem olan OpsGenie’den de bahsedeceğim.

OpsGenie, uyarılar için iyileştirmeler, günün 24 saati görev, bildirim kanalı seçimi ve çok daha fazlasıyla başa çıkmanıza yardımcı olan esnek bir araçtır. Uyarıları ekipler arasında dağıtmak da kolaydır. Örneğin, farklı düzeylerde izleme, farklı ekiplere / bölümlere bildirim göndermelidir: her biri ilgili bir ekibe fiziksel - Infra + Devops, küme - Devops, uygulamalar.

API ağ geçidi ve Tekli Oturum Açma

Yetkilendirme, kimlik doğrulama, kullanıcı kaydı (şirketin dış kullanıcıları-müşterileri) ve diğer erişim kontrolü gibi görevleri yerine getirmek için API ağ geçidinizle esnek bir entegrasyon sağlayabilen oldukça güvenilir bir servise ihtiyacınız olacak. “Kimlik servisi” ile aynı çözümü kullanmanın zararı yoktur, ancak farklı bir kullanılabilirlik ve güvenilirlik düzeyi elde etmek için iki kaynağı ayırmak isteyebilirsiniz.

Hizmet içi entegrasyon karmaşık olmamalı ve hizmetleriniz kullanıcıların ve birbirlerinin yetkilendirilmesi ve onaylanması konusunda endişelenmemelidir. Bunun yerine, mimari ve ekosistem, tüm iletişimi ve HTTP trafiğini idare eden bir proxy hizmetine sahip olmalıdır.

API ekosisteminizle ve dolayısıyla tüm ekosisteminizle API ağ geçidiyle en uygun entegrasyon yolunu ele alalım. Bu yöntem, üç erişim senaryosunun tümü için iyidir: kullanıcı arayüzünden, servisten servise ve harici bir sistemden. Ardından bir belirteç alma görevi (kullanıcı adı ve şifreye dayanarak), kullanıcı arayüzü veya hizmet geliştiriciye aittir. Ayrıca, kullanıcı arabiriminde kullanılan belirteçlerin kullanım ömrünü (daha kısa TTL) ve diğer durumlarda (daha uzun ve özel TTL) ayırt etmek mantıklıdır.

API ağ geçidinin çözdüğü bazı problemler şunlardır:

  • Ekosistemin hizmetlerine dışarıdan ve içinden erişim (servisler birbirleriyle doğrudan iletişim kurmaz)
  • Tek Oturum Açma hizmetiyle entegrasyon: - İstenen hizmet için kullanıcı kimlik verilerini (kimlik, roller, diğer ayrıntılar) içeren başlıklar ile belirteçlerin ve HTTPS isteklerinin eklenmesi - Rollere göre istenen hizmete erişim denetimini etkinleştirme / devre dışı bırakma Tekli Oturum Açma servisinden alınan
  • HTTP trafiği için tek izleme noktası
  • API belgelerini farklı servislerden birleştirme (örneğin, Swagger’ın json / yml dosyalarını birleştirme)
  • Etki alanlarına ve istenen URI'lere göre tüm ekosistem için yönlendirmeyi yönetme yeteneği
  • Dış trafik için tek erişim noktası ve erişim sağlayıcı ile entegrasyon

Etkinlik otobüsü ve Kurumsal Entegrasyon / Servis otobüsü

Ekosisteminizde bir makro alanında çalışan yüzlerce hizmet varsa, hizmetlerin iletişim kurabileceği binlerce olası yöntemle uğraşmanız gerekir. Veri akışını kolaylaştırmak için, olayların bağlamından bağımsız olarak, belirli olayların meydana gelmesi üzerine çok sayıda alıcıya mesaj dağıtma yeteneğini düşünmelisiniz. Başka bir deyişle, standart bir protokole dayalı olayları yayınlamak ve bunlara abone olmak için bir olay veriyoluna ihtiyacınız vardır.

Etkinlik otobüsü olarak, sözde bir broker işletebilen herhangi bir sistemi kullanabilirsiniz: RabbitMQ, Kafka, ActiveMQ ve diğerleri. Genel olarak, yüksek kullanılabilirlik ve veri tutarlılığı mikro servisler için kritik öneme sahiptir, ancak yine de CAP teoremi nedeniyle veriyolunun uygun bir şekilde dağıtılması ve kümelenmesi için bir şeyler feda etmeniz gerekecektir.

Doğal olarak, etkinlik otobüsü hizmet içi iletişimin her türlü sorununu çözebilmelidir, ancak hizmetlerin sayısı yüzlerce ila on binlerce arasında arttıkça, en iyi etkinlik otobüsü tabanlı mimari bile başarısız olur ve siz de başka bir çözüm aramaya ihtiyacım var. İyi bir örnek, yukarıda açıklanan “Salak boru - Akıllı tüketici” taktikleri yeteneklerini artırabilecek bir entegrasyon veriyolu yaklaşımı olabilir.

Servis odaklı bir mimarinin karmaşıklığını azaltmayı amaçlayan “Kurumsal Entegrasyon / Servis Veriyolu” yaklaşımını kullanmanın onlarca nedeni var. İşte bu sebeplerden sadece birkaçı:

  • Birden fazla mesajın toplanması
  • Bir olayın birkaç olaya bölünmesi
  • Bir olaya sistem yanıtının senkron / işlem analizi
  • Dış sistemler ile entegrasyon için özellikle önemli olan arayüzlerin koordinasyonu
  • Olay yönlendirmenin gelişmiş mantığı
  • Aynı servislerle çoklu entegrasyon (dışarıdan ve içeriden)
  • Veri yolunun ölçeklenemez merkezileştirilmesi
Kurumsal bir entegrasyon veriyolu için açık kaynaklı bir yazılım olarak, bu tür SOA'nın tasarlanması ve geliştirilmesi için gerekli olan birkaç bileşeni içeren Apache ServiceMix'i düşünebilirsiniz.

Veritabanları ve diğer devletli hizmetler

Kubernet'lerin yanı sıra Docker, veri kalıcılığı gerektiren ve diskle yakından çalışan servisler için oyunun kurallarını bir kez ve herkes için değiştirdi. Bazıları, servislerin fiziksel sunucularda veya sanal makinelerde eski şekilde “yaşaması” gerektiğini söylüyor. Bu görüşe saygı duyuyorum ve artıları ve eksileri hakkında tartışmalara girmeyeceğim, ancak söz konusu ifadelerin yalnızca Docker ortamındaki durum bilgisi olan hizmetleri yönetmedeki geçici bilgi, çözüm ve deneyim eksikliğinden dolayı var olduğuna oldukça eminim.

Ayrıca bir veritabanının çoğu zaman depolama dünyasındaki merkezi yeri işgal ettiğini ve bu nedenle seçtiğiniz çözümün bir Kubernetes ortamında çalışmak için tam olarak hazır olması gerektiğini belirtmeliyim.

Tecrübelerime ve piyasa durumuma dayanarak, aşağıdaki durumsal hizmet gruplarını ve bunların her biri için en uygun Docker odaklı çözüm örneklerini ayırt edebilirim:

  • Veritabanı yönetim sistemleri - PostDock, herhangi bir Docker ortamında PostgreSQL için basit ve güvenilir bir çözümdür
  • Kuyruk / mesaj brokerleri - RabbitMQ, bir mesaj kuyruk sistemi oluşturmak ve mesajları yönlendirmek için kullanılan klasik bir yazılımdır. RabbitMQ'nun yapılandırmasındaki cluster_formation parametresi, bir küme kurulumu için vazgeçilmezdir
  • Önbellekleme hizmetleri - redis, en güvenilir ve esnek veri önbellekleme çözümlerinden biri olarak kabul edilir
  • Tam metin araması - Yukarıda bahsettiğim Elasticsearch yığını, başlangıçta tam metin araması için kullanılmış, ancak günlükleri depolamak ve büyük miktarda metin verisi olan her türlü iş için
  • Dosya depolama hizmetleri - her tür dosya depolama ve teslimatı için genelleştirilmiş bir hizmet grubu (ftp, sftp, vb.)

Bağımlılık aynaları

İhtiyacınız olan paketlerin veya bağımlılıkların bir kamu sunucusundan geçici olarak kullanılamadığı veya geçici olarak kullanılamadığı bir durumla henüz karşılaşmadıysanız, bunun asla gerçekleşmeyeceğini düşünmeyin. İstenmeyen kullanılabilirliklerden kaçınmak ve dahili sistemlere güvenlik sağlamak için, hizmetlerinizin oluşturulması veya sunulmasının Internet bağlantısı gerektirmediğinden emin olun. Tüm bağımlılıkların iç ağa yansıtılmasını ve kopyalanmasını yapılandırın: Docker görüntüleri, rpm paketleri, kaynak depoları, python / go / js / php modülleri.

Bunların ve diğer bağımlılık türlerinin her birinin kendi çözümleri vardır. En yaygın olanı “özel bağımlılık aynası…” sorgusu ile karıştırılabilir.

Mimariden gerçek hayata

Beğen ya da beğenme, er ya da geç, tüm mimarlığın başarısızlığa mahkum olacak. Her zaman olur: teknolojiler eski hale gelir (1-5 yıl), yöntemler ve yaklaşımlar - biraz yavaş (5–10 yıl), tasarım ilkeleri ve temelleri - bazen (10–20 yıl), ancak kaçınılmaz olarak.

Teknolojinin eskimişliğine dikkat edin, ekosisteminizi her zaman teknik yeniliklerin zirvesinde tutmaya çalışın, geliştiricilerin, iş dünyasının ve son kullanıcıların ihtiyaçlarını karşılamak için yeni hizmetler planlayın ve sunun, paydaşlarınıza yeni olanaklar tanıtın, ekip ve şirket ileri.

Profesyonel topluluğa entegre olarak, ilgili literatürü okuyarak ve meslektaşlarla sosyalleşerek oyunun zirvesinde kalın. Fırsatlarınızdan ve projenizdeki yeni trendlerin doğru kullanımından haberdar olun. Araştırmanızın sonuçlarını analiz etmek için bilimsel yöntemler deneyin veya uygulayın ya da güvendiğiniz ve saygı duyduğunuz diğer kişilerin sonuçlarına güvenin.

Kendinizi temel değişikliklere hazırlamak zordur, ancak alanınızda uzmansanız mümkün. Hepimiz, yaşamımız boyunca sadece birkaç büyük teknolojik değişime şahit olacağız, ama bizi profesyonel yapan ve bizi en üst seviyeye taşıyan bilgi miktarı değil, fikirlerimizin açıklığı ve metamorfozu kabul etme yeteneğidir.

“Daha iyi bir mimari inşa etmek mümkün mü?” Başlığındaki soruya geri dönersek, hayır, “bir kez ve herkes için” değil, ancak bir noktada “kısa bir süre” için gayret gösterdiğinizden emin olun. kesinlikle başarılı olacak!

Not:

Orijinal makale Rusça olarak yazılmıştır, bu yüzden çevirmek için harika bir yardım için Lazada Sergey Rodin'deki meslektaşım sayesinde!