Kubernetes Nedir? Konteynerleştirme ve Dağıtım Kılavuzu

Yayınlanan: 2022-03-11

Kısa bir süre önce, monolit web uygulamasını kullandık: devasa, yavaş hareket eden, yönetilmesi zor devlere dönüşene kadar yeni işlevler ve özelliklerle büyüyen devasa kod tabanları. Artık artan sayıda geliştirici, mimar ve DevOps uzmanı, mikro hizmetleri kullanmanın dev bir monolitten daha iyi olduğu görüşüne geliyor. Genellikle, mikro hizmet tabanlı bir mimari kullanmak, monolitinizi en az iki uygulamaya bölmek anlamına gelir: ön uç uygulaması ve arka uç uygulaması (API). Mikro hizmetleri kullanma kararından sonra bir soru ortaya çıkar: Mikro hizmetleri hangi ortamda çalıştırmak daha iyidir? Hizmetimi istikrarlı, yönetimi ve dağıtımı kolay hale getirmek için ne seçmeliyim? Kısa cevap şudur: Docker kullanın!

Bu makalede, size kapsayıcıları tanıtacağım, Kubernetes'i açıklayacağım ve CircleCI kullanarak bir uygulamanın nasıl kapsayıcı hale getirilip Kubernetes kümesine dağıtılacağını öğreteceğim.

Liman işçisi? Docker nedir?

Docker, DevOps'u (ve hayatınızı) kolaylaştırmak için tasarlanmış bir araçtır. Bir geliştirici, Docker ile kapsayıcılarda uygulamalar oluşturabilir, dağıtabilir ve çalıştırabilir. Kapsayıcılar, bir geliştiricinin bir uygulamayı kitaplıklar ve diğer bağımlılıklar gibi ihtiyaç duyduğu tüm parçalarla paketlemesine ve hepsini tek bir paket olarak göndermesine olanak tanır.

Bir ana bilgisayara dağıtılan uygulamalarla bir kapsayıcıda paketlenmiş bir uygulama arasında karşılaştırma

Bir ana bilgisayara dağıtılan uygulamalarla bir kapsayıcıda paketlenmiş bir uygulama arasında karşılaştırma

Geliştiriciler, kapsayıcıları kullanarak bir görüntüyü herhangi bir işletim sistemine kolayca (yeniden) dağıtabilir. Sadece Docker'ı kurun, bir komut yürütün ve uygulamanız çalışır durumda. Oh, ve ana işletim sistemindeki kitaplıkların yeni sürümüyle herhangi bir tutarsızlık hakkında endişelenmeyin. Ek olarak, aynı ana bilgisayarda daha fazla kapsayıcı başlatabilirsiniz; aynı uygulama mı yoksa başka bir uygulama mı olacak? Önemli değil.

Docker harika bir araç gibi görünüyor. Ancak kapsayıcıları nasıl ve nerede başlatmalıyım?

Container'ların nasıl ve nerede çalıştırılacağına ilişkin birçok seçenek vardır: AWS Elastic Container Service (AWS Fargate veya yatay ve dikey otomatik ölçeklendirmeye sahip ayrılmış bir bulut sunucusu); Azure veya Google Cloud'da önceden tanımlanmış Docker görüntüsüne sahip bir bulut örneği (şablonlar, örnek grupları ve otomatik ölçeklendirme ile); Docker ile kendi sunucunuzda; ya da elbette Kubernet'ler! Kubernetes, 2014 yılında Google mühendisleri tarafından özellikle sanallaştırma ve kapsayıcılar için oluşturulmuştur.

Kubernet'ler mi? Bu nedir?

Kubernetes, kapsayıcıları çalıştırmanıza, bunları yönetmenize, dağıtımları otomatikleştirmenize, dağıtımları ölçeklendirmenize, girişler oluşturmanıza ve yapılandırmanıza, durum bilgisi olmayan veya durum bilgisi olan uygulamaları dağıtmanıza ve daha pek çok şeye olanak tanıyan açık kaynaklı bir sistemdir. Temel olarak, bir veya daha fazla bulut sunucusu başlatabilir ve bunları bir Kubernetes kümesi olarak çalıştırmak için Kubernetes'i yükleyebilirsiniz. Ardından Kubernetes kümesinin API uç noktasını alın, kubectl (Kubernetes kümelerini yönetmek için bir araç) yapılandırın ve Kubernetes hizmete hazırdır.

Peki neden kullanmalıyım?

Kubernetes ile hesaplama kaynaklarından maksimum düzeyde yararlanabilirsiniz. Kubernetes ile yelkenlerinizi dolduran Kubernetes ile geminizin (altyapısının) kaptanı olacaksınız. Kubernetes ile hizmetiniz HA olacaktır. Ve en önemlisi, Kubernetes ile büyük miktarda paradan tasarruf edeceksiniz.

Umut verici görünüyor! Özellikle paradan tasarruf edecekse! Bunun hakkında daha fazla konuşalım!

Kubernetes günden güne popülerlik kazanıyor. Daha derine inelim ve kaputun altında ne olduğunu araştıralım.

Kaputun Altında: Kubernetes Nedir?

Kubernetes nedir? Kaputun altında Kubernetes'i oluşturan bileşenler

Kubernetes'i oluşturan bileşenler

Kubernetes, tüm sistemin adıdır, ancak arabanız gibi, Kubernetes'in çalışmasını sağlamak için mükemmel bir uyum içinde birlikte çalışan birçok küçük parça vardır. Ne olduklarını öğrenelim.

Ana Düğüm – Tüm Kubernetes kümesi için bir kontrol paneli. Ana bileşenin bileşenleri, kümedeki herhangi bir düğümde çalıştırılabilir. Anahtar bileşenler şunlardır:

  • API sunucusu: Kullanıcı tarafından erişilebilen Ana Düğümün tek bileşeni olan tüm REST komutları için giriş noktası.
  • Veri deposu : Kubernetes kümesi tarafından kullanılan güçlü, tutarlı ve yüksek düzeyde kullanılabilir anahtar/değer depolaması.
  • Zamanlayıcı: Yeni oluşturulan bölmeleri izler ve bunları düğümlere atar. Bölmelerin ve hizmetlerin düğümlere dağıtımı, zamanlayıcı nedeniyle gerçekleşir.
  • Denetleyici yöneticisi: Kümedeki rutin görevleri yerine getiren tüm denetleyicileri çalıştırır.
  • Çalışan düğümleri: Minion düğümleri olarak da adlandırılan birincil düğüm aracısı. Kapsüller burada çalıştırılır. Çalışan düğümler, kapsayıcılar arasındaki ağ iletişimini yönetmek, ana düğümle iletişim kurmak ve zamanlanan kapsayıcılara kaynak atamak için gerekli tüm hizmetleri içerir.
  • Docker: Her çalışan düğümde çalışır ve görüntüleri ve başlangıç ​​kapsayıcılarını indirir.
  • Kubelet: Bir kapsülün durumunu izler ve kapsayıcıların çalışır durumda olmasını sağlar. Ayrıca veri deposuyla iletişim kurar, hizmetler hakkında bilgi alır ve yeni oluşturulanlar hakkında ayrıntılar yazar.
  • Kube-proxy: Tek bir çalışan düğümdeki bir hizmet için bir ağ proxy'si ve yük dengeleyici. Trafik yönlendirmesinden sorumludur.
  • Kubectl: Kullanıcıların Kubernetes API sunucusuyla iletişim kurması için bir CLI aracı.

Kapsüller ve hizmetler nelerdir?

Bölmeler , Kubernetes kümesinin en küçük birimidir, devasa bir binanın duvarındaki tek bir tuğla gibidir. Bir bölme, birlikte çalışması gereken ve kaynakları (Linux ad alanları, grup grupları, IP adresleri) paylaşabilen bir kapsayıcı kümesidir. Baklaların uzun yaşaması amaçlanmamıştır.

Hizmetler , bir dizi bölmenin üzerinde bir soyutlamadır ve genellikle diğer hizmetlerin kendisiyle sanal bir IP adresi aracılığıyla iletişim kurması için üstte bir proxy gerektirir.

Basit Dağıtım Örneği

Farklı paydaşların Kubernetes destekli bir uygulamayla nasıl etkileşime girdiği

Farklı paydaşların Kubernetes destekli bir uygulamayla nasıl etkileşime girdiği

