Web sitenizi Google Kubernetes Engine (GKE) ile dağıtma, ölçeklendirme ve güncelleme

1. Giriş

Web sitesi veya uygulama işletmek zor bir iştir.

En olmayacak zamanlarda sorunlar yaşanır, sunucular çöker veya talep artışları daha fazla kaynak kullanılmasına yol açar. Üstelik, sisteme kapalı kalma süresi tanımadan değişiklik yapmak karmaşık ve streslidir.

Gerekli işlemleri yapmanızı, hatta otomatik hale getirmenizi sağlayan bir aracın var olduğunu düşünün. GKE size bu olanakların hepsini sunmakla kalmaz, bu işlemleri zahmetsiz hale de getirir. Bu codelab'de, kurgusal bir şirket olan Fancy Store için e-ticaret web sitesi işleten bir geliştirici rolünü üstleneceksiniz. Şirketin karşılaştığı ölçeklendirme sorunları ve kesintiler nedeniyle uygulamanızı GKE'ye dağıtmanız istendi.

Alıştırmalar, bulut geliştiricilerinin sıkça takip ettiği adımlara uygun şekilde sıralanmıştır:

  1. GKE kümesi oluşturun.
  2. Docker container'ı oluşturun.
  3. Container'ı GKE'ye dağıtın.
  4. Container'ı bir hizmet aracılığıyla kullanıma sunma.
  5. Container'ı birden fazla replika içerecek şekilde ölçeklendirin.
  6. Web sitesini değiştirin.
  7. Kapalı kalma süresi olmadan yeni sürümü kullanıma sunma

Mimari şeması

ddba666bd2b02d0d.png

Neler öğreneceksiniz?

  • GKE kümesi oluşturma
  • Docker görüntüsü oluşturma
  • Docker görüntülerini Kubernetes'e dağıtma
  • Kubernetes'te uygulama ölçeklendirme
  • Kubernetes'te periyodik güncelleme gerçekleştirme

Ön koşullar

  • Proje oluşturmak için yönetim erişimine sahip bir Google Hesabı veya proje sahibi rolüne sahip olduğunuz bir proje
  • Docker ve Kubernetes'e dair genel bilgi (Temel bilgilere sahip değilseniz lütfen Docker ve Kubernetes'i inceleyin.)

2. Ortam kurulumu

Yönlendirmesiz ortam kurulumu

Google Hesabınız yoksa hesap oluşturmanız gerekir. Google Cloud Console'da oturum açın ve yeni bir proje oluşturun.

53dad2cefdae71da.png

Screenshot from 2016-02-10 12:45:26.png

Proje kimliğinin tüm Google Cloud projelerinde benzersiz bir ad olduğunu unutmayın (yukarıdaki ad zaten alınmış olduğundan sizin için çalışmayacaktır). Bu öğe, daha sonra PROJECT_ID olarak adlandırılacaktır.

Ardından, Google Cloud kaynaklarını kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Google Cloud'un yeni kullanıcıları 300 ABD doları değerinde ücretsiz deneme sürümünden yararlanabilir. Yeni bir kullanıcı değilseniz endişelenmeyin. Bu codelab'in maliyeti birkaç doları geçmez. Ancak daha fazla kaynak kullanırsanız veya kaynakları çalışır durumda bırakırsanız (sonundaki "temizleme" bölümüne bakın) codelab size daha fazla maliyete neden olabilir. Daha fazla bilgi için Fiyatlandırma bölümüne bakın.

Cloud Shell

Dizüstü bilgisayarınızla Google Cloud ve GKE'yi uzaktan çalıştırabilirsiniz ancak bu codelab'de Cloud'da çalışan bir komut satırı ortamı olan Cloud Shell'i kullanacaksınız.

Bu Debian tabanlı sanal makine, ihtiyaç duyacağınız tüm geliştirme araçlarını içerir. 5 GB boyutunda kalıcı bir ana dizin bulunur ve Google Cloud'da çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde güçlenir. Bu nedenle, bu codelab için ihtiyacınız olan tek şey bir tarayıcıdır (Chromebook'ta da çalışır).

  1. Cloud Shell'i Cloud Console'dan etkinleştirmek için Cloud Shell'i etkinleştir 'i fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q tıklamanız yeterlidir (ortamın sağlanması ve bağlantının kurulması yalnızca birkaç saniye sürer).

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

Screen Shot 2017-06-14 at 10.13.43 PM.png

Cloud Shell'e bağlandıktan sonra kimliğinizin doğrulandığını ve projenin, PROJECT_ID'nize ayarlandığını görürsünüz.

gcloud auth list

Komut çıkışı

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

Komut çıkışı

[core]
project = <PROJECT_ID>

Herhangi bir nedenle proje ayarlanmamışsa şu komutu verin:

gcloud config set project <PROJECT_ID>

PROJECT_ID cihazınızı mı arıyorsunuz? Kurulum adımlarında hangi kimliği kullandığınızı kontrol edin veya Cloud Console kontrol panelinde arayın:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

Cloud Shell, gelecekteki komutları çalıştırırken faydalı olabilecek bazı ortam değişkenlerini de varsayılan olarak ayarlar.

echo $GOOGLE_CLOUD_PROJECT

Komut çıkışı

<PROJECT_ID>
  1. Son olarak, varsayılan alt bölgeyi ve proje yapılandırmasını ayarlayın.
gcloud config set compute/zone us-central1-f

Çeşitli bölgeler arasından seçim yapabilirsiniz. Daha fazla bilgi için Bölgeler ve Alt Bölgeler başlıklı makaleyi inceleyin.

3. GKE kümesi oluşturma

Geliştirme ortamınız çalışır durumda olduğuna göre şimdi, web sitenizi dağıtacağınız bir GKE kümesine ihtiyacınız var. Küme oluşturmadan önce uygun API'lerin etkinleştirildiğinden emin olmanız gerekir. Containers API'yi etkinleştirmek için aşağıdaki komutu çalıştırın:

gcloud services enable container.googleapis.com

Artık kümenizi oluşturabilirsiniz. fancy-cluster adlı ve 3 düğümlü bir küme oluşturmak için aşağıdaki adımları uygulayın:

gcloud container clusters create fancy-cluster --num-nodes 3

Kümenin oluşturulması birkaç dakika sürebilir. Ardından, aşağıdaki komutu çalıştırın ve kümenin üç çalışan sanal makine (VM) örneğini görün:

gcloud compute instances list

Çıkış:

NAME                                          ZONE        MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP    STATUS
gke-fancy-cluster-default-pool-ad92506d-1ng3  us-east4-a  n1-standard-1               10.150.0.7   XX.XX.XX.XX    RUNNING
gke-fancy-cluster-default-pool-ad92506d-4fvq  us-east4-a  n1-standard-1               10.150.0.5   XX.XX.XX.XX    RUNNING
gke-fancy-cluster-default-pool-ad92506d-4zs3  us-east4-a  n1-standard-1               10.150.0.6   XX.XX.XX.XX    RUNNING

Kümenizi ve ilgili bilgileri Cloud Console'da da görüntüleyebilirsiniz. Sol üst köşedeki menü düğmesini tıklayın, Kubernetes Engine'e gidin ve Kümeler'i tıklayın. fancy-cluster adlı kümenizi göreceksiniz.

795c794b03c5d2b0.png

6b394dfb8a6031f2.png

Tebrikler! İlk kümenizi oluşturdunuz.

4. Kaynak depoyu klonlama

Var olan bir web sitesiyle çalıştığınız için yalnızca depodaki kaynağı klonlamanız yeterlidir. Böylece, Docker görüntüsü oluşturup GKE'ye dağıtım yapmaya odaklanabilirsiniz.

Kaynak depoyu Cloud Shell örneğinize klonlamak ve uygun dizine değiştirmek için aşağıdaki komutları çalıştırın. Dağıtım öncesinde uygulamanızı test edebilmeniz için Node.js bağımlılıklarını da yüklemeniz gerekir.

cd ~
git clone https://github.com/googlecodelabs/monolith-to-microservices.git
cd ~/monolith-to-microservices
./setup.sh

Bu komut, depoyu klonlar, dizini değiştirir ve uygulamanızı yerel olarak çalıştırmak için gereken bağımlılıkları yükler. Bu komut dosyasının çalışması birkaç dakika sürebilir.

Gerekli özeni gösterin ve uygulamanızı test edin. Web sunucunuzu başlatmak için aşağıdaki komutu çalıştırın:

cd ~/monolith-to-microservices/monolith
npm start

Çıkış:

Monolith listening on port 8080!

Cloud Shell menüsünde web önizlemesi simgesini tıklayıp 8080 numaralı bağlantı noktasında önizle'yi seçerek uygulamanızı önizleyebilirsiniz.

5869738f0e9ec386.png

Bu işlemi yaptığınızda Fancy Store'u iş başında görebileceğiniz yeni bir pencere açılır.

9ed25c3f0cbe62fa.png

Web sitesini görüntüledikten sonra bu pencereyi kapatabilirsiniz. Web sunucusu işlemini durdurmak için terminal penceresinde Control+C (Windows veya Mac) tuşuna basın.

5. Cloud Build ile Docker container'ı oluşturma

Kaynak dosyalarınız artık hazır olduğuna göre sıra, uygulamanızı Docker'a uygun hale getirmeye geldi.

Normalde bu süreç iki adımda tamamlanır: Bir Docker container'ı derlenir ve görüntünün GKE'nin çekebileceği şekilde depolanması için bu container bir kayıt defterine aktarılır. Ancak Docker container'ı oluşturmak ve görüntüyü tek bir komutla Container Registry'ye yerleştirmek için Cloud Build'i kullanarak işinizi kolaylaştırabilirsiniz. (Docker dosyası oluşturma ve aktarma işlemlerinden oluşan manuel süreci görüntülemek için Container Registry Hızlı Başlangıç Kılavuzu'na bakın.)

Cloud Build, dizindeki dosyaları sıkıştırır ve bir Cloud Storage paketine taşır. Ardından, derleme işlemi sırasında paketteki dosyalar alınır ve Dockerfile üzerinden Docker derleme işlemi çalıştırılır. Docker görüntüsü için ana makineyi gcr.io olarak ayarlayıp --tag işaretini belirttiğinizden elde edilen Docker görüntüsü Container Registry'ye aktarılır.

Öncelikle aşağıdaki komutu çalıştırarak Cloud Build API'yi etkinleştirmeniz gerekir:

gcloud services enable cloudbuild.googleapis.com

API etkinleştirildikten sonra derleme işlemini başlatmak için Cloud Shell'de aşağıdaki komutu çalıştırın:

cd ~/monolith-to-microservices/monolith
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 .

Bu işlem birkaç dakika sürer ancak tamamlandıktan sonra terminalde aşağıdaki çıkışı görebilirsiniz:

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ID                                    CREATE_TIME                DURATION  SOURCE                                                                                  IMAGES                              STATUS
1ae295d9-63cb-482c-959b-bc52e9644d53  2019-08-29T01:56:35+00:00  33S       gs://<PROJECT_ID>_cloudbuild/source/1567043793.94-abfd382011724422bf49af1558b894aa.tgz  gcr.io/<PROJECT_ID>/monolith:1.0.0  SUCCESS

Derleme geçmişinizi görüntülemek veya işlemi gerçek zamanlı olarak izlemek için Cloud Console'a gidebilirsiniz. Sol üst köşedeki menü düğmesini tıklayın, Ci/CD'ye gidin, Cloud Build'i ve ardından Geçmiş'i tıklayın. Burada, önceki derlemelerinizin listesini görebilirsiniz. Ancak şimdilik yalnızca oluşturduğunuz derleme vardır.

4c753ede203255f6.png

Derleme kimliğini tıklarsanız derlemenin günlük çıkışı da dahil olmak üzere tüm ayrıntılarını görebilirsiniz.

Derleme ayrıntıları sayfasındaki derleme bilgileri bölümünde Görüntü adı'nı tıklayarak oluşturulan container görüntüsünü görebilirsiniz.

6e88ed1643dfe629.png

6. Container'ı GKE'ye dağıtma

Web sitenizi container mimarisine aldığınıza ve kapsayıcıyı Container Registry'ye aktardığınıza göre artık Kubernetes'e dağıtabilirsiniz.

Uygulamaları bir GKE kümesinde dağıtıp yönetmek için Kubernetes küme yönetimi sistemiyle iletişim kurmanız gerekir. Bunun için genellikle kubectl komut satırı aracı kullanılır.

Kubernetes'te uygulamalar, bir container'ı (veya birbirlerine sıkı sıkıya bağlı bir grup container'ı) temsil eden birimler olan Kapsüller şeklinde temsil edilir. Kapsül, Kubernetes'teki en küçük dağıtılabilir birimdir. Burada her kapsülde yalnızca monolit container'ınız yer almaktadır.

Uygulamanızı dağıtmak için bir Dağıtım oluşturmanız gerekir. Dağıtım, uygulamanızın replika adı verilen birden fazla kopyasını yönetir ve bu kopyaların her birinin kümenizdeki ayrı birer düğümde çalıştırılmasını planlar. Bu durumda, Dağıtım tarafından uygulamanızın yalnızca bir kapsülü çalıştırılacaktır. Dağıtımlar bunun için bir ReplicaSet oluşturur. ReplicaSet, belirtilen sayıda replikanın her zaman çalışmasını sağlamaktan sorumludur.

kubectl create deployment komutu, Kubernetes'in kümenizde 1 replikaya sahip monolith adlı bir Dağıtım oluşturmasına neden olur.

Uygulamanızı dağıtmak için aşağıdaki komutu çalıştırın:

kubectl create deployment monolith --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0

Dağıtımı doğrulama

Dağıtımın başarıyla oluşturulduğunu doğrulamak için aşağıdaki komutu çalıştırın (Kapsül durumunun "Çalışıyor" olması birkaç dakika sürebilir):

kubectl get all

Çıkış:

NAME                            READY   STATUS    RESTARTS   AGE
pod/monolith-7d8bc7bf68-htm7z   1/1     Running   0          6m21s

NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.27.240.1   <none>        443/TCP   24h

NAME                       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/monolith   1         1         1            1           20m

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/monolith-7d8bc7bf68   1         1         1       20m

Bu çıkışta çeşitli bilgiler sunulmaktadır. Geçerli dağıtımınızı, istenen kapsül sayısı bir olan ReplicaSet'inizi ve çalışmakta olan kapsülünüzü görebilirsiniz. Her şeyi başarıyla oluşturmuşsunuz.

Kaynaklarınızı ayrı ayrı görüntülemek için aşağıdaki komutları çalıştırabilirsiniz:

# Show pods
kubectl get pods

# Show deployments
kubectl get deployments

# Show replica sets
kubectl get rs

#You can also combine them
kubectl get pods,deployments

Kubernetes'in tüm avantajlarını görmek için sunucu kilitlenmesi simülasyonu yapabilir, kapsülü silebilir ve neler olacağını görebilirsiniz.

Önceki komuttan kapsül adınızı kopyalayın ve aşağıdaki komutu çalıştırarak silin:

kubectl delete pod/<POD_NAME>

Yeterince hızlı hareket ederseniz önceki komutu yeniden çalıştırarak her şeyi tekrar görebilirsiniz. Biri sonlandırılan ve diğeri oluşturulan veya çalıştırılan iki kapsül görmeniz gerekir:

kubectl get all

Çıkış:

NAME                            READY   STATUS        RESTARTS   AGE
pod/monolith-7d8bc7bf68-2bxts   1/1     Running       0          4s
pod/monolith-7d8bc7bf68-htm7z   1/1     Terminating   0          9m35s

NAME                 TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.27.240.1   <none>        443/TCP   24h

NAME                       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/monolith   1         1         1            1           24m

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/monolith-7d8bc7bf68   1         1         1       24m

Bu neden oldu? ReplicaSet, kapsülün sonlandırıldığını gördü ve istenen replika sayısını korumak için yeni bir kapsül oluşumunu tetikledi. Sonraki bölümlerde, birden fazla örneğin çalışacağı şekilde ölçeğin nasıl genişletildiğini göreceksiniz. Bu durumda örneklerden birinin çökmesi, kullanıcılara sitenin veya uygulamanın kapalı kaldığı süre olarak yansımaz.

7. GKE dağıtımını kullanıma sunma

Uygulamanızı GKE'ye dağıttınız ancak uygulamaya küme dışından erişemiyorsunuz. Varsayılan olarak, GKE'de çalıştırılan container'ların harici bir IP adresi bulunmadığından bu container'lara internet üzerinden erişilemez. İnternet trafiği alabilmesi için uygulamanızı bir Hizmet kaynağı üzerinden açıkça kullanıma sunmanız gerekir. Hizmetler, uygulamanızın kapsüllerine ağ ve IP desteği sağlar. GKE, uygulamanız için harici bir IP adresi ve yük dengeleyici (faturalandırmaya tabidir) oluşturur.

Web sitenizi internet üzerinden kullanıma sunmak için aşağıdaki komutu çalıştırın:

kubectl expose deployment monolith --type=LoadBalancer --port 80 --target-port 8080

Çıkış:

service/monolith exposed

Hizmete erişme

GKE, harici IP adresini Dağıtım'a değil Hizmet kaynağına atar. GKE tarafından uygulamanıza sağlanan harici IP adresini öğrenmek istiyorsanız hizmeti incelemek için kubectl get service komutunu kullanabilirsiniz:

kubectl get service

Çıkış:

NAME         CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
monolith     10.3.251.122    203.0.113.0     80:30877/TCP     3d

Uygulamanızın harici IP adresini belirledikten sonra kopyalayın. Uygulamanızın erişilebilir olup olmadığını kontrol etmek için tarayıcınızı bu URL'ye (örneğin http://203.0.113.0) yönlendirin.

9ed25c3f0cbe62fa.png

Daha önce test ettiğiniz web sitesini göreceksiniz. Tebrikler! Web siteniz artık Kubernetes'te tam olarak çalışıyor.

8. GKE dağıtımını ölçeklendirme

Artık uygulamanızın GKE'de çalışan bir örneği olduğuna ve internet üzerinden kullanıma açık olduğuna göre web siteniz çok popülerleşti. Trafiği yönetebilmek için uygulamanızın ölçeğini birden fazla örneğin kullanılacağı şekilde artıracak bir yöntem gereklidir. Uygulamanızı üç kopyaya kadar ölçeklendirmeyi öğrenin.

Dağıtımınızın ölçeğini üç replikaya kadar artırmak için aşağıdaki komutu çalıştırın:

kubectl scale deployment monolith --replicas=3

Çıkış:

deployment.apps/monolith scaled

Ölçeklendirilmiş dağıtımı doğrulama

Dağıtımın başarıyla ölçeklendirildiğini doğrulamak için aşağıdaki komutu çalıştırın:

kubectl get all

Çıkış:

NAME                            READY   STATUS    RESTARTS   AGE
pod/monolith-7d8bc7bf68-2bxts   1/1     Running   0          36m
pod/monolith-7d8bc7bf68-7ds7q   1/1     Running   0          45s
pod/monolith-7d8bc7bf68-c5kxk   1/1     Running   0          45s

NAME                 TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)        AGE
service/kubernetes   ClusterIP      10.27.240.1    <none>         443/TCP        25h
service/monolith     LoadBalancer   10.27.253.64   XX.XX.XX.XX   80:32050/TCP   6m7s

NAME                       DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/monolith   3         3         3            3           61m

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/monolith-7d8bc7bf68   3         3         3       61m

Kapsülünüzün çalıştırıldığı üç örnek görmeniz gerekir. Ayrıca, dağıtımınızın ve ReplicaSet'inizin artık istenen üç sayıya sahip olduğunu unutmayın.

9. Web sitesinde değişiklik yapma

Pazarlama ekibiniz sizden web sitenizin ana sayfasını değiştirmenizi istedi. Bu sayfanın, şirketinizin ne olduğu ve aslında nelerin satışını yaptığı konusunda daha bilgilendirici olması gerektiğini düşünüyorlar. Bu bölümde, pazarlama ekibini memnun etmek için ana sayfaya bazı metinler ekleyeceksiniz. Geliştiricilerimizden biri, istenen değişiklikleri index.js.new adlı bir dosyada hazırlamış. Dosyayı index.js konumuna kopyalarsanız değişiklikleriniz sayfaya yansıtılacaktır. Uygun değişiklikleri yapmak için aşağıdaki talimatları uygulayın.

Aşağıdaki komutları çalıştırın, güncellenen dosyayı doğru dosya adına kopyalayın ve değişiklikleri doğrulamak için dosya içeriğini yazdırın:

cd ~/monolith-to-microservices/react-app/src/pages/Home
mv index.js.new index.js
cat ~/monolith-to-microservices/react-app/src/pages/Home/index.js

Bu işlem sonucunda elde edilen kod aşağıdaki gibi görünmelidir:

/*
Copyright 2019 Google LLC

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

import React from "react";
import { makeStyles } from "@material-ui/core/styles";
import Paper from "@material-ui/core/Paper";
import Typography from "@material-ui/core/Typography";
const useStyles = makeStyles(theme => ({
  root: {
    flexGrow: 1
  },
  paper: {
    width: "800px",
    margin: "0 auto",
    padding: theme.spacing(3, 2)
  }
}));
export default function Home() {
  const classes = useStyles();
  return (
    <div className={classes.root}>
      <Paper className={classes.paper}>
        <Typography variant="h5">
          Fancy Fashion &amp; Style Online
        </Typography>
        <br />
        <Typography variant="body1">
          Tired of mainstream fashion ideas, popular trends and societal norms?
          This line of lifestyle products will help you catch up with the Fancy trend and express your personal style.
          Start shopping Fancy items now!
        </Typography>
      </Paper>
    </div>
  );
}

React bileşenlerini güncellediniz ancak statik dosyaları oluşturmak için React uygulamasını derlemeniz gerekiyor. React uygulamasını derlemek için aşağıdaki komutu çalıştırın ve monolitin herkese açık dizinine kopyalayın:

cd ~/monolith-to-microservices/react-app
npm run build:monolith

Kodunuz güncellendiğine göre Docker container'ınızı yeniden derleyip Container Registry'de yayınlamanız gerekiyor. Önceki komutu tekrar kullanabilirsiniz ancak bu kez sürüm etiketini güncelleyin.

Güncellenmiş 2.0.0 görüntü sürümüyle yeni bir Cloud Build tetiklemek için aşağıdaki komutu çalıştırın:

cd ~/monolith-to-microservices/monolith

#Feel free to test your application
npm start

gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 .

Web sunucusu işlemini durdurmak için terminal penceresinde Control+C (Windows veya Mac) tuşuna basın.

Sonraki bölümde, kapalı kalma süresi olmadan uygulamanızı güncellemek için bu görüntüyü kullanacaksınız.

10. Kapalı kalma süresi olmadan web sitesini güncelleme

Değişiklikler tamamlandı ve pazarlama ekibi yaptığınız güncellemelerden memnun kaldı. Şimdi sıra, kullanıcıların işlerini kesintiye uğratmadan web sitesini güncellemeye geldi. Web sitenizi güncellemek için aşağıdaki talimatları izleyin.

GKE'nin periyodik güncellemeleri, eski container görüntünüzün örnekleri çalışan tüm replikalarda sistem tarafından yeni container görüntünüzle değiştirilirken bile uygulamanızın çalışır ve kullanılabilir durumda kalmasını sağlar.

Komut satırından, aşağıdaki komutu kullanarak dağıtımınızın görüntüsünü yeni bir sürüme güncellemek istediğinizi Kubernetes'e bildirebilirsiniz:

kubectl set image deployment/monolith monolith=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0

Çıkış:

deployment.apps/monolith image updated

Dağıtımı doğrulama

Dağıtım güncellemenizi doğrulamak için şu komutu çalıştırın:

kubectl get pods

Çıkış:

NAME                        READY   STATUS              RESTARTS   AGE
monolith-584fbc994b-4hj68   1/1     Terminating         0          60m
monolith-584fbc994b-fpwdw   1/1     Running             0          60m
monolith-584fbc994b-xsk8s   1/1     Terminating         0          60m
monolith-75f4cf58d5-24cq8   1/1     Running             0          3s
monolith-75f4cf58d5-rfj8r   1/1     Running             0          5s
monolith-75f4cf58d5-xm44v   0/1     ContainerCreating   0          1s

Üç yeni kapsülün oluşturulduğunu ve eski kapsüllerinizin kapatıldığını görürsünüz. Yaşlarına bakarak yeni ve eski kapsülleri ayırt edebilirsiniz. En sonunda, yine yalnızca üç kapsül gösterilir. Bunlar, güncellenmiş üç kapsülünüzdür.

Değişikliklerinizi doğrulamak için yük dengeleyicinin harici IP'sine tekrar gidin ve uygulamanızın güncellendiğini görün.

Hizmetleri listelemek ve IP adresini görüntülemek için (unuttuysanız) aşağıdaki komutu çalıştırın:

kubectl get svc

Ana sayfa bileşenine eklediğiniz metin artık web sitenizde gösterilir.

8006c9938dbd5aa5.png

11. Temizleme

Git deposunu silme

cd ~
rm -rf monolith-to-microservices

Container Registry görüntülerini silme

NOT: Başka sürümler oluşturduysanız bu resimleri de silmek için aynı söz dizimini kullanabilirsiniz. Bu codelab'de yalnızca iki etiketiniz olduğu varsayılır.

# Delete the container image for version 1.0.0 of our monolith
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --quiet

# Delete the container image for version 2.0.0 of our monolith
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 --quiet

Cloud Storage'daki Cloud Build yapılarını silme

NOT: Bu codelab dışındaki yapılar için Cloud Build'ü kullandıysanız kaynağınızı Cloud Storage paketinden gs://<PROJECT_ID>_cloudbuild/source manuel olarak silmeniz gerekir.

# The following command will take all source archives from all builds and delete them from cloud storage

# Run this command to print all sources:
# gcloud builds list | awk 'NR > 1 {print $4}'

gcloud builds list | awk 'NR > 1 {print $4}' | while read line; do gsutil rm $line; done

GKE hizmetini silme

kubectl delete service monolith
kubectl delete deployment monolith

GKE kümesini silme

gcloud container clusters delete fancy-cluster

NOT: Bu komutun çalıştırılması biraz zaman alabilir.

12. Tebrikler!

Web sitenizi GKE'de dağıttınız, ölçeklendirdiniz ve güncellediniz. Artık Docker ve Kubernetes konularında deneyimli bir kullanıcısınız.

Ek kaynaklar