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

1. Genel Bakış

Microsoft .NET Core, .NET'in açık kaynaklı ve platformlar arası bir sürümüdür ve container'larda yerel olarak çalışabilir. .NET Core, GitHub'da kullanılabilir ve Microsoft ile .NET topluluğu tarafından desteklenir. 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 üretime dağıtıldığı tipik bir geliştirme modeli izlenir. Laboratuvarın ilk bölümünde, Cloud Shell'de çalışan bir kapsayıcı kullanılarak örnek bir .NET Core uygulaması doğrulanır. Doğrulandıktan sonra 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 kapsayıcını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 resimde bu laboratuvardaki etkinliklerin sırası gösterilmektedir:

Demo adım sırası diyagramı

Maliyetler

Bu laboratuvarı tam olarak yazıldığı gibi çalıştırırsanız aşağıdaki hizmetler için normal maliyetler uygulanır.

2. Kurulum ve Gereksinimler

Ön koşullar

Bu laboratuvarı tamamlamak için 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ılmaktadır. Cloud Shell'e nasıl erişeceğiniz aşağıda açıklanmıştır. Sağ üstteki Cloud Shell simgesini tıklayarak konsol penceresinin alt bölmesinde Cloud Shell'i gösterin.

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 kullanılabilecek alternatif yapılandırma seçenekleri sunan bazı gcloud komutları gösterilmektedir. Örneğin, aşağıdaki komutlar kullanılarak farklı makine türleri, bölgeler ve hatta GPU'lar (hızlandırıcılar) tanımlanabilir.

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

GKE'deki yapılandırma seçeneklerinin tam listesi için bu belgeye bakın.

Kubernetes kümesini oluşturmaya hazırlanma

Cloud Shell'de bazı ortam değişkenlerinin ayarlanması ve gcloud istemcisinin yapılandırılması 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ığından bir küme oluşturulması 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, virgülle ayrılmış bölgelerin 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 mükerrer giriş bulunamaz.
  • --workload-pool, GKE iş yüklerinin Google Cloud hizmetlerine erişebilmesi için iş yükü kimliğini oluşturur.

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

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

kubectl'ı yapılandırma

kubectl CLI, Kubernetes kümesiyle etkileşim kurmanın birincil yoludur. Yeni oluşturulan kümede kullanılabilmesi için küme üzerinde kimlik doğrulama 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şlevselliği onaylama

Bu laboratuvarda, Docker Hub'daki resmi .NET deposundan aşağıdaki container görüntüleri kullanılmaktadı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ışıp çalışmadığını ve .NET kapsayıcısının beklendiği gibi çalışıp çalışmadığı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'ye eşleyen yeni bir container oluşturur. Bu durumda localhost öğesinin 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 web tarayıcısında görüntülenmesi ve doğrulanması gerekir. 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, Web Önizleme özelliğini sunar. Bu özellik sayesinde, Cloud Shell örneğinde çalışan işlemlerle etkileşim kurmak için tarayıcı kullanabilirsiniz.

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

Cloud Shell'de web önizlemesi düğmesini tıklayın ve "8080 bağlantı noktasında önizle"yi (veya Web Önizlemesi'nin kullanacağı bağlantı noktasını) seçin.

Cloud Shell

Bu işlemle, aşağıdaki gibi bir adrese sahip tarayıcı penceresi açılır:

https://8080-cs-754738286554-default.us-central1.cloudshell.dev/?authuser=0

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ılıp sağlanan URL yüklenerek görüntülenebilir. Şuna benzer bir görünümde olacaktır:

.NET uygulaması V1&#39;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.

Elde edilen kaynakları keşfetme

Yukarıda oluşturulan kaynakları incelemek için kubectl KSA'yı kullanabiliriz. Öncelikle, dağıtım kaynaklarına göz atıp yeni dağıtımın mevcut olduğunu doğrulayalım.

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

Ardından ReplicaSet'lere göz atın. Yukarıdaki dağıtım tarafından bir ReplicaSet oluşturulmalıdır.

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

Son olarak Kapsüller'e göz atın. Dağıtım, üç örnek olması gerektiğini belirtiyordu. Aşağıdaki komut, üç örnek olduğunu göstermelidir. Bu örneklerin çalıştığı düğümlerin gösterilmesi için -o wide seçeneği 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, Pod'lerdeki etiketlere göre belirlenir. Bu sayede, yukarıdaki kubectl scale deployment işlemiyle dağıtıma yeni kapsüller eklendiği anda, ortaya çıkan kapsüller söz konusu 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
...

Hizmet hakkında daha fazla bilgiyi aşağıdaki komutla 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 dotnet-service hizmet adını IP adresine çözümleyebileceği anlamına gelir. Hizmete gönderilen istekler, tüm örnekler (kapsüller) arasında yük dengelemesi yapılır. Yukarıdaki Endpoints değeri, şu anda 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ı isteklerine hazırdır. Bu siteye 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

Web uygulamasına erişmek için Cloud Shell'de web önizlemeyi kullanın.

Web önizleme tarafından oluşturulan URL'ye şunları ekleyin: /api/v1/namespaces/default/services/dotnet-service:8080/proxy/. Bu durumda sonuç aşağıdaki gibi görünür:

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ğıttığınız için tebrik ederiz. Ardından uygulamada değişiklik yapıp yeniden dağıtacağız.

6. Uygulamayı değiştirme

Bu bölümde, uygulamanın örneğin üzerinde çalıştığı ana makineyi gösterecek şekilde değiştirilmesi sağlanır. Bu, yük dengelemenin çalıştığını ve kullanılabilir pod'lerin beklendiği gibi yanıt verdiğini doğrulamanızı sağlar.

Kaynak kodu 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ı resmi oluşturma ve yerel olarak test etme

Yeni kapsayıcı görüntüsünü güncellenmiş kodla oluşturun.

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

Yeni uygulamayı daha önce olduğu gibi 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 önizlemesi kullanılarak erişilebilir. Bu kez, burada gösterildiği gibi Host parametresi görünür olmalıdır:

Cloud Shell

Cloud Shell'de yeni bir sekme açın ve kapsayıcı kimliğinin yukarıda gösterilen ana makine değeriyle eşleştiğini görmek için docker ps komutunu çalıştırı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 Kubernetes'te kullanılabilir hale getirmek için gönderin.

Kubernetes'in görüntüyü çekebilmesi için görüntünün etiketlenmesi ve aktarılması gerekir. Öncelikle 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ü etiketleyin ve Google Container Registry'ye aktarın. Yukarıdaki RESİM KİMLİĞİ kullanıldığında bu şöyle 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ğıtın

YAML dosyasını düzenleme

Dosyanın dotnet-app.yaml 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, yukarıda oluşturulan ve gcr.io'ya gönderilen kapsayıcı görüntüsüne referans verecek şekilde değiştirilmelidir.

        image: gcr.io/PROJECT_ID/aspnetapp:alpine

PROJECT_ID kullanmak için kodu değiştirmeyi unutmayın. İşlemi tamamladığınızda aşağıdaki gibi görünür.

        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, hizmet kaynağının ise değişmediğini fark edin. Güncellenen pod'lar, 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şirken izleyecektir.

$ 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 çıktı, periyodik güncellemeyi gerçekleşirken gösterir. Öncelikle yeni kapsayıcılar başlatılır ve çalışmaya başladıklarında eski kapsayıcılar sonlandırılır.

Çalışan uygulamayı doğrulama

Bu noktada uygulama güncellenir ve kullanıcı isteklerine hazır hâle gelir. Daha önce olduğu gibi, proxy kullanılarak erişilebilir.

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

Web uygulamasına erişmek için Cloud Shell'de web önizlemeyi kullanın.

Web önizleme tarafından oluşturulan URL'ye şunları ekleyin: /api/v1/namespaces/default/services/dotnet-service:8080/proxy/. Bu durumda sonuç aşağıdaki gibi görünür:

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ı onaylayın

Bu URL'yi birkaç kez yenileyin ve istekler Hizmet tarafından farklı pod'lar arasında yük dengelemesi yapıldıkç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.

Örneklerin ölçeğini artırma

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ı bu komutla görüntülenebilir.

kubectl get pod -w

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

8. Tebrikler!

Bu laboratuvarda, bir .NET Core örnek web uygulaması geliştirme ortamında doğrulandı ve ardından GKE kullanılarak Kubernetes'e dağıtıldı. Uygulama daha sonra, çalıştığı kapsayıcını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 uygulamanın ölçeği artırıldı.

.NET ve Kubernetes hakkında daha fazla bilgi edinmek için aşağıdaki eğitimleri inceleyin. Bu laboratuvar, 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 maliyetleri önlemek için bu laboratuvarda oluşturulan kümeyi ve kapsayıcı görüntüsünü silmek üzere aşağıdaki komutları kullanın.

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