Google Kubernetes Engine'de .NET Core uygulaması Dağıtma ve Güncelleme

1. Genel Bakış

Microsoft .NET Core, .NET'in yerel olarak container'larda çalışabilen açık kaynaklı ve platformlar arası bir sürümüdür. .NET Core, GitHub'da mevcuttur ve Microsoft ile .NET topluluğu tarafından yönetilir. Bu laboratuvarda, container mimarisine alınmış bir .NET Core uygulaması Google Kubernetes Engine'e (GKE) dağıtılır.

Bu laboratuvarda, uygulamaların geliştiricinin yerel ortamında geliştirilip ardından üretime dağıtıldığı tipik bir geliştirme modeli kullanılır. Laboratuvarın ilk bölümünde, örnek bir .NET Core uygulaması Cloud Shell'de çalışan bir container kullanılarak doğrulanır. Doğrulanan uygulama, GKE kullanılarak Kubernetes'e dağıtılır. Laboratuvarda GKE kümesi oluşturma adımları yer alır.

Laboratuvarın ikinci bölümünde, uygulama örneğini çalıştıran container'ın ana makine adını gösteren uygulamada küçük bir değişiklik yapılır. Güncellenen uygulama daha sonra Cloud Shell'de doğrulanır ve dağıtım, yeni sürümü kullanacak şekilde güncellenir. Aşağıdaki görselde bu laboratuvardaki etkinliklerin sırası gösterilmektedir:

Demo adım sırası diyagramı

Maliyetler

Bu laboratuvarı tam olarak yazıldığı şekilde çalıştırırsanız aşağıdaki hizmetler için normal maliyetler geçerli olur:

2. Kurulum ve Gereksinimler

Ön koşullar

Bu laboratuvarı tamamlamak için bir Google Cloud hesabı ve projesi gerekir. Yeni proje oluşturma hakkında daha ayrıntılı talimatlar için bu codelab'i inceleyin.

Bu laboratuvarda, Google Cloud Console üzerinden erişilebilen ve gcloud ile Docker gibi birçok faydalı araçla önceden yapılandırılmış olarak gelen Cloud Shell'de çalışan Docker kullanılır. Cloud Shell'e nasıl erişeceğiniz aşağıda gösterilmiştir. Konsol penceresinin alt bölmesinde Cloud Shell'i görmek için sağ üstteki Cloud Shell simgesini tıklayın.

Cloud Shell

GKE kümesi için alternatif yapılandırma seçenekleri (isteğe bağlı)

Bu laboratuvar için bir Kubernetes kümesi gerekir. Bir sonraki bölümde, basit bir yapılandırmaya sahip bir GKE kümesi oluşturulur. Bu bölümde, GKE kullanarak Kubernetes kümesi oluştururken kullanabileceğiniz alternatif yapılandırma seçenekleri sunan bazı gcloud komutları gösterilmektedir. Örneğin, aşağıdaki komutları kullanarak farklı makine türlerini, bölgeleri ve hatta GPU'ları (hızlandırıcılar) tanımlayabilirsiniz.

  • Makine türlerini şu komutla listeleyin: gcloud compute machine-types list
  • GPU'ları şu komutla listeleyin: gcloud compute accelerator-types list
  • İşlem alt bölgelerini şu komutla listeleyin: gcloud compute zones list
  • Herhangi bir gcloud komutuyla ilgili yardım alma gcloud container clusters --help
    • Örneğin, bu komut bir Kubernetes kümesi oluşturma hakkında ayrıntılı bilgi verir gcloud container clusters create --help

GKE için yapılandırma seçeneklerinin tam listesini bu dokümanda bulabilirsiniz.

Kubernetes kümesini oluşturmaya hazırlanma

Cloud Shell'de bazı ortam değişkenlerini ayarlamanız ve gcloud istemcisini yapılandırmanız gerekir. Bu işlem aşağıdaki komutlarla gerçekleştirilir.

export PROJECT_ID=YOUR_PROJECT_ID
export DEFAULT_ZONE=us-central1-c

gcloud config set project ${PROJECT_ID}
gcloud config set compute/zone ${DEFAULT_ZONE}

GKE kümesi oluşturma

Bu laboratuvarda .NET Core uygulaması Kubernetes'e dağıtıldığı için bir küme oluşturmanız gerekir. GKE'yi kullanarak Google Cloud'da yeni bir Kubernetes kümesi oluşturmak için aşağıdaki komutu kullanın.

gcloud container clusters create dotnet-cluster \
  --zone ${DEFAULT_ZONE} \
  --num-nodes=1 \
  --node-locations=${DEFAULT_ZONE},us-central1-b \
  --enable-stackdriver-kubernetes \
  --machine-type=n1-standard-1 \
  --workload-pool=${PROJECT_ID}.svc.id.goog \
  --enable-ip-alias
  • --num-nodes, bölge başına eklenecek düğüm sayısıdır ve daha sonra ölçeklendirilebilir.
  • --node-locations, bölgelerin virgülle ayrılmış bir listesidir. Bu durumda, yukarıdaki ortam değişkeninde tanımladığınız bölge ve us-central1-b kullanılır.
    • NOT: Bu listede yinelenen öğeler bulunamaz.
  • --workload-pool, GKE iş yüklerinin Google Cloud hizmetlerine erişebilmesi için Workload Identity'yi oluşturur.

Küme oluşturulurken aşağıdaki mesaj gösterilir:

Creating cluster dotnet-cluster in us-central1-b... Cluster is being deployed...⠼

kubectl'yi yapılandırma

kubectl CLI, Kubernetes kümesiyle etkileşim kurmanın birincil yoludur. Yeni oluşturulan kümeyle kullanmak için kubectl'nin kümede kimlik doğrulaması yapacak şekilde yapılandırılması gerekir. Bu işlem aşağıdaki komutla yapılır.

$ gcloud container clusters get-credentials dotnet-cluster --zone ${DEFAULT_ZONE}
Fetching cluster endpoint and auth data.
kubeconfig entry generated for dotnet-cluster.

Artık kümeyle etkileşim kurmak için kubectl kullanılabilir.

$ kubectl get nodes
NAME                                            STATUS   ROLES    AGE     VERSION
gke-dotnet-cluster-default-pool-02c9dcb9-fgxj   Ready    <none>   2m15s   v1.16.13-gke.401
gke-dotnet-cluster-default-pool-ed09d7b7-xdx9   Ready    <none>   2m24s   v1.16.13-gke.401

3. Yerel olarak test etme ve istenen işlevleri onaylama

Bu laboratuvarda, Docker Hub'daki resmi .NET deposundan alınan aşağıdaki kapsayıcı görüntüleri kullanılır.

İşlevselliği doğrulamak için kapsayıcıyı yerel olarak çalıştırma

Cloud Shell'de, aşağıdaki Docker komutunu çalıştırarak Docker'ın düzgün şekilde çalıştığını ve .NET kapsayıcısının beklendiği gibi çalıştığını doğrulayın:

$ docker run --rm mcr.microsoft.com/dotnet/samples

      Hello from .NET!
      __________________
                        \
                        \
                            ....
                            ....'
                            ....
                          ..........
                      .............'..'..
                  ................'..'.....
                .......'..........'..'..'....
                ........'..........'..'..'.....
              .'....'..'..........'..'.......'.
              .'..................'...   ......
              .  ......'.........         .....
              .                           ......
              ..    .            ..        ......
            ....       .                 .......
            ......  .......          ............
              ................  ......................
              ........................'................
            ......................'..'......    .......
          .........................'..'.....       .......
      ........    ..'.............'..'....      ..........
    ..'..'...      ...............'.......      ..........
    ...'......     ...... ..........  ......         .......
  ...........   .......              ........        ......
  .......        '...'.'.              '.'.'.'         ....
  .......       .....'..               ..'.....
    ..       ..........               ..'........
            ............               ..............
          .............               '..............
          ...........'..              .'.'............
        ...............              .'.'.............
        .............'..               ..'..'...........
        ...............                 .'..............
        .........                        ..............
          .....
  
Environment:
.NET 5.0.1-servicing.20575.16
Linux 5.4.58-07649-ge120df5deade #1 SMP PREEMPT Wed Aug 26 04:56:33 PDT 2020

Web uygulaması işlevselliğini onaylama

Örnek bir web uygulaması Cloud Shell'de de doğrulanabilir. Aşağıdaki Docker run komutu, 80 bağlantı noktasını kullanıma sunan ve bunu localhost bağlantı noktası 8080 ile eşleyen yeni bir container oluşturur. Bu durumda localhost'nin Cloud Shell'de olduğunu unutmayın.

$ docker run -it --rm -p 8080:80 --name aspnetcore_sample mcr.microsoft.com/dotnet/samples:aspnetapp
warn: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[60]
      Storing keys in a directory '/root/.aspnet/DataProtection-Keys' that may not be persisted outside of the container. Protected data will be unavailable when container is destroyed.
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
      No XML encryptor configured. Key {64a3ed06-35f7-4d95-9554-8efd38f8b5d3} may be persisted to storage in unencrypted form.
info: Microsoft.Hosting.Lifetime[0]
      Now listening on: http://[::]:80
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
      Content root path: /app

Bu bir web uygulaması olduğundan bir web tarayıcısında görüntülenmesi ve doğrulanması gerekir. Bir sonraki bölümde, Web Önizleme'yi kullanarak Cloud Shell'de bu işlemin nasıl yapılacağı gösterilmektedir.

4. "Web Önizlemesi"ni kullanarak Cloud Shell'den hizmetlere erişme

Cloud Shell, Cloud Shell örneğinde çalışan işlemlerle etkileşim kurmak için tarayıcı kullanmayı mümkün kılan Web Önizlemesi özelliğini sunar.

Cloud Shell'de uygulamaları görüntülemek için "Web Önizlemesi"ni kullanma

Cloud Shell'de web önizleme düğmesini tıklayın ve "Preview on port 8080" (veya Web Önizleme'nin kullanmak üzere ayarlandığı bağlantı noktası) seçeneğini belirleyin.

Cloud Shell

Bu işlem, aşağıdaki gibi bir adrese sahip bir tarayıcı penceresi açar:

https://8080-cs-754738286554-default.us-central1.cloudshell.dev/

Web önizlemesini kullanarak .NET örnek uygulamasını görüntüleme

Son adımda başlatılan örnek uygulama, artık Web Önizleme başlatılarak ve sağlanan URL yüklenerek görüntülenebilir. Şuna benzer bir görünümde olacaktır:

.NET uygulaması V1'in ekran görüntüsü

5. Kubernetes'e dağıtma

YAML dosyasını oluşturma ve uygulama

Bir sonraki adımda, iki Kubernetes kaynağını (bir dağıtım ve bir hizmet) açıklayan bir YAML dosyası gerekir. Cloud Shell'de dotnet-app.yaml adlı bir dosya oluşturun ve aşağıdaki içerikleri ekleyin.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: dotnet-deployment
  labels:
    app: dotnetapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: dotnetapp
  template:
    metadata:
      labels:
        app: dotnetapp
    spec:
      containers:
      - name: dotnet
        image: mcr.microsoft.com/dotnet/samples:aspnetapp
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: dotnet-service
spec:
    selector:
      app: dotnetapp
    ports:
      - protocol: TCP
        port: 8080
        targetPort: 80

Şimdi bu dosyayı Kubernetes'e uygulamak için kubectl komutunu kullanın.

$ kubectl apply -f dotnet-app.yaml
deployment.apps/dotnet-deployment created
service/dotnet-service created

İstenen kaynakların oluşturulduğunu belirten mesajlara dikkat edin.

Oluşturulan kaynakları inceleme

Yukarıda oluşturulan kaynakları incelemek için kubectl CLI'yı kullanabiliriz. Öncelikle Dağıtım kaynaklarına bakalım ve yeni dağıtımın orada olduğunu doğrulayalım.

$ kubectl get deployment
NAME                READY   UP-TO-DATE   AVAILABLE   AGE
dotnet-deployment   3/3     3            3           80s

Şimdi ReplicaSet'lere göz atın. Yukarıdaki dağıtım tarafından oluşturulan bir ReplicaSet olmalıdır.

$ kubectl get replicaset
NAME                           DESIRED   CURRENT   READY   AGE
dotnet-deployment-5c9d4cc4b9   3         3         3       111s

Son olarak Pod'lara göz atın. Dağıtım, üç örnek olması gerektiğini belirtmişti. Aşağıdaki komut, üç örnek olduğunu göstermelidir. -o wide seçeneği, bu örneklerin çalıştığı düğümlerin gösterilmesi için eklenir.

$ kubectl get pod -o wide
NAME                                 READY   STATUS    RESTARTS   AGE     IP          NODE                                            NOMINATED NODE   READINESS GATES
dotnet-deployment-5c9d4cc4b9-cspqd   1/1     Running   0          2m25s   10.16.0.8   gke-dotnet-cluster-default-pool-ed09d7b7-xdx9   <none>           <none>
dotnet-deployment-5c9d4cc4b9-httw6   1/1     Running   0          2m25s   10.16.1.7   gke-dotnet-cluster-default-pool-02c9dcb9-fgxj   <none>           <none>
dotnet-deployment-5c9d4cc4b9-vvdln   1/1     Running   0          2m25s   10.16.0.7   gke-dotnet-cluster-default-pool-ed09d7b7-xdx9   <none>           <none>

Hizmet kaynağını inceleme

Kubernetes'teki Service kaynağı bir yük dengeleyicidir. Uç noktalar, kapsüllerdeki etiketlere göre belirlenir. Bu şekilde, yukarıdaki kubectl scale deployment işlemi aracılığıyla dağıtıma yeni pod'lar eklenir eklenmez, elde edilen pod'lar bu hizmet tarafından işlenen istekler için hemen kullanılabilir.

Aşağıdaki komut, hizmet kaynağını göstermelidir.

$ kubectl get svc
NAME             TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
dotnet-service   ClusterIP   10.20.9.124   <none>        8080/TCP   2m50s
...

Aşağıdaki komutla hizmet hakkında daha fazla ayrıntı görebilirsiniz.

$ kubectl describe svc dotnet-service
Name:              dotnet-service
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=dotnetapp
Type:              ClusterIP
IP:                10.20.9.124
Port:              <unset>  8080/TCP
TargetPort:        80/TCP
Endpoints:         10.16.0.7:80,10.16.0.8:80,10.16.1.7:80
Session Affinity:  None
Events:            <none>

Hizmetin ClusterIP türünde olduğuna dikkat edin. Bu, kümedeki herhangi bir kapsülün hizmet adını (dotnet-service) IP adresine çözümleyebileceği anlamına gelir. Hizmete gönderilen istekler, tüm örnekler (pod'lar) arasında yük dengelemesine tabi tutulur. Yukarıdaki Endpoints değeri, bu hizmet için kullanılabilen pod'ların IP'lerini gösterir. Bunları, yukarıda çıkışı verilen pod'ların IP'leriyle karşılaştırın.

Çalışan uygulamayı doğrulama

Bu noktada uygulama yayındadır ve kullanıcı istekleri için hazırdır. Erişmek için proxy kullanın. Aşağıdaki komut, 8080 bağlantı noktasındaki istekleri kabul eden ve bunları Kubernetes kümesine ileten yerel bir proxy oluşturur.

$ kubectl proxy --port 8080
Starting to serve on 127.0.0.1:8080

Şimdi Cloud Shell'de Web Önizlemesi'ni kullanarak web uygulamasına erişin.

Web önizlemesi tarafından oluşturulan URL'ye şunu ekleyin: /api/v1/namespaces/default/services/dotnet-service:8080/proxy/. Bu, şuna benzer bir sonuç verir:

https://8080-cs-473655782854-default.us-central1.cloudshell.dev/api/v1/namespaces/default/services/dotnet-service:8080/proxy/

Google Kubernetes Engine'de .NET Core uygulaması dağıtma işlemini tamamladınız. Ardından uygulamada bir değişiklik yapıp uygulamayı yeniden dağıtacağız.

6. Uygulamayı değiştirme

Bu bölümde, uygulamanın çalıştığı ana makineyi gösterecek şekilde uygulama değiştirilecek. Bu sayede, yük dengelemenin çalıştığını ve mevcut pod'ların beklendiği gibi yanıt verdiğini doğrulayabilirsiniz.

Kaynak kodunu alma

git clone https://github.com/dotnet/dotnet-docker.git
cd dotnet-docker/samples/aspnetapp/

Uygulamayı, ana makine adını içerecek şekilde güncelleyin.

vi aspnetapp/Pages/Index.cshtml
    <tr>
        <td>Host</td>
        <td>@Environment.MachineName</td>
    </tr>

Yeni bir kapsayıcı görüntüsü oluşturma ve yerel olarak test etme

Güncellenen kodla yeni container görüntüsünü oluşturun.

docker build --pull -t aspnetapp:alpine -f Dockerfile.alpine-x64 .

Daha önce yaptığınız gibi yeni uygulamayı yerel olarak test edin.

$ docker run --rm -it -p 8080:80 aspnetapp:alpine
warn: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[60]
      Storing keys in a directory '/root/.aspnet/DataProtection-Keys' that may not be persisted outside of the container. Protected data will be unavailable when container is destroyed.
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
      No XML encryptor configured. Key {f71feb13-8eae-4552-b4f2-654435fff7f8} may be persisted to storage in unencrypted form.
info: Microsoft.Hosting.Lifetime[0]
      Now listening on: http://[::]:80
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
      Content root path: /app

Uygulamaya daha önce olduğu gibi Web Önizleme kullanılarak erişilebilir. Bu kez, Host parametresi aşağıda gösterildiği gibi görünür olmalıdır:

Cloud Shell

Cloud Shell'de yeni bir sekme açın ve docker ps komutunu çalıştırarak kapsayıcı kimliğinin yukarıda gösterilen ana makine değeriyle eşleştiğini doğrulayın.

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
ab85ce11aecd        aspnetapp:alpine    "./aspnetapp"       2 minutes ago       Up 2 minutes        0.0.0.0:8080->80/tcp   relaxed_northcutt

Görüntüyü etiketleyip göndererek Kubernetes'te kullanılabilir hale getirme

Kubernetes'in görüntüyü alabilmesi için görüntünün etiketlenmesi ve aktarılması gerekir. Kapsayıcı görüntülerini listeleyerek başlayın ve istediğiniz görüntüyü belirleyin.

$ docker image list
REPOSITORY                                         TAG                 IMAGE ID            CREATED             SIZE
aspnetapp                                          alpine              95b4267bb6d0        6 days ago          110MB

Ardından bu görüntüyü etiketleyip Google Container Registry'ye aktarın. Yukarıdaki IMAGE ID'yi kullandığınızda şu şekilde görünür:

docker tag 95b4267bb6d0 gcr.io/${PROJECT_ID}/aspnetapp:alpine
docker push gcr.io/${PROJECT_ID}/aspnetapp:alpine

7. Güncellenen uygulamayı yeniden dağıtma

YAML dosyasını düzenleme

dotnet-app.yaml dosyasının kaydedildiği dizine geri dönün. YAML dosyasında aşağıdaki satırı bulun:

        image: mcr.microsoft.com/dotnet/core/samples:aspnetapp

Bu değerin, yukarıda oluşturulan ve gcr.io'ya gönderilen container görüntüsüne referans verecek şekilde değiştirilmesi gerekir.

        image: gcr.io/PROJECT_ID/aspnetapp:alpine

PROJECT_ID değerinizi kullanmak için bu kodu değiştirmeyi unutmayın. İşlemi tamamladığınızda şuna benzer bir görünüm elde edersiniz:

        image: gcr.io/myproject/aspnetapp:alpine

Güncellenen YAML dosyasını uygulama

$ kubectl apply -f dotnet-app.yaml
deployment.apps/dotnet-deployment configured
service/dotnet-service unchanged

Dağıtım kaynağının güncellendiğini ve Hizmet kaynağının değişmediğini göreceksiniz. Güncellenen kapsüller, daha önce olduğu gibi kubectl get pod komutuyla görülebilir ancak bu kez -w komutunu ekleyeceğiz. Bu komut, tüm değişiklikleri gerçekleştiği anda izler.

$ kubectl get pod -w
NAME                                 READY   STATUS              RESTARTS   AGE
dotnet-deployment-5c9d4cc4b9-cspqd   1/1     Running             0          34m
dotnet-deployment-5c9d4cc4b9-httw6   1/1     Running             0          34m
dotnet-deployment-5c9d4cc4b9-vvdln   1/1     Running             0          34m
dotnet-deployment-85f6446977-tmbdq   0/1     ContainerCreating   0          4s
dotnet-deployment-85f6446977-tmbdq   1/1     Running             0          5s
dotnet-deployment-5c9d4cc4b9-vvdln   1/1     Terminating         0          34m
dotnet-deployment-85f6446977-lcc58   0/1     Pending             0          0s
dotnet-deployment-85f6446977-lcc58   0/1     Pending             0          0s
dotnet-deployment-85f6446977-lcc58   0/1     ContainerCreating   0          0s
dotnet-deployment-5c9d4cc4b9-vvdln   0/1     Terminating         0          34m
dotnet-deployment-85f6446977-lcc58   1/1     Running             0          6s
dotnet-deployment-5c9d4cc4b9-cspqd   1/1     Terminating         0          34m
dotnet-deployment-85f6446977-hw24v   0/1     Pending             0          0s
dotnet-deployment-85f6446977-hw24v   0/1     Pending             0          0s
dotnet-deployment-5c9d4cc4b9-cspqd   0/1     Terminating         0          34m
dotnet-deployment-5c9d4cc4b9-vvdln   0/1     Terminating         0          34m
dotnet-deployment-5c9d4cc4b9-vvdln   0/1     Terminating         0          34m
dotnet-deployment-85f6446977-hw24v   0/1     Pending             0          2s
dotnet-deployment-85f6446977-hw24v   0/1     ContainerCreating   0          2s
dotnet-deployment-5c9d4cc4b9-cspqd   0/1     Terminating         0          34m
dotnet-deployment-5c9d4cc4b9-cspqd   0/1     Terminating         0          34m
dotnet-deployment-85f6446977-hw24v   1/1     Running             0          3s
dotnet-deployment-5c9d4cc4b9-httw6   1/1     Terminating         0          34m
dotnet-deployment-5c9d4cc4b9-httw6   0/1     Terminating         0          34m

Yukarıdaki çıkış, periyodik güncellemeyi gerçekleştiği sırada gösterir. Önce yeni container'lar başlatılır ve bunlar çalışmaya başladığında eski container'lar sonlandırılır.

Çalışan uygulamayı doğrulama

Bu noktada uygulama güncellenir ve kullanıcı istekleri için hazır hale gelir. Daha önce olduğu gibi, proxy kullanılarak erişilebilir.

$ kubectl proxy --port 8080
Starting to serve on 127.0.0.1:8080

Şimdi Cloud Shell'de Web Önizlemesi'ni kullanarak web uygulamasına erişin.

Web önizlemesi tarafından oluşturulan URL'ye şunu ekleyin: /api/v1/namespaces/default/services/dotnet-service:8080/proxy/. Bu, şuna benzer bir sonuç verir:

https://8080-cs-473655782854-default.us-central1.cloudshell.dev/api/v1/namespaces/default/services/dotnet-service:8080/proxy/

Kubernetes hizmetinin yükü dağıttığını doğrulama

Bu URL'yi birkaç kez yenileyin ve istekler Hizmet tarafından farklı pod'lar arasında yük dengelemesine tabi tutuldukça ana makinenin değiştiğini fark edin. Tüm kapsüllerin trafik aldığını görmek için ana makine değerlerini yukarıdaki kapsül listesiyle karşılaştırın.

Örnekleri ölçeklendirme

Kubernetes'te uygulamaları ölçeklendirmek kolaydır. Aşağıdaki komut, dağıtımı uygulamanın 6 örneğine kadar ölçeklendirir.

$ kubectl scale deployment dotnet-deployment --replicas 6
deployment.apps/dotnet-deployment scaled

Yeni pod'lar ve mevcut durumları şu komutla görüntülenebilir:

kubectl get pod -w

Aynı tarayıcı penceresini yenilediğinizde trafiğin artık tüm yeni pod'lar arasında dengelendiğini göreceksiniz.

8. Tebrikler!

Bu laboratuvarda, .NET Core örnek web uygulaması bir geliştirici ortamında doğrulandı ve ardından GKE kullanılarak Kubernetes'e dağıtıldı. Ardından uygulama, çalıştığı container'ın ana makine adını gösterecek şekilde değiştirildi. Ardından Kubernetes dağıtımı yeni sürüme güncellendi ve yükün ek örnekler arasında nasıl dağıtıldığını göstermek için uygulama ölçeği artırıldı.

.NET ve Kubernetes hakkında daha fazla bilgi edinmek için bu eğitimlere göz atabilirsiniz. Bu laboratuvarlar, daha gelişmiş yönlendirme ve esneklik kalıpları için Istio hizmet ağını tanıtarak bu laboratuvarda öğrenilenleri temel alır.

9. Temizleme

İstenmeyen maliyetlerden kaçınmak için aşağıdaki komutları kullanarak bu laboratuvarda oluşturulan kümeyi ve container görüntüsünü silin.

gcloud container clusters delete dotnet-cluster --zone ${DEFAULT_ZONE}
gcloud container images delete gcr.io/${PROJECT_ID}/aspnetapp:alpine