Kubernetes'i çalıştırmak için bir platform olarak basit bir Ruby on Rails uygulaması ve GKE kullanacağım. Aslında, Kubernetes'i AWS veya Azure'da kullanabilir, hatta kendi donanımınızda bir küme oluşturabilir veya bu sayfada bulacağınız tüm seçenekleri minikube kullanarak yerel olarak Kubernetes çalıştırabilirsiniz.

Bu uygulamanın kaynak dosyaları bu GitHub deposunda bulunabilir.

Yeni bir Rails uygulaması oluşturmak için şunu yürütün:

 rails new blog

MySQL bağlantısını config/database.yml file üretim için yapılandırmak için:

 production: adapter: mysql2 encoding: utf8 pool: 5 port: 3306 database: <%= ENV['DATABASE_NAME'] %> host: 127.0.0.1 username: <%= ENV['DATABASE_USERNAME'] %> password: <%= ENV['DATABASE_PASSWORD'] %>

Bir Makale modeli, denetleyici, görünümler ve geçiş oluşturmak için şunu yürütün:

 rails g scaffold Article title:string description:text

Gemfile'e mücevher eklemek için:

 gem 'mysql2', '< 0.6.0', '>= 0.4.4' gem 'health_check'

Docker görüntüsünü oluşturmak için Dockerfile dosyamı alın ve şunu çalıştırın:

 docker build -t REPO_NAME/IMAGE_NAME:TAG . && docker push REPO_NAME/IMAGE_NAME:TAG

Bir Kubernetes kümesi oluşturmanın zamanı geldi. GKE sayfasını açın ve Kubernetes kümesi oluşturun. Küme oluşturulduğunda, “Bağlan düğmesine” tıklayın ve komutu kopyalayın; gCloud CLI aracının (nasıl yapılır) ve kubectl'nin kurulu ve yapılandırılmış olduğundan emin olun. Bilgisayarınızda kopyalanan komutu yürütün ve Kubernetes kümesine olan bağlantıyı kontrol edin; kubectl cluster-info yürütün.

Uygulama, k8s kümesine dağıtılmaya hazır. Bir MySQL veritabanı oluşturalım. SQL sayfasını gCloud konsolunda açın ve uygulama için bir MySQL DB örneği oluşturun. Örnek hazır olduğunda, kullanıcıyı ve DB'yi oluşturun ve örnek bağlantı adını kopyalayın.

Ayrıca, sepet konteynerinden MySQL DB'ye erişmek için API ve Hizmetler sayfasında bir hizmet hesabı anahtarı oluşturmamız gerekiyor. Bu işlem hakkında daha fazla bilgiyi burada bulabilirsiniz. İndirilen dosyayı service-account.json olarak yeniden adlandırın. O dosyaya daha sonra geri döneceğiz.

Uygulamamızı Kubernetes'e dağıtmaya hazırız, ancak önce uygulamamız için gizli diziler oluşturmalıyız - Kubernetes'te hassas verileri depolamak için oluşturulan gizli bir nesne. Önceden indirilen service-account.json dosyasını yükleyin:

 kubectl create secret generic mysql-instance-credentials \ --from-file=credentials.json=service-account.json

Uygulama için sırlar oluşturun:

 kubectl create secret generic simple-app-secrets \ --from-literal=username=$MYSQL_PASSWORD \ --from-literal=password=$MYSQL_PASSWORD \ --from-literal=database-name=$MYSQL_DB_NAME \ --from-literal=secretkey=$SECRET_RAILS_KEY

Değerlerinizi değiştirmeyi veya ortam değişkenlerini kendi değerlerinizle ayarlamayı unutmayın.

Bir dağıtım oluşturmadan önce, dağıtım dosyasına bir göz atalım. Üç dosyayı bir dosyada birleştirdim; ilk kısım, 80 numaralı bağlantı noktasını ortaya çıkaracak ve 80 numaralı bağlantı noktasına gelen tüm bağlantıları 3000'e iletecek bir hizmettir. Hizmetin, bağlantıları hangi bölmelere iletmesi gerektiğini bilen bir seçicisi vardır.

Dosyanın bir sonraki bölümü, dağıtım stratejisini açıklayan dağıtımdır; bölme içinde başlatılacak kapsayıcılar, ortam değişkenleri, kaynaklar, incelemeler, her kapsayıcı için bağlamalar ve diğer bilgiler.

Son kısım, Yatay Pod Otomatik Ölçekleyicidir. HPA'nın oldukça basit bir yapılandırması var. Dağıtım bölümünde kapsayıcı için kaynak ayarlamazsanız HPA'nın çalışmayacağını unutmayın.

GKE düzenleme sayfasında Kubernetes kümeniz için Dikey Otomatik Ölçekleyici'yi yapılandırabilirsiniz. Ayrıca oldukça basit bir konfigürasyona sahiptir.

GKE kümesine göndermenin zamanı geldi! Öncelikle migrasyonları job üzerinden çalıştırmalıyız. Uygulamak:

kubectl apply -f rake-tasks-job.yaml – Bu iş CI/CD işlemi için faydalı olacaktır.

kubectl apply -f deployment.yaml - hizmet, dağıtım ve HPA oluşturmak için.

Ardından şu komutu uygulayarak bölmenizi kontrol edin: kubectl get pods -w

 NAME READY STATUS RESTARTS AGE sample-799bf9fd9c-86cqf 2/2 Running 0 1m sample-799bf9fd9c-887vv 2/2 Running 0 1m sample-799bf9fd9c-pkscp 2/2 Running 0 1m

Şimdi uygulama için bir giriş oluşturalım:

  1. Statik bir IP oluşturun: gcloud compute addresses create sample-ip --global
  2. Girişi (dosyayı) oluşturun: kubectl apply -f ingress.yaml
  3. Girişin oluşturulduğunu kontrol edin ve IP'yi alın: kubectl get ingress -w
  4. Uygulamanız için etki alanı/alt etki alanı oluşturun.

CI/CD

CircleCI kullanarak bir CI/CD işlem hattı oluşturalım. Aslında, CircleCI kullanarak bir CI/CD ardışık düzeni oluşturmak kolaydır, ancak bunun gibi testler olmadan hızlı ve kirli tam otomatik bir dağıtım sürecinin küçük projeler için işe yarayacağını unutmayın, ancak lütfen bunu ciddi bir şey için yapmayın çünkü , herhangi bir yeni kodun üretimde sorunları varsa, para kaybedersiniz. Bu nedenle, sağlam bir dağıtım süreci tasarlamayı, tam kullanıma sunmadan önce kanarya görevlerini başlatmayı, kanarya başladıktan sonra günlüklerdeki hataları kontrol etmeyi ve benzeri şeyleri düşünmelisiniz.

Şu anda küçük, basit bir projemiz var, bu yüzden tam otomatik, testsiz, CI/CD dağıtım süreci oluşturalım. İlk olarak, CircleCI'yi deponuzla entegre etmelisiniz - tüm talimatları burada bulabilirsiniz. Ardından CircleCI sistemi için talimatları içeren bir yapılandırma dosyası oluşturmalıyız. Yapılandırma oldukça basit görünüyor. Ana noktalar, GitHub deposunda iki dalın olmasıdır: master ve production .

  1. Ana dal , yeni kod için geliştirme içindir. Biri ana dala yeni kod gönderdiğinde, CircleCI ana dal için bir iş akışı başlatır—derleme ve test kodu.
  2. Üretim dalı , üretim ortamına yeni bir sürüm dağıtmak içindir. Üretim şubesi için iş akışı şu şekildedir: yeni bir oluşturma ve devreye alma sürecini tetiklemek için yeni kodu itin (veya daha iyisi, ana şubeden üretime PR'yi açın); derleme sırasında, CircleCI yeni Docker görüntüleri oluşturur, bunu GCR'ye iletir ve dağıtım için yeni bir dağıtım oluşturur; kullanıma sunma başarısız olursa, CircleCI geri alma işlemini tetikler.

Herhangi bir derlemeyi çalıştırmadan önce CircleCI'de bir proje yapılandırmalısınız. API'de yeni bir hizmet hesabı ve GCloud'da şu rollerle bir Hizmetler sayfası oluşturun: GCR ve GKE'ye tam erişim, indirilen JSON dosyasını açın ve içeriği kopyalayın, ardından CircleCI'de proje ayarlarında şu adla yeni bir ortam değişkeni oluşturun GCLOUD_SERVICE_KEY ve hizmet hesabı dosyasının içeriğini bir değer olarak yapıştırın. Ayrıca, sonraki env değişkenlerini oluşturmanız gerekir: GOOGLE_PROJECT_ID (bunu GCloud konsolu ana sayfasında bulabilirsiniz), GOOGLE_COMPUTE_ZONE (GKE kümeniz için bir bölge) ve GOOGLE_CLUSTER_NAME (GKE küme adı).

CircleCI'deki son adım (dağıtım) şöyle görünecektir:

 kubectl patch deployment sample -p '{"spec":{"template":{"spec":{"containers":[{"name":"sample","image":"gcr.io/test-d6bf8/simple:'"$CIRCLE_SHA1"'"}]}}}}' if ! kubectl rollout status deploy/sample; then echo "DEPLOY FAILED, ROLLING BACK TO PREVIOUS" kubectl rollout undo deploy/sample # Deploy failed -> notify slack else echo "Deploy succeeded, current version: ${CIRCLE_SHA1}" # Deploy succeeded -> notify slack fi deployment.extensions/sample patched Waiting for deployment "sample" rollout to finish: 2 out of 3 new replicas have been updated... Waiting for deployment "sample" rollout to finish: 2 out of 3 new replicas have been updated... Waiting for deployment "sample" rollout to finish: 2 out of 3 new replicas have been updated... Waiting for deployment "sample" rollout to finish: 1 old replicas are pending termination... Waiting for deployment "sample" rollout to finish: 1 old replicas are pending termination... Waiting for deployment "sample" rollout to finish: 1 old replicas are pending termination... Waiting for deployment "sample" rollout to finish: 2 of 3 updated replicas are available... Waiting for deployment "sample" rollout to finish: 2 of 3 updated replicas are available... deployment "sample" successfully rolled out Deploy succeeded, current version: 512eabb11c463c5431a1af4ed0b9ebd23597edd9

Çözüm

Görünüşe göre yeni Kubernetes kümesi oluşturma süreci o kadar da zor değil! Ve CI/CD süreci gerçekten harika!

Evet! Kubernetes harika! Kubernetes ile sisteminiz daha stabil, kolay yönetilebilir olacak ve sizi sisteminizin kaptanı yapacaktır. Kubernetes sistemi biraz oyunlaştıracak ve pazarlamanız için +100 puan verecek!

Artık temel bilgilere sahip olduğunuza göre, daha ileri gidebilir ve bunu daha gelişmiş bir yapılandırmaya dönüştürebilirsiniz. Gelecekteki bir makalede daha fazlasını ele almayı planlıyorum, ancak bu arada, işte bir zorluk: Kümenin içinde bulunan durum bilgili bir DB ile uygulamanız için sağlam bir Kubernetes kümesi oluşturun (yedekleme yapmak için sepet Pod dahil), içine Jenkins kurun CI/CD ardışık düzeni için aynı Kubernetes kümesi ve Jenkins'in yapılar için bağımlı olarak bölmeleri kullanmasına izin verin. Girişiniz için bir SSL sertifikası eklemek/almak için certmanager kullanın. Stackdriver'ı kullanarak uygulamanız için bir izleme ve uyarı sistemi oluşturun.

Kubernetes harikadır çünkü kolayca ölçeklenir, satıcıya kilitlenme yoktur ve bulut sunucuları için ödeme yaptığınız için paradan tasarruf edersiniz. Bununla birlikte, herkes bir Kubernetes uzmanı değildir veya yeni bir küme oluşturmak için zamana sahip değildir - alternatif bir görüş için, Toptaler arkadaşı Amin Shah Gilani, Heroku, GitLab CI ve zaten çözdüğü büyük miktarda otomasyonu kullanmayı öneriyor. Daha fazla kod yazmak ve daha az işlem görevi yapmak için Etkili Bir İlk Dağıtım İşlem Hattı Nasıl Oluşturulur bölümünde.

İlişkili:
  • Matematiği Yapın: Orkestratörlerle Mikro Hizmet Uygulamalarını Otomatik Ölçeklendirme
  • K8'ler/Kubernetes: AWS ve GCP ve Azure
  • Bir Kubernetes Hizmet Ağı Karşılaştırması