Web Semineri Serisi: Kubernetes'te Durumsal Hizmetlerin Dağıtımı

Bu makalede, buluttaki kapsayıcı iş yüklerinin dağıtımı ve yönetilmesiyle ilgili bir web semineri dizisi tamamlanmaktadır. Seri, konteyner yaşam döngülerini yönetmek, çoklu konteyner uygulamalarını dağıtmak, iş yüklerini ölçeklemek ve Kubernet'lerle çalışmak da dahil olmak üzere, kapsayıcıların temellerini kapsar. Ayrıca, durum bilgisi olan uygulamaları çalıştırmak için en iyi uygulamaları vurgular.

Bu eğitim dizinin beşinci oturumundaki Kubernetes'teki Durumsal Servisleri Dağıtma kavramlarını ve komutlarını içerir.

Giriş

Kubernetes, konteyner uygulamaları yönetmek için açık kaynaklı bir konteyner orkestrasyon aracıdır. Bu serinin önceki bölümlerinde Kubernetes'in yapı taşlarını ve paketlenmiş kapları Kubernetes ReplicaSets olarak öğrendiniz. ReplicaSets, durum bilgisi olmayan Pod'ların kullanılabilirliğini sağlarken, veritabanı kümeleri gibi durum bilgisi olan iş yükleriyle birlikte kullanılamaz.

Kubernetes'teki çağdaş bulut-yerel uygulamalarını paketlemek, dağıtmak, yönetmek ve ölçeklendirmek kolay olsa da, kapsayıcı bir ortamda veritabanları ve içerik yönetim sistemleri gibi geleneksel iş yüklerini dağıtma ve yönetme farklı bir yaklaşım gerektirir. StatefulSets, Kubernetes ReplicaSet'in esnekliğini durum bilgisi olan iş yüklerine getirir.

Bu eğitim dizisinin son bölümünde, Kubernetes için popüler bir açık kaynak paket yöneticisi olan Helm'ı kullanarak bir StatefulSet olarak Kubernetes'te oldukça kullanışlı bir MongoDB ReplicaSet kullanacaksınız.

Ön şartlar

Bu eğiticiyi tamamlamak için şunlara ihtiyacınız olacak:

  • DigitalOcean'da çalışan ve StackPointCloud aracılığıyla yüklenen, Kubernetes ile çalışmaya başlamak için aşağıdakileri uygulayabileceğiniz etkin bir Kubernetes kümesi.
  • Node.js ve MongoDB'ye dayanan Kubernetes'teki öğretici Deploying ve Scaling Microservices'da sunulan örnek web uygulaması, veritabanına yüksek kullanılabilirlik sağlamak için genişletildi. Uygulama tasarımı ile ilgili ayrıntılar için, Building Containerized Applications eğiticisine başvurunuz.
  • Docker görüntüsünü uygulama için saklamak için aktif bir Docker Hub hesabı.
  • Git yüklü yerel bir makine
    • MacOS kullanıyorsanız, Homebrew'ın kurulu olduğundan emin olun.
  • demlemek kubernetes-helm

Output==> Downloading https://homebrew.bintray.com/bottles/kubernetes-helm-2.8.2.high_sierra.bottle.tar.gz
...
==> Summary
🍺 /usr/local/Cellar/kubernetes-helm/2.8.2: 50 files, 121.7MB

Helm yüklendikten sonra, geçerli sürümünü kontrol ederek çalıştırabildiğini doğrulayın.

  • dümen versiyonu

OutputClient: &version.Version{SemVer:"v2.7.2", GitCommit:"8478fb4fc723885b155c924d1c8c410b7a9444e6", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.8.2", GitCommit:"a80231648a1473929271764b920a8e346f6de844", GitTreeState:"clean"}

Bu, istemcinin uygun şekilde kurulduğunu ve Tiller ile konuşabileceğini doğrular.

Bir sonraki adımda, Kubernet'lerde MongoDB ReplicaSet'i dağıtmak için Helm kullanacağız.

Adım 2 – Kubernetes'te MongoDB ReplicaSet'i Dağıtma

Kubernetes'teki bir StorageClass, yöneticilerin sundukları depolama "sınıflarını" tanımlamaları için bir yol sağlar. Örneğin, kullanıcılar bir depolama birimi istediğinde, StorageClass hangi depolama alanı arka sınıfının bunlardan sağlanacağını belirler. Sınıflar standart HDD ve daha hızlı bir SSD içerebilir. Sahne arkasında, StorageClass depolama sağlaması için bulut sağlayıcısı API'si gibi altta yatan altyapıyla etkileşime girer.

MongoDB verilerini depolamak için kalıcı depolama alanına gereksiniminiz olduğundan, bir çalışan düğümüne bir DigitalOcean Block Storage birimi eklemek ve MongoDB Pod'u kalıcılık için depolama birimini kullanmak üzere işaret etmek isteyebilirsiniz.

Bu durumda StorageClass, Pod ve DigitalOcean blok depolama hizmeti arasında bir arabirim görevi görür. Bir blok depolama birimi isteğinde bulunduğunuzda, StorageClass bir blok depolama biriminin nasıl ayrılacağını bilen önceden yapılandırılmış sürücüye konuşur.

StackPointCloud, DigitalOcean depolama sürücüsünü kurar ve kurulum sırasında StorageClass'ı Kubernetes ile kaydeder. Bu, sürücüyü ve StorageClass'ı kurma ve yapılandırma ile ilgili adımlardan kurtarır.

MongoDB kümesini dağıtmadan önce, DigitalOcean birimleri için StorageClass'ın yapılandırıldığından emin olun:

  • kubectl storageclass olsun

Çıkış, StorageClass'ın yapılandırıldığını ve hazır olduğunu onaylar.

[secondary_label Output
NAME PROVISIONER AGE
digitalocean (default) digitalocean/flex-volume-provisioner 1d

Ardından, MongoDB ReplicaSet'i DigitalOcean StorageClass tabanlı olarak yapılandıracak ve dağıtacaksınız.

Projeniz için yeni bir dizin oluşturun ve yeni dizine geçin:

  • mkdir ~ / mongo-rs
  • cd ~ / mongo-rs

GitHub'dan Helm Chart deposunu klonlayın:

  • git klon https://github.com/kubernetes/charts.git

MongoDB ReplicaSet dizinine ( charts/stable/mongodb-replicaset/ ) gidin ve values.yaml dosyasının mevcut olduğunu doğrulayın.

  • cd çizelgeleri / kararlı / mongodb-replicaset /
  • ls değerler.yaml

Outputvalues.yaml

Bu dosya, grafik için parametreleri ve yapılandırmayı içerir. DigitalOcean StorageClass'ı kullanmak için MongoDB ReplicaSet'i yapılandırmak için bu dosyayı değiştirmelisiniz.

values.yaml düzenle:

  • nano değerleri.yaml

Aşağıdaki bölümü bulun ve uncomment:

values.yaml...
# storageClass: "-"
...

"-" ile "digitalocean" şu şekilde değiştirin:

values.yaml...
storageClass: "digitalocean"
...

Dosyayı kaydedin ve düzenleyicinizden çıkın.

Şimdi ~/mongo-rs klasörüne gidin.

  • cd ~ / mongo-rs

Artık, MongoDB ReplicaSet'i, DigitalOcean'ın blok depolama birimi tarafından desteklenen Kubernetes kümenize dağıtmaya hazırsınız. Veritabanı kümesini başlatmak için aşağıdaki komutu çalıştırın.

  • helm install --name = todo -f çizelgeleri / kararlı / mongodb-replicaset / values.yaml kararlı / mongodb-replicaset

Yukarıdaki komutta --name Helm grafiğin adını gösterir. -f anahtarı, values.yaml depolanan yapılandırma ayarlarına işaret eder.

Çıktının hemen çıktısını grafik oluşturmanın başladığını doğrulayacaksınız.

OutputNAME: todo
LAST DEPLOYED: Sat Mar 31 10:37:06 2018
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
todo-mongodb-replicaset ClusterIP None <none> 27017/TCP 1s

==> v1beta1/StatefulSet
NAME DESIRED CURRENT AGE
todo-mongodb-replicaset 3 1 0s

==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
todo-mongodb-replicaset-0 0/1 Init:0/2 0 0s

==> v1/ConfigMap
NAME DATA AGE
todo-mongodb-replicaset 1 1s
todo-mongodb-replicaset-tests 1 1s

NOTES:
1. After the statefulset is created completely, one can check which instance is primary by running:

$ for ((i = 0; i < 3; ++i)); do kubectl exec --namespace default todo-mongodb-replicaset-$i -- sh -c 'mongo --eval="printjson(rs.isMaster())"'; done

2. One can insert a key into the primary instance of the mongodb replica set by running the following:
MASTER_POD_NAME must be replaced with the name of the master found from the previous step.

$ kubectl exec --namespace default MASTER_POD_NAME -- mongo --eval="printjson(db.test.insert({key1: 'value1'}))"

3. One can fetch the keys stored in the primary or any of the slave nodes in the following manner.
POD_NAME must be replaced by the name of the pod being queried.

$ kubectl exec --namespace default POD_NAME -- mongo --eval="rs.slaveOk(); db.test.find().forEach(printjson)"

Şimdi kümenin durumunu izlemek için bir dizi komut çalıştıralım.

Önce StatefulSet'e bakın:

  • kubectl statefulset olsun

Bu komut MongoDB ReplicaSet'in Kubernetes StatefulSet olarak oluşturulduğunu onaylar.

OutputNAME DESIRED CURRENT AGE
todo-mongodb-replicaset 3 2 2m

Şimdi Pod'ları keşfedin:

  • kubectl bakla almak

Pod'ların sayısı ve adlandırma kuralı, MongoDB ReplicaSet'in başarıyla yapılandırıldığını gösterir:

OutputNAME READY STATUS RESTARTS AGE
todo-mongodb-replicaset-0 1/1 Running 0 3m
todo-mongodb-replicaset-1 1/1 Running 0 1m
todo-mongodb-replicaset-2 1/1 Running 0 54s

Her Pod'un bir StatefulSet'in ayırt edici bir özelliği olan bir ardışık sayı ile biten bir son eki olduğuna dikkat edin.

Şimdi MongoDB örneklerinin birbiriyle iletişim kurup kurmadığını kontrol edelim. Pod'lardan birinin içinde MongoDB kabuğunda bir komut çalıştırarak bunu yapacağız.

Ana bilgisayarlardan birinde mongo konsolunu başlatmak için kubectl kullanın:

  • kubectl exec -it todo-mongodb-replicaset-0 mongo

Bağlandıktan sonra kendinizi MongoDB kabuğunda bulacaksınız:

OutputMongoDB shell version v3.6.3
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.6.3
Welcome to the MongoDB shell.
For interactive help, type "help".
...

2018-03-31T05:08:20.239+0000 I CONTROL [initandlisten]

ReplicaSet'in yapılandırmasını aşağıdaki komutla kontrol edin:

  • rs.conf ()

Çıktı, ReplicaSet olarak çalışan üç MongoDB örneğinin olduğunu doğrular.

Output{
"_id" : "rs0",
"version" : 3,
"protocolVersion" : NumberLong(1),
"members" : [
{
"_id" : 0,
"host" : "todo-mongodb-replicaset-0.todo-mongodb-replicaset.default.svc.cluster.local:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {

},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 1,
"host" : "todo-mongodb-replicaset-1.todo-mongodb-replicaset.default.svc.cluster.local:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {

},
"slaveDelay" : NumberLong(0),
"votes" : 1
},
{
"_id" : 2,
"host" : "todo-mongodb-replicaset-2.todo-mongodb-replicaset.default.svc.cluster.local:27017",
"arbiterOnly" : false,
"buildIndexes" : true,
"hidden" : false,
"priority" : 1,
"tags" : {

},
"slaveDelay" : NumberLong(0),
"votes" : 1
}
],
"settings" : {
"chainingAllowed" : true,
"heartbeatIntervalMillis" : 2000,
"heartbeatTimeoutSecs" : 10,
"electionTimeoutMillis" : 10000,
"catchUpTimeoutMillis" : -1,
"catchUpTakeoverDelayMillis" : 30000,
"getLastErrorModes" : {

},
"getLastErrorDefaults" : {
"w" : 1,
"wtimeout" : 0
},
"replicaSetId" : ObjectId("5abdb4f61d952afc4b0b8218")
}
}

MongoDB konsolundan çıkın:

  • çıkış

Bu, uzak ana makinenizden de sizi kesecek.

Gears'ı değiştirelim ve küme ile ilişkili blok depolama birimleri için DigitalOcean kontrol panelini kontrol edelim. DigitalOcean hesabınıza giriş yapın ve Birimler sekmesini seçin:

Her biri 10GB'lık üç cildin Kubernetes çalışan düğümlerine bağlı olduğunu görebilirsiniz. MongoDB StatefulSet'in her Pod'u, verileri blok depolama birimlerinden birinde depolamaktadır. values.yaml boyut, persistentVolume bölümünde bulunan values.yaml olarak tanımlanır.

values.yamlpersistentVolume:
enabled: true
## mongodb-replicaset data Persistent Volume Storage Class
## If defined, storageClassName: <storageClass>
## If set to "-", storageClassName: "", which disables dynamic provisioning
## If undefined (the default) or set to null, no storageClassName spec is
## set, choosing the default provisioner. (gp2 on AWS, standard on
## GKE, AWS & OpenStack)
##
storageClass: digitalocean
accessModes:
- ReadWriteOnce
size: 10Gi
annotations: {}

Kubernetes'te çalışan çok kullanışlı bir MongoDB ReplicaSet'i başarıyla yapılandırdınız.

Şimdi MongoDB kümesine konuşan web uygulamasını konuşalım.

3. Adım – Web Uygulamasını Kubernetes'te Dağıtma ve Ölçeklendirme

MongoDB kümelenmesinin avantajlarından yararlanmak için bu ders dizisinin önceki bölümlerinde kullandığımız ToDo Node.js uygulamasını genişletelim.

Not : Kapsayıcı görüntüsünü kaynak koddan da oluşturabilir veya doğrudan Kubernetes dosyalarındaki YAML dosyalarını kullanabilirsiniz. Görüntünün oluşturulmasına ve uygulamanın Kubernetes'e dağıtılmasına ilişkin adımlar için Kubernetes'teki Öğretici Dağıtma ve Ölçekleme Mikroservislerine bakın.

Yeni bir çalışma dizini oluşturarak başlayın:

  • mkdir ~ / web-uygulaması
  • cd ~ / web-uygulaması

Sonra kod ve Kubernetes eserler içeren ToDo uygulamasının deposunu kopyalayın.

  • git klonu https://github.com/janakiramm/todo.git

Kubernetes yapılandırma dosyalarını içeren todo-app/kubernetes dizinine geçin.

  • cd todo-app / kubernetes

Düzenleyicinize web-rs-ss.yaml dosyasını açın.

  • nano web-rs-ss.yaml

YAML dosyasındaki env bölümüne dikkat edin.

web-rs-ss.yaml containers:
- name: web
image: janakiramm/todo
env:
- name: "DBHOST"
value: "mongodb://todo-mongodb-replicaset-0.todo-mongodb-replicaset,todo-mongodb-replicaset-1.todo-mongodb-replicaset,todo-mongodb-replicaset-2.todo-mongodb-replicaset:27017"
ports:
- containerPort: 3000

Bu, veritabanı bağlantı dizesini çalışma zamanında bir ortam değişkeni olarak uygulamaya geçirir. Uygulamayı basit bir MongoDB Pod'a işaret etmek yerine, uygulamanın bu sürümü oluşturduğunuz StatefulSet'i kullanır. value bölümündeki her bir giriş MongoDB StatefulSet'in bölmelerinden birine atıfta bulunur.

web Service ile birlikte web ReplicaSet dağıtmak için kubectl kullanın

  • kubectl -f web-rs-ss.yaml -f web-service.yaml oluşturun

Her ikisinin de oluşturulduğunu göreceksiniz:

Outputreplicaset "web" created
service "web" created

Podları tekrar listeleyin:

  • kubectl bakla almak

Şimdi MongoDB'ye ve web uygulamasına ait tüm Pod'ları görüyorsunuz.

OutputNAME READY STATUS RESTARTS AGE
todo-mongodb-replicaset-0 1/1 Running 0 26m
todo-mongodb-replicaset-1 1/1 Running 0 24m
todo-mongodb-replicaset-2 1/1 Running 0 23m
web-t5zzk 1/1 Running 0 17s
web-x6dh8 1/1 Running 0 17s

Let’s check out the Kubernetes services

​```command
kubectl get svc
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.3.0.1 <none> 443/TCP 1d
todo-mongodb-replicaset ClusterIP None <none> 27017/TCP 27m
web NodePort 10.3.0.167 <none> 3000:31201/TCP 14s

web todo-mongodb-replicaset Service aracılığıyla MongoDB kümesine todo-mongodb-replicaset . Web uygulaması aracılığıyla kullanılabilir web NodePort üzerinde Hizmet 31201 .

İşçi düğümlerinden herhangi birinde bu bağlantı noktasına erişim, web uygulamasını gösterir.

ReplicaSet'deki Pod sayısını artırarak web uygulamasını ölçeklendirebilirsiniz.

  • kubectl skalası rs / web --replicas = 10

Outputreplicaset "web" scaled

Ardından uygulamayı iki Bölme'ye geri ölçekleyebilirsiniz.

  • kubectl skalası rs / web --replicas = 2

Outputreplicaset "web" scaled

Şimdi müsaitlik için bazı testler yapalım.

Adım 4 – Yüksek Kullanılabilirlik İçin MongoDB ReplicaSet'in Test Edilmesi

Bir StatefulSet çalıştırmanın avantajlarından biri iş yüklerinin yüksek olmasıdır. MongoDB StatefulSet'teki Pod'lardan birini silerek bunu test edelim.

  • kubectl pod todo-mongodb-replicaset-2'yi sil

Outputpod "todo-mongodb-replicaset-2" deleted

Pod sayısını kontrol edin:

  • kubectl bakla almak

todo-mongodb-replicaset-2 sonlandığını göreceksiniz:

OutputNAME READY STATUS RESTARTS AGE
todo-mongodb-replicaset-0 1/1 Running 0 33m
todo-mongodb-replicaset-1 1/1 Running 0 32m
todo-mongodb-replicaset-2 0/1 Terminating 0 31m
web-t5zzk 1/1 Running 0 8m
web-x6dh8 1/1 Running 0 8m

Birkaç dakika içinde, Kubernetes'in silinmiş olanı değiştirmek için başka bir Pod başlattığını göreceksiniz.

  • kubectl bakla almak

todo-mongodb-replicaset-2 başlatıldığını göreceksiniz:

NAME READY STATUS RESTARTS AGE
todo-mongodb-replicaset-0 1/1 Running 0 34m
todo-mongodb-replicaset-1 1/1 Running 0 33m
todo-mongodb-replicaset-2 0/1 Init:0/2 0 29s
web-t5zzk 1/1 Running 0 8m
web-x6dh8 1/1 Running 0 8m

Artık her şeyin işe yaradığını biliyorsun, her şeyi temizleyebilirsin.

Bu eğitim sırasında oluşturulan tüm nesneleri aşağıdaki komutlarla silin:

  • helm silmek --purge todo

  • kubectl delete -f web-rs-ss.yaml -f web hizmeti.yaml

Outputreplicaset "web" deleted
service "web" deleted

Kubernetes kümesinin kendisini silmek için StackPointCloud adresini ziyaret edin ve kontrol panellerinden yapın.

Sonuç

Bu öğreticide, kalıcı, kalıcı, yüksek oranda kullanılabilir bir MonogDB ReplicaSet'i Kubernetes StatefulSet olarak dağıtdınız. Aynı Kubernetes kümesinde dağıtılan diğer uygulamalardan StatefulSet'e nasıl erişeceğinizi de öğrendiniz.

Bir önceki yazımız olan Laravel ve Kampanya Monitörü ile günlük bir e-posta göndermek başlıklı makalemizi de okumanızı öneririz.

About This Author

Uzun yıllardır yazılım ile uğraşıyorum. PHP ile başladığım yazılım hayatıma şu an PHP'nin yanında Swift ve Python ile devam ediyorum. Bu güne kadar bir çok proje geliştirdim ve yeni projeler geliştirmeye de devam ediyorum. Bu sitede yazılımseverlere faydalı bilgiler vermeye, yazılım geliştirmeye, öğrendiklerimi paylaşmaya, yeni başlayanlara yol göstermeye ve onlara yardımcı olmaya çalışıyorum.

Comments are closed

%d blogcu bunu beğendi: