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.

<ul><li>dümen versiyonu</li></ul> OutputClient: &amp;version.Version{SemVer:"v2.7.2", GitCommit:"8478fb4fc723885b155c924d1c8c410b7a9444e6", GitTreeState:"clean"}Server: &amp;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:

<ul><li>kubectl storageclass olsun</li></ul>

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

[secondary_label OutputNAME                     PROVISIONER                            AGEdigitalocean (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:

<ul><li>mkdir ~ / mongo-rs</li><li>cd ~ / mongo-rs</li></ul>

GitHub'dan Helm Chart deposunu klonlayın:

<ul><li>git klon https://github.com/kubernetes/charts.git</li></ul>

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

<ul><li>cd çizelgeleri / kararlı / mongodb-replicaset /</li><li>ls değerler.yaml</li></ul> 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:

<ul><li>nano değerleri.yaml</li></ul>

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

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

&quot;-&quot; ile &quot;digitalocean&quot; şu şekilde değiştirin:

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

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

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

<ul><li>cd ~ / mongo-rs</li></ul>

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.

<ul><li>helm install --name = todo -f çizelgeleri / kararlı / mongodb-replicaset / values.yaml kararlı / mongodb-replicaset</li></ul>

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:   todoLAST DEPLOYED: Sat Mar 31 10:37:06 2018NAMESPACE: defaultSTATUS: DEPLOYEDRESOURCES:==&gt; v1/ServiceNAME                     TYPE       CLUSTER-IP  EXTERNAL-IP  PORT(S)    AGEtodo-mongodb-replicaset  ClusterIP  None        &lt;none&gt;       27017/TCP  1s==&gt; v1beta1/StatefulSetNAME                     DESIRED  CURRENT  AGEtodo-mongodb-replicaset  3        1        0s==&gt; v1/Pod(related)NAME                       READY  STATUS    RESTARTS  AGEtodo-mongodb-replicaset-0  0/1    Init:0/2  0         0s==&gt; v1/ConfigMapNAME                           DATA  AGEtodo-mongodb-replicaset        1     1stodo-mongodb-replicaset-tests  1     1sNOTES:1. After the statefulset is created completely, one can check which instance is primary by running:    $ for ((i = 0; i &lt; 3; ++i)); do kubectl exec --namespace default todo-mongodb-replicaset-$i -- sh -c 'mongo --eval="printjson(rs.isMaster())"'; done2. 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:

<ul><li>kubectl statefulset olsun</li></ul>

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

OutputNAME                      DESIRED   CURRENT   AGEtodo-mongodb-replicaset   3         2         2m

Şimdi Pod'ları keşfedin:

<ul><li>kubectl bakla almak</li></ul>

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   AGEtodo-mongodb-replicaset-0   1/1       Running       0          3mtodo-mongodb-replicaset-1   1/1       Running       0          1mtodo-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:

<ul><li>kubectl exec -it todo-mongodb-replicaset-0 mongo</li></ul>

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

OutputMongoDB shell version v3.6.3connecting to: mongodb://127.0.0.1:27017MongoDB server version: 3.6.3Welcome 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:

<ul><li>rs.conf ()</li></ul>

Çı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:

<ul><li>çıkış</li></ul>

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.yaml persistentVolume:  enabled: true  ## mongodb-replicaset data Persistent Volume Storage Class  ## If defined, storageClassName: &lt;storageClass&gt;  ## 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 &amp; 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:

<ul><li>mkdir ~ / web-uygulaması</li><li>cd ~ / web-uygulaması</li></ul>

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

<ul><li>git klonu https://github.com/janakiramm/todo.git</li></ul>

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

<ul><li>cd todo-app / kubernetes</li></ul>

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

<ul><li>nano web-rs-ss.yaml</li></ul>

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

<ul><li>kubectl -f web-rs-ss.yaml -f web-service.yaml oluşturun</li></ul>

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

Outputreplicaset "web" createdservice "web" created

Podları tekrar listeleyin:

<ul><li>kubectl bakla almak</li></ul>

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

OutputNAME                        READY     STATUS    RESTARTS   AGEtodo-mongodb-replicaset-0   1/1       Running   0          26mtodo-mongodb-replicaset-1   1/1       Running   0          24mtodo-mongodb-replicaset-2   1/1       Running   0          23mweb-t5zzk                   1/1       Running   0          17sweb-x6dh8                   1/1       Running   0          17sLets check out the Kubernetes services```commandkubectl get svc OutputNAME                      TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)          AGEkubernetes                ClusterIP   10.3.0.1     &lt;none&gt;        443/TCP          1dtodo-mongodb-replicaset   ClusterIP   None         &lt;none&gt;        27017/TCP        27mweb                       NodePort    10.3.0.167   &lt;none&gt;        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.

<ul><li>kubectl skalası rs / web --replicas = 10</li></ul> Outputreplicaset "web" scaled

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

<ul><li>kubectl skalası rs / web --replicas = 2</li></ul> 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.

<ul><li>kubectl pod todo-mongodb-replicaset-2&#39;yi sil</li></ul> Outputpod "todo-mongodb-replicaset-2" deleted

Pod sayısını kontrol edin:

<ul><li>kubectl bakla almak</li></ul>

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

OutputNAME                        READY     STATUS        RESTARTS   AGEtodo-mongodb-replicaset-0   1/1       Running       0          33mtodo-mongodb-replicaset-1   1/1       Running       0          32mtodo-mongodb-replicaset-2   0/1       Terminating   0          31mweb-t5zzk                   1/1       Running       0          8mweb-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.

<ul><li>kubectl bakla almak</li></ul>

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

NAME                        READY     STATUS     RESTARTS   AGEtodo-mongodb-replicaset-0   1/1       Running    0          34mtodo-mongodb-replicaset-1   1/1       Running    0          33mtodo-mongodb-replicaset-2   0/1       Init:0/2   0          29sweb-t5zzk                   1/1       Running    0          8mweb-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:

<ul><li>helm silmek --purge todo</li></ul> <ul><li>kubectl delete -f web-rs-ss.yaml -f web hizmeti.yaml</li></ul> Outputreplicaset "web" deletedservice "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

Comments are closed

%d blogcu bunu beğendi: