Docker ve Kubernetes “En İyi Mimari” sunuyor mu?

Merhaba, başka bir makaleyle geri döndüm. Ama bu sefer, bazı mitleri çözme havamdayım.

Dünya her saniye değişiyor ve teknoloji de öyle. Docker ve Kubernet'lerle ilgili olarak bir çok şeyi dinliyor olmalısınız. Özellikle mimarileri arasındaki karşılaştırma. Pek çok insan hangisinin daha iyi olduğunu merak ediyor?

Başka birçok soru var ve hepsinden söz ediyorum. Neden? Bunun tek nedeni, Kubernetleri ve Docker'ı anlamanıza yardımcı olacak olmasıdır. Peki Docker ve Kubernet'ler yazılım geliştirmeyi nasıl değiştirdi? Bunlardan herhangi biri güçlü bir mimari sunuyor mu? Geliştirme ve entegrasyon süreçlerini birleştirmek mümkün mü? Eğer evet ise, kısıtlamalar nelerdir? Bu, geliştiricilerin komplikasyonlarını azaltır mı?

Her şeyden önce, Docker ve Kubernetes arasında bir karşılaştırmanın düşündüğünüz kadar kolay olmadığını anlayın. Ne daha iyi? Docker veya Kubernetes? “İyisi yok” olduğuna inanıyorum çünkü ikisi de farklı. Docker otobüs, Kubernetes ise otobüs limanıdır. Peki önemli olan ne? Kesinlikle, ikisi de önemlidir. İkisine de ihtiyacınız var.

Dolayısıyla bu makalede, gerçek hayattan gelişim süreçlerine mimarlığa ve gerçek hayata geri döneceğiz.

Ayrıca, mimarinin bir parçası olan farklı bileşenleri ve ilkeleri tanımlayacağız. Sonunda, sonuç sizi şaşırtabilir veya sizi memnun edebilir. Docker ve Kubernetes ile ilgili algı ve deneyiminize bağlıdır.

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

Geliştirme süreçlerinin neden önemli olduğunu biliyor musunuz? Eğer gelişme süreci yoksa, iyi yönlendirilmiş genelleştirilmiş bir yaklaşım yoktur. Bir gelişme süreci, bir fikrin doğuşu ile teslim edilmesi arasındaki süreyi azaltır. Süreci basitleştirir ve kalitesini korur.

İki tür fikir vardır, biri iyi diğeri kötü. Gelişmede üçüncü tür bir ara fikir yoktur. Bu fikir iyi ya da kötü olabilir, ancak yalnızca uygulama ile ölçülebilir. Kötü bir fikir ise, uygulayın ve geri alın! İyi bir fikir ise, devam et. Geri alma, bir robot yani otomasyon tarafından kontrol edilir.

Tüm bunların dışında, sürekli entegrasyon ve dağıtım sistemi bir cankurtaran olarak ortaya çıkmıştır. İşleri kolaylaştırdı. Bir fikriniz ve kodunuz varsa, uygulayın! Ancak entegrasyon ve dağıtım sistemi ile ilgili küçük bir sorun var. Sürecin şirketinize özgü teknoloji ve iş süreçlerinden ayrı olarak resmileştirilmesi zordur.

Peki bu problem nasıl çözüldü?

Şimdi bu sorun Docker ve Kubernetes yardımı ile çözüldü. İkisi de Mesih olarak ortaya çıktı. Soyutlama düzeyi ve ideolojik yaklaşım, sorunun neredeyse% 80'ini çözdü. Dikkat!% 80, kalkınma sektöründe çok iyi bir yüzde. % 20'si hala orada ve birisinin bunu çözmek için yaratıcı bir dahi olması gerekiyor. Bu, uygulamanın türüne ve çözme şeklinize bağlıdır.

Docker, geliştirme iş akışı sorununu çözer. Docker basit bir işlem sunar ve çalışma ortamlarının çoğu için yeterlidir.

Resim Kaynağı: https://cdn-images-1.medium.com/max/800/0*nDrc_jeOKTMS7akB.

Bu yaklaşımın yardımı ile kişi her şeyi otomatikleştirip birleştirebilir.

Geliştirme ortamına giriş

Her şeyden önce, proje bir docker-compose.yml dosyasından oluşmalıdır. Bu dosyanın avantajı, uygulamayı / hizmeti yerel makinede çalıştırmanın yükünü kaldırmasıdır. Geliştiricinin düşünmesine gerek yok. Aslında, uygulamanızın başlatılması için yalnızca basit bir dock-compose up komutu yeterlidir. Komut aynı zamanda bağımlılıkları önemser, veritabanını armatürlerle doldurur, kabın içine yerel kodu yükler, kod izlemesini sağlar ve beklenen portta cevap verir.

Tüm bunlara ek olarak, başlama, değişiklik yapma, çerçeve seçimi vb. Konularında da endişelenmenize gerek yok. Her şey önceden standart talimatlarda açıklanmıştır. Ön uç, arka uç ve alt gibi ayarlara göre servis şablonları tarafından belirlenir.

Otomatik test zamanı

“Kara Kutu” hakkında bir şey duydun mu? Bir uçak kazasından önceki son saniyelerde bile her şeyi kaydeder. Ne oldu? Nasıl oldu? Bütün bunlar kara kutudan elde edilir. Benzer şekilde, burada bir kara kutu var.

Resim Kaynağı: https://cdn-images-1.medium.com/max/800/0*B5Qn9D5W4lscB86h.

Orijinal kara kutu gibi, konteyner kara kutumuz da her şeyi depolar. Tüm ikili veriler, 1 veya 0 vb. Kara kutuda saklanır. Peki otomasyon nasıl olur? Çok kolay, bir dizi komutunuz var ve docker-compose.yml tüm bağımlılıklarını açıklar. Bu otomasyon ve birleşik testlere yol açar. Uygulama detaylarına odaklanmaya gerek yoktur.

Sistem Teslimi

Resim Kaynağı: https://cdn-images-1.medium.com/max/800/0*DC5Ubn7Y5seJPeSO.

Projenizi kurmanın yeri ve zamanı önemli değil. Tüm ekosistemin hangi kısmını kuracağınız konusunda hiçbir fark yoktur. Yükleme işleminin sonucu her zaman aynı olacaktır. En önemli şey "boşuna" dır. Tarafınızdan, kurulumu kontrol eden değişkenleri belirtin.

Bütün bunlar için bir algoritma var. Adım adım listeleyelim.

(1) Dockerfiles'tan görüntüler toplayın.

(2) Görüntüleri teslim etmek için bir meta proje kullanın. Kubernet'leri Kube API'sı aracılığıyla teslim etmeleri gerekir. Gerekli giriş parametreleri:

(a) Kube API Bitiş Noktası

(b) Farklı bağlamlar için değişen gizli bir nesne (yerel / showroom / evreleme / üretim)

Sistem adları ve bu sistemler için Docker görüntülerinin etiketleri.

Örneğin, tüm sistemlerden ve hizmetlerden oluşan bir meta proje düşünün. Bu, projenin ekosistem düzenlemesini tanımladığı ve ayrıca güncellemelerin kendisine nasıl verildiğini de açıkladığı anlamına gelir. Bunun için Kube API ile entegrasyon için Ansible oyun kitaplarını kullanacağım. Ancak, başka seçenekler de var! Genel olarak, mimariyi yönetmek için merkezi bir yönde düşünmeniz gerekir. Bundan emin olduğunuzda, hizmetleri / sistemleri rahatça yönetebilirsiniz.

Showroom'da (manuel kontroller ve sistemin hata ayıklaması için) bir ortamın kurulması, sahnelenme (yakın ortamlar ve entegrasyon için) ve üretim (son kullanıcı için gerçek ortam) gereklidir.

Sürekli Teslimat ve Entegrasyon

Docker görüntülerini test etmek için birleşik bir yol izliyorsanız mutlu bir insansınız. Özellik dalını git deposunun akış yukarı veya ana dallarına sorunsuzca entegre etmenize yardımcı olur. Dikkat edilmesi gereken tek şey, entegrasyon ve teslimat sırasını korumaktır. Eğer bültenleri yoksa, birkaç paralel özellik dalına sahip bir sistemde “yarış koşulunu” nasıl önlersiniz?

Öyleyse çözüm nedir? Rekabet olmadığında süreç başlamalıdır.

Adımlar:

(1) Özellik dalını yukarı akış yönünde güncelleyin.

(2) Görüntüler oluşturun.

(3) Dahili görüntüleri test edin.

(4) 2. adım tamamlanıncaya ve görüntüler teslim edilinceye kadar başlayın ve bekleyin.

(5) 4. adım başarısız olursa, ekosistemi bir önceki adıma geri döndürün.

(6) Özellik dalını yukarı akışta birleştirin. Depoya gönder.

Yukarıdaki adımlardan herhangi biri başarısız olursa, teslimat süreci derhal sona erer. Görev çözülene kadar geliştiriciye iade edilir. Aynı süreç birden fazla depoda çalışabilir. Adımların her biri, ancak her depo için aynı şekilde yapılmalıdır. Örneğin, A deposu için adım 1 ve B deposu için adım vb.

Kubernet'ler, parçalar halinde güncellemeleri yayınlama özgürlüğü sunar. Çok sayıda AB testi başlatılabilir ve risk analizine tabi tutulabilir. Kubernet'ler hizmetleri ve uygulamaları dahili olarak ayırır.

Geri alma sistemleri

Güçlü bir mimari çerçevenin bazı önemli yeteneklerinden bir tanesi, geri alma kabiliyetidir. Çok sayıda açık ve kapalı nüans vardır. Onlara bir göz atalım:

(1) Hizmet, ortamını ayarlayabilmeli ve geri dönüş yapabilmelidir.

(2) Geri alma mümkün değilse, hizmet polimorfik olmalıdır. Kodun hem eski hem de yeni sürümlerini desteklemesi gerekir.

(3) Geri alma işleminden sonra herhangi bir servis için geriye dönük uyumluluk olmalıdır.

Kubernetes kümesinde, durumları geri almak kolaydır. Ancak, yalnızca meta projeniz bu anlık görüntünün bilgisini içeriyorsa işe yarar. Karmaşık teslim geri alma algoritmaları önerilmez, ancak gereklidir.

Öyleyse geri alma mekanizması hangi koşullar altında tetiklenmelidir?

(1) Serbest bırakıldıktan sonra uygulama hatalarının yüzdesi yüksek olduğunda.

(2) Kilit izleme noktalarından sinyal almaya başladığınızda.

(3) Duman testleri başarısız olduğunda.

(4) Manuel olarak yapılabilir.

Güvenlik önlemleri

Ekosistemi kurşun geçirmez hale getirmek kolay değildir. Sadece tek bir iş akışını izleyerek yapılamaz. Mimari çerçeve, herhangi bir sorunu çözebilecek kadar güvenli olmalıdır. Kubernet'ler erişim kontrolü, ağ politikaları, olayların denetimi vb. İçin bazı iyi yerleşik mekanizmalar ile birlikte gelir. Bilgi güvenliği için bazı araçlar vardır ve koruma açısından mükemmel oldukları kanıtlanmıştır.

Bir sonraki adım, geliştirme iş akışlarından mimariye

Esneklik, ölçeklenebilirlik, kullanılabilirlik, güvenilirlik, tehditlere karşı koruma vb. Sunan mimari bir çerçeve neredeyse zorunludur. Bu çok önemli bir şey. Aslında, bu ihtiyaç yeni bir konsepte yol açtı. Bir tahminin var mı? Evet DevOps. Komple otomasyon ve optimizasyon altyapısı konseptine öncülük etti.

Artık mimariyi Monolitik'ten Mikroservislere çevirme zamanı gelmişti. Hizmet odaklı bir mimarinin muazzam faydalarını sunar. En azından Docker ve Kubernet'ler için monolitik bir mimari kullanmak ideolojik olarak yanlıştır. Mikro hizmetler mimarisinin bazı noktalarını kesinlikle tartışacağım. DevOps hakkında ayrıntılı bilgi için, lütfen DevOps ile ilgili bu makaleyi okuyun.

Şimdi, ana kritik bileşenleri ve iyi bir mimarinin çözümlerini hızla tartışacağız.

Kritik Bileşenler

Sayı 1- Kimlik Servisi:

Kimlik mikro hizmeti “mikroservis olarak kimlik” anlamına gelir. Servisler hafiftir. Modülerlik sağlar ve uygulamaya esneklik sağlar. Kimlik mikro hizmeti güçlüdür ve tüm profil verilerine erişime sahiptir. Tüm uygulamaların merkezinde ihtiyaç duyulan her şeyi sağlama yeteneğine sahiptir.

IBM, Google, Microsoft vb. Gibi büyük kurumsal platformların müşterisi olmak istiyorsanız, erişim satıcının hizmetleri tarafından gerçekleştirilecektir. Peki ya kendi çözümünüzü istiyorsanız? Gelecek bölümdeki liste karar vermenize yardımcı olacaktır.

Sayı 2- Otomatik servis sağlama:

Yapılan hizmetler birbirinden bağımsızdır. Bu kolay gelişme ve daha az hataya yol açar. Ayrıca dinamik ve otomatik bir düzende diğer hizmetleri aramaya yardımcı olur.

Kubernet'ler ek bileşenlere olan ihtiyacı azaltır. Ancak yine de, yeni makinelerin eklenmesini otomatikleştirmek gerekiyor. İşte araçların listesi:

(1) KOPS - AWS veya GCE'ye küme yüklemenize yardımcı olur.

(2) Teraform - Herhangi bir ortam için altyapıyı yönetmenize yardımcı olur.

(3) Ansible - Her türlü otomasyon sunar.

Kişisel olarak Ansible'ı öneririm çünkü hem Kubernetes hem de sunucularla çalışmanıza yardımcı oluyor.

Sayı 3- Git deposu ve görev takibi:

Git depolarıyla, görevler kolaylıkla yapılabilir. Temel fikir küçük bir havuza sahip olmaktır. Bir çevre izleyicisi olarak hizmet vermektedir. İçerik, çeşitli servisler için ne tür sürümlerin kullanılacağını içerir. Bunun için tercih edilen kaynak kontrol sistemi “git” dir.

Tüm önemli tartışmalar için ekip çalışması ve kod saklama için uygun bir çalışma alanı bulunmalıdır. Ücretsiz bir servis istiyorsanız, Redmine için gidin. Aksi takdirde, Jira ücretli bir hizmettir ve oldukça kullanışlıdır. Kod deposu için Gerrit, ücretsiz olarak harika bir seçimdir!

Sayı 4- Docker Sicili:

Liman işçisi, bir tür depolama ve içerik dağıtım sistemidir. Docker görüntülerinin adını içerir ve farklı etiketli sürümlerde bulunur. Bir kayıt defteri ile etkileşime geçmek için, kullanıcı itme ve çekme komutlarını ateşlemelidir.

Liman görüntü yönetim sistemi oldukça önemlidir. Sistem ayrıca kullanıcılar ve bir grup kullanıcı için erişimi desteklemelidir. Bunun için bir bulut çözümü veya bazı özel barındırılan servisler seçin. Vmware Harbour iyi bir seçenek.

Sayı 5- CI / CD ve servis teslimi:

Sadece sürekli entegrasyon ve dağıtım servisi daha önce tartışılan bileşenleri bağlar. Sürekli teslimat, hizmetin basit ve herhangi bir mantıktan yoksun bırakılması anlamına gelir. CI / CD servisi sadece git deposundaki değişiklikler gibi dış dünyadaki olaylara tepki vermelidir.

Entegrasyon servisi, otomatik servis testi, servis sunumu, geri alma, servis kaldırma ve imaj oluşturma işlemlerinden sorumludur.

Sayı 6 - Günlük toplama ve analiz:

Herhangi bir mikro hizmet uygulamasında, sorunun izlenmesi önemlidir. Kayıt yardımı ile takip etmek mümkündür. Dolayısıyla, kayıt ve izleme size sistemin bütünsel bir görünümünü sağlar.

Günlüklere kök işleminin STDOUT veya STDERR'sine yazılarak erişilebilir hale getirilir. Günlük verileri gerektiğinde erişilebilir olmalıdır. Ayrıca geçmişten gelen kayıtları da içermelidir.

Sayı 7- İzleme, İzleme ve Uyarı:

Opentracing ve Zipkin gibi araçlar, hatayı anlamanıza yardımcı olur. Nerede yanlış yaptın? Bu araçlar, bu tür soruları cevaplamanıza yardımcı olacaktır. Hatalar olur ve onları izlemek önemlidir.

Dahası, izleme üç seviyeye ayrılmıştır. Bunlar fiziksel seviye, küme seviyesi ve servis seviyesidir. İzlemede hataların kapsamı yoktur. Prometheus ve OpsGenie gibi araçlar, izleme için oldukça yardımcı olduklarını kanıtladı. OpsGenie ayrıca tüm seviyelerdeki konular için uyarır ve bildirir. Dolayısıyla izleme, izleme ve uyarılar asla hafifletilmemelidir. Onlar uygulamanın savunma kısmıdır.

8 Numaralı ve Tek Oturum Açan API Ağ Geçidi:

Mikro hizmetlerde, tüm çağrılar yalnızca API Ağ Geçidi üzerinden yapılmalıdır. Güvenliğin korunmasına yardımcı olur. API isteklerinin yönlendirilmesinden de sorumludur. Bu yüzden API Ağ Geçidi, ilgili tüm mikro servisler için bir giriş noktasıdır. Tek oturum açma bir oturumu ifade eder. Bir tür kullanıcı doğrulama servisidir. İsme göre, giriş bilgileri bir defa veya bir defa ayarlanır. Daha sonra birden fazla uygulamaya erişmek için kullanılabilir.

Yetkilendirme, kimlik doğrulama, kullanıcı kaydı, tek oturum açma, vb. Gibi görevlerin yerine getirilmesi için güvenilir bir servise ihtiyaç duyulmaktadır.

Sayı 9- Etkinlik otobüsü:

Ekosistemde yüzlerce hizmet varsa, dikkatle ele alınmaları gerekir. Hizmet içi iletişim bir zorunluluktur ve hataya yer yoktur. Veri akışı kolaylaştırılmalıdır. Bir olay veriyolu, bir mikro hizmetten diğerine iyi yönlendirilmiş bir olay akışını belirtir.

Sayı 10- Veritabanları ve durum bilgisi olan hizmetler:

Mikro hizmet tabanlı bir uygulamada, genellikle çok sayıda hizmet vardır. Herkes için veri saklama gereksinimleri, hizmet rollerine göre farklıdır. Bu yüzden bazı servisler ilişkisel veri tabanı konusunda iyidir ve diğerleri MongoDB gibi bir NoSQL veri tabanına ihtiyaç duyabilirler.

Docker oyunun kurallarını değiştirdi. Veri tabanı, depolama dünyasında merkezi öneme sahip yer kaplar. Öyleyse çözüm ne olursa olsun, bir Kubernetes ortamında kolaylıkla çalışabilmelidir.

Gerçekliğe, mimariden gerçek hayata

Görüşlerimi paylaşırken sizlere oldukça dürüst olacağım. Gelecekte, tüm mimarilerin başarısızlık olarak kabul edileceğine inanıyorum. Tasarım ilkeleri, temelleri vb. Her şey değişiyor! Ama oyunun başında kalmalısın. Bunun için profesyonel topluluğa entegre edin. Er ya da geç, bu değişikliklere uyum sağlamak zorunda kalacaksınız. Öyleyse neden şimdi başlamıyorsun?

Pek çok fırsat var ancak yalnızca yeni teknolojik güncellemelerle kendinizi güncellerseniz.

Şimdi bu makalenin başlığına döneceğim. Docker ve Kubernet'ler en iyi mimariye sahip mi? Şimdilik, kesinlikle “Evet”. Ancak bu, şimdilik yalnızca en iyi mimari olabilir. Daha fazlası için çalışın, daha iyisini daha iyi bir mimari oluşturmak için çabalayın!

Hepinizle birkaç faydalı bağlantı paylaşıyorum.

Docker Makalesi: Docker Eğitimi: Konteynerler, VM'ler ve Yeni Başlayanlar İçin Docker

Docker Video Eğitimi: Docker Video Eğitimi Serisi

Kubernet'leri Makale: Yeni Başlayanlar ve Geliştiriciler İçin Kubernetler İncil'i

Kubernetes Video Eğitimi: Kubernetes Video Eğitimi Serisi