Python ile Cloud Workstations kullanarak InnerLoop Geliştirme

1. Genel Bakış

Bu laboratuvarda, container mimarisine alınmış bir ortamda Python uygulamaları geliştirmekle görevli yazılım mühendislerinin geliştirme iş akışını kolaylaştırmak için tasarlanmış özellikler ve beceriler gösterilmektedir. Tipik container geliştirme yöntemleri, kullanıcının container ayrıntılarını ve container derleme sürecini anlamasını gerektirir. Buna ek olarak, geliştiricilerin uzak ortamlarda uygulamalarını test etmek ve hata ayıklamak için genellikle akışlarını kesmeleri, IDE'lerinden çıkmaları gerekir. Geliştiriciler, bu eğitimde bahsedilen araçlar ve teknolojiler sayesinde, IDE'lerinden ayrılmadan container mimarisine alınmış uygulamalarla verimli bir şekilde çalışabilirler.

Öğrenecekleriniz

Bu laboratuvarda, GCP'de container'larla geliştirme yapmaya yönelik aşağıdaki gibi yöntemleri öğreneceksiniz:

  • Yeni Python başlangıç uygulaması oluşturma
  • Geliştirme sürecini adım adım gösterme
  • Basit bir CRUD dinlenme hizmeti geliştirin
  • GKE'ye dağıtma
  • Hata durumunda hata ayıklama
  • Kesme noktası / günlük kayıtlarını kullanma
  • Değişiklikleri GKE'ye doğrudan dağıtım

58a4cdd3ed7a123a.png

2. Kurulum ve Gereksinimler

Kendi hızınızda ortam kurulumu

  1. Google Cloud Console'da oturum açıp yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Proje adı, bu projenin katılımcıları için görünen addır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. İstediğiniz zaman güncelleyebilirsiniz.
  • Proje Kimliği, tüm Google Cloud projelerinde benzersizdir ve değiştirilemez (belirlendikten sonra değiştirilemez). Cloud Console, otomatik olarak benzersiz bir dize oluşturur. bunun ne olduğunu umursamıyorsunuz. Çoğu codelab'de proje kimliğini (genellikle PROJECT_ID olarak tanımlanır) referans almanız gerekir. Oluşturulan kimliği beğenmezseniz rastgele bir kimlik daha oluşturabilirsiniz. Alternatif olarak, kendi ölçümünüzü deneyip mevcut olup olmadığına bakabilirsiniz. Bu adımdan sonra değiştirilemez ve proje süresince kalır.
  • Bilginiz için bazı API'lerin kullandığı üçüncü bir değer, yani Proje Numarası daha vardır. Bu değerlerin üçü hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Sonraki adımda, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i çalıştırmanın maliyeti, yüksek değildir. Bu eğitim dışında faturalandırma yapılmaması için kaynakları kapatmak isterseniz oluşturduğunuz kaynakları silebilir veya projenin tamamını silebilirsiniz. Yeni Google Cloud kullanıcıları, 300 ABD doları değerindeki ücretsiz denemeden yararlanabilir.

Cloudshell Düzenleyiciyi Başlat

Bu laboratuvar, Google Cloud Shell Düzenleyici ile birlikte kullanılmak üzere tasarlanmış ve test edilmiştir. Düzenleyiciye erişmek için

  1. https://console.cloud.google.com adresinden Google projenize erişin.
  2. Sağ üst köşedeki Cloud Shell düzenleyici simgesini tıklayın.

8560cc8d45e8c112.png

  1. Pencerenizin alt kısmında yeni bir bölme açılır
  2. Düzenleyiciyi Aç düğmesini tıklayın.

9e504cb98a6a8005.png

  1. Düzenleyici, sağda bir gezgin, orta alanda ise düzenleyici açılır.
  2. Ekranın alt kısmında da bir terminal bölmesi bulunmalıdır
  3. Terminal AÇIK DEĞİLSE yeni bir terminal penceresi açmak için "ctrl+"" tuş kombinasyonunu kullanın.

Ortam Kurulumu

Cloud Shell'de projenizin kimliğini ve proje numarasını ayarlayın. Bunları PROJECT_ID ve PROJECT_ID değişkenleri olarak kaydedin.

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID \
    --format='value(projectNumber)')

Bu laboratuvarda kullanılan altyapıyı sağlayın

Bu laboratuvarda, GKE'ye kod dağıtacak ve bir Spanner veritabanında depolanan verilere erişeceksiniz. IDE olarak Cloud iş istasyonlarını da kullanacaksınız. Aşağıdaki kurulum komut dosyası, bu altyapıyı sizin için hazırlar.

  1. Kurulum komut dosyasını indirin ve yürütülebilir hale getirin.
wget https://raw.githubusercontent.com/GoogleCloudPlatform/container-developer-workshop/main/labs/python/setup_with_cw.sh
chmod +x setup_with_cw.sh
  1. setup_with_cw.sh dosyasını açın ve şu anda CHANGEME olarak ayarlanmış şifrelerin değerlerini düzenleyin
  2. Bu laboratuvarda kullanacağınız GKE kümesini ve Spanner veritabanını desteklemek için kurulum komut dosyasını çalıştırın
./setup_with_cw.sh &

Cloud Workstations Kümesi

  1. Cloud Console'da Cloud Workstations'ı açın. Kümenin READY durumunda olmasını bekleyin.

305e1a3d63ac7ff6.png

İş İstasyonları Yapılandırması Oluşturma

  1. Cloud Shell oturumunuzun bağlantısı kesildiyse "Yeniden bağlan"ı tıklayın Ardından proje kimliğini ayarlamak için gcloud cli komutunu çalıştırın. Komutu çalıştırmadan önce aşağıdaki örnek proje kimliğini qwiklabs proje kimliğinizle değiştirin.
gcloud config set project qwiklabs-gcp-project-id
  1. Cloud Workstations yapılandırması oluşturmak için aşağıdaki komut dosyasını indirip terminalde çalıştırın.
wget https://raw.githubusercontent.com/GoogleCloudPlatform/container-developer-workshop/main/labs/python/workstation_config_setup.sh
chmod +x workstation_config_setup.sh
./workstation_config_setup.sh
  1. Yapılandırmalar bölümündeki sonuçları doğrulayın. READY durumuna geçiş 2 dakika sürer.

2e23c2e9983d1ccf.png

  1. Console'da Cloud Workstations'ı açın ve yeni örnek oluşturun.

a53adeeac81a78c8.png

  1. Adı my-workstation olarak değiştirin ve mevcut yapılandırmayı seçin: codeoss-python.

f052cd47701ec774.png

  1. İş İstasyonları bölümündeki sonuçları doğrulayın.

İş İstasyonunu Başlat

  1. İş istasyonunu başlatın ve başlatın. İş istasyonunun başlatılması birkaç dakika sürer.

682f8a307032cba3.png

  1. Adres çubuğundaki simgeyi tıklayarak 3. taraf çerezlerine izin verin. 1b8923e2943f9bc4.png

fcf9405b6957b7d7.png

  1. "Site çalışmıyor mu?" seçeneğini tıklayın.

36a84c0e2e3b85b.png

  1. "Çerezlere izin ver"i tıklayın.

2259694328628fba.png

  1. İş istasyonu açıldığında Code OSS IDE görünür. "Tamamlandı Olarak İşaretle"yi tıklayın Başlarken sayfasında iş istasyonu IDE'sini

94874fba9b74cc22.png

3. Yeni bir Python başlangıç uygulaması oluşturun

Bu bölümde yeni bir Python uygulaması oluşturacaksınız.

  1. Yeni bir Terminal açın.

c31d48f2e4938c38.png

  1. Yeni bir dizin oluşturup çalışma alanı olarak açın
mkdir music-service && cd music-service

code-oss-cloud-workstations -r --folder-uri="$PWD"

Bu mesajı görürseniz İzin Ver düğmesini tıklayın. Böylece, kopyalayıp iş istasyonuna yapıştırabilirsiniz.

58149777e5cc350a.png

  1. requirements.txt adında bir dosya oluşturun ve aşağıdaki içeriği bu dosyaya kopyalayın

789e8389170bd900.png

Flask
gunicorn
google-cloud-spanner
ptvsd==4.3.2
  1. app.py adında bir dosya oluşturun ve aşağıdaki kodu dosyaya yapıştırın
import os
from flask import Flask, request, jsonify
from google.cloud import spanner

app = Flask(__name__)

@app.route("/")
def hello_world():
    message="Hello, World!"
    return message

if __name__ == '__main__':
    server_port = os.environ.get('PORT', '8080')
    app.run(debug=False, port=server_port, host='0.0.0.0')

  1. Dockerfile adında bir dosya oluşturun ve aşağıdakini bu dosyaya yapıştırın
FROM python:3.8
ARG FLASK_DEBUG=0
ENV FLASK_DEBUG=$FLASK_DEBUG
ENV FLASK_APP=app.py
WORKDIR /app
COPY requirements.txt .
RUN pip install --trusted-host pypi.python.org -r requirements.txt
COPY . .
ENTRYPOINT ["python3", "-m", "flask", "run", "--port=8080", "--host=0.0.0.0"]

Not: FLASK_DEBUG=1, kod değişikliklerini bir Python flask uygulamasına otomatik olarak yeniden yüklemenize olanak tanır. Bu Dockerfile, bu değeri derleme bağımsız değişkeni olarak iletmenize olanak tanır.

Manifest Oluşturma

Terminalinizde varsayılan bir skaffold.yaml ve deployment.yaml oluşturmak için aşağıdaki komutu yürütün.

  1. Aşağıdaki komutla Skaffold'ı başlatın
skaffold init --generate-manifests

İstendiğinde imlecinizi hareket ettirmek için okları, seçenekleri belirlemek için boşluk çubuğunu kullanın.

Seçin:

  • Taşıma işlemi için 8080
  • Yapılandırmayı kaydetmek için y

Skaffold Yapılandırmalarını Güncelle

  • Varsayılan uygulama adını değiştirme
  • skaffold.yaml uygulamasını aç
  • Şu anda dockerfile-image olarak ayarlanmış olan resim adını seçin
  • Sağ tıklayın ve Tüm Tekrarları Değiştir'i seçin
  • Yeni adı python-app olarak yazın
  • Derleme bölümünü daha sonra düzenleyerek
  • FLASK_DEBUG=1 pasosuna docker.buildArgs eklendi
  • *.py dosyalarında yapılan değişiklikleri IDE'den çalışan kapsayıcıya yüklemek için ayarları senkronize et

Düzenlemelerden sonra skaffold.yaml dosyasındaki derleme bölümü aşağıdaki gibi olacaktır:

build:
 artifacts:
 - image: python-app
   docker:
     buildArgs:
       FLASK_DEBUG: "1"
     dockerfile: Dockerfile
   sync:
     infer:
     - '**/*.py'

Kubernetes Yapılandırma Dosyasını Değiştirme

  1. Varsayılan adı değiştirme
  • deployment.yaml dosyasını aç
  • Şu anda dockerfile-image olarak ayarlanmış olan resim adını seçin
  • Sağ tıklayın ve Tüm Tekrarları Değiştir'i seçin
  • Yeni adı python-app olarak yazın

4. Geliştirme sürecinde rehberlik etme

Eklenen iş mantığı sayesinde artık uygulamanızı dağıtıp test edebilirsiniz. Aşağıdaki bölümde Cloud Code eklentisinin kullanımı gösterilmiştir. Diğer işlevlerinin yanı sıra, bu eklenti skaffold ile entegre olarak geliştirme sürecinizi kolaylaştırır. Aşağıdaki adımlarda GKE'ye dağıtım yaptığınızda Cloud Code ve Skaffold, container görüntünüzü otomatik olarak derler, Container Registry'ye aktarır ve ardından your uygulamasını GKE'ye dağıtır. Bu, perde arkasında olup ayrıntıları geliştirici akışından uzaklaştırarak gerçekleşir.

Google Cloud'da oturum açma

  1. Cloud Code simgesini tıklayın ve "Sign in to Google Cloud" (Google Cloud'da oturum aç) seçeneğini belirleyin:

1769afd39be372ff.png

  1. "Oturum açmak için devam et"i tıklayın.

923bb1c8f63160f9.png

  1. Terminal'de çıkışı kontrol edin ve bağlantıyı açın:

517fdd579c34aa21.png

  1. Qwiklabs öğrenci kimlik bilgilerinizle giriş yapın.

db99b345f7a8e72c.png

  1. "İzin Ver"i seçin:

a5376553c430ac84.png

  1. Doğrulama kodunu kopyalayın ve Workstation sekmesine dönün.

6719421277b92eac.png

  1. Doğrulama kodunu yapıştırın ve Enter tuşuna basın.

e9847cfe3fa8a2ce.png

Kubernetes Kümesi Ekle

  1. Küme Ekle

62a3b97bdbb427e5.png

  1. Google Kubernetes Engine'i seçin:

9577de423568bbaa.png

  1. Proje seçin.

c5202fcbeebcd41c.png

  1. "python-cluster" seçeneğini belirleyin ilk kurulumda oluşturulan bir feed'dir.

719c2fc0a7f9e84f.png

  1. Bu küme, Cloud Code altındaki Kubernetes kümeleri listesinde gösterilir. Buradan kümeye göz atabilir ve kümeyi keşfedebilirsiniz.

7e5f50662d4eea3c.png

gcloud cli'yi kullanarak geçerli proje kimliğini ayarlayın

  1. Qwiklabs sayfasından bu laboratuvarın proje kimliğini kopyalayın.

fcff2d10007ec5bc.png

  1. Proje kimliğini ayarlamak için terminalden gcloud cli komutunu çalıştırın. Komutu çalıştırmadan önce örnek proje kimliğini değiştirin. Aşağıdaki komutu çalıştırmadan önce proje kimliğini değiştirin.
gcloud config set project qwiklabs-gcp-project-id

Kubernetes'e dağıtma

  1. Cloud Shell Düzenleyici'nin alt kısmındaki bölmeden Cloud Code'u seçin.

d99a88992e15fea9.png

  1. Üst kısımda gösterilen panelde Run on Kubernetes'i (Kubernetes'te çalıştır) seçin. İstenirse geçerli Kubernetes bağlamını kullanmak için Evet'i seçin.

bfd65e9df6d4a6cb.png

Bu komut, kaynak kodun bir derlemesini başlatır ve ardından testleri çalıştırır. Derleme ve testlerin çalıştırılması birkaç dakika sürer. Bu testler, birim testlerini ve dağıtım ortamı için ayarlanmış kuralları kontrol eden bir doğrulama adımını içerir. Bu doğrulama adımı zaten yapılandırılmıştır ve geliştirme ortamınızda çalışmaya devam ederken bile dağıtım sorunlarıyla ilgili uyarı almanızı sağlar.

  1. Komutu ilk kez çalıştırdığınızda ekranın üst kısmında geçerli Kubernetes bağlamını kullanmak isteyip istemediğinizi soran bir istem görünür, "Evet"i seçin geçerli bağlamı kabul edip kullanmak.
  2. Ardından, hangi container kayıt defterinin kullanılacağını soran bir istem gösterilir. Sağlanan varsayılan değeri kabul etmek için Enter tuşuna basın
  3. "Çıkış"ı seçin sekmesine giderek ilerlemeyi ve bildirimleri görüntüleyebilirsiniz. Açılır listeden "Kubernetes: Run/Debug" (Kubernetes: Çalıştır/Hata Ayıklama) seçeneğini belirleyin.

9c87ccbf5d06f50a.png

  1. "Kubernetes: Çalıştır/Hata Ayıklama - Ayrıntılı" seçeneğini belirleyin "Kanaldan canlı yayınlanan" ek ayrıntıları ve günlükleri görüntülemek için sağdaki kanal açılır

804abc8833ffd571.png

Derleme ve testler tamamlandığında Çıkış sekmesi günlüklerinde "Kubernetes: Run/Debug" (Kubernetes: Çalıştır/Hata Ayıklama) bölümünde http://localhost:8080 URL'si listelenir. görünüm.

  1. Cloud Code terminalinde çıkıştaki ilk URL'nin (http://localhost:8080) üzerine gelin. Ardından, görünen araç ucunda Web Önizlemesini Aç'ı seçin.
  2. Yeni bir tarayıcı sekmesinde şu mesaj gösterilir: Hello, World!

Sıcak Yeniden Yükle

  1. app.py dosyasını aç
  2. Karşılama mesajını Hello from Python olarak değiştir

İzleyicinin, Output penceresinde, Kubernetes: Run/Debug görünümünde, güncellenen dosyaları Kubernetes'teki kapsayıcıyla senkronize ettiğine hemen dikkat edin.

Update initiated
Build started for artifact python-app
Build completed for artifact python-app

Deploy started
Deploy completed

Status check started
Resource pod/python-app-6f646ffcbb-tn7qd status updated to In Progress
Resource deployment/python-app status updated to In Progress
Resource deployment/python-app status completed successfully
Status check succeeded
...
  1. Kubernetes: Run/Debug - Detailed görünümüne geçerseniz dosyalardaki değişiklikleri algılayıp uygulamayı derleyip yeniden dağıttığını görürsünüz
files modified: [app.py]
Syncing 1 files for gcr.io/veer-pylab-01/python-app:3c04f58-dirty@sha256:a42ca7250851c2f2570ff05209f108c5491d13d2b453bb9608c7b4af511109bd
Copying files:map[app.py:[/app/app.py]]togcr.io/veer-pylab-01/python-app:3c04f58-dirty@sha256:a42ca7250851c2f2570ff05209f108c5491d13d2b453bb9608c7b4af511109bd
Watching for changes...
[python-app] * Detected change in '/app/app.py', reloading
[python-app] * Restarting with stat
[python-app] * Debugger is active!
[python-app] * Debugger PIN: 744-729-662
  1. Güncel sonuçları görmek için, önceki sonuçları gördüğünüz tarayıcı sekmenizi yenileyin.

Hata ayıklama

  1. Hata Ayıklama görünümüne gidin ve mevcut iş parçacığını (647213126d7a4c7b.png) durdurun. İstenirse her çalıştırmadan sonra temizlemeyi seçebilirsiniz.
  2. 70d6bd947d04d1e6.png
  3. Uygulamayı debug modunda çalıştırmak için alt menüde Cloud Code simgesini tıklayın ve Debug on Kubernetes seçeneğini belirleyin.
  • Output penceresinin Kubernetes Run/Debug - Detailed görünümünde, skaffold'un bu uygulamayı hata ayıklama modunda dağıttığına dikkat edin.
  1. İşlem tamamlandığında. Bir hata ayıklayıcı ekli olduğunu ve Çıkış sekmesinde şu ifadeleri görürsünüz: Attached debugger to container "python-app-8476f4bbc-h6dsl" successfully. ve http://localhost:8080 URL'si listelenir.
Port forwarding pod/python-app-8bd64cf8b-cskfl in namespace default, remote port 5678 -> http://127.0.0.1:5678
  1. Alttaki durum çubuğunun rengi maviden turuncuya dönüşür ve bu da Hata Ayıklama modunda olduğunu gösterir.
  2. Kubernetes Run/Debug görünümünde, Hata Ayıklanabilir bir container'ın başlatıldığına dikkat edin
**************URLs*****************
Forwarded URL from service python-app: http://localhost:8080
Debuggable container started pod/python-app-8bd64cf8b-cskfl:python-app (default)
Update succeeded
***********************************

Kesme noktalarından yararlanma

  1. app.py dosyasını aç
  2. return message yazan ifadeyi bulun
  3. Satır numarasının solundaki boş alanı tıklayarak bu satıra bir ayrılma noktası ekleyin. Kesme noktasının ayarlandığını belirten kırmızı bir gösterge görünür.
  4. Bu ilk kez çalıştırıldığında bir istem, kaynağın kapsayıcının içinde nerede olduğunu sorar. Bu değer, Dockerfile'daki dizinlerle ilgilidir.

Varsayılanı kabul etmek için Enter tuşuna basın

fccc866f32b5ed86.png

Uygulamanın derlenmesi ve dağıtılması birkaç dakika sürer.

  1. Tarayıcınızı yeniden yükleyin. Hata ayıklayıcının işlemi kesme noktasında durdurduğunu ve GKE'de uzaktan çalışan uygulamanın değişkenlerini ve durumunu incelemenize olanak tanıdığını unutmayın
  2. DEĞİŞKENLER bölümünü tıklayın.
  3. Yerel'i tıkladığınızda "message" değişkenini görürsünüz.
  4. "Mesaj" değişken adını çift tıklayın pop-up'ta değeri "Greetings from Python" gibi farklı bir değerle değiştirin.
  5. Hata ayıklama kontrol panelinde Devam düğmesini 607c33934f8d6b39.png tıklayın.
  6. Az önce girdiğiniz güncellenmiş değeri gösteren yanıtı tarayıcınızda inceleyin.
  7. "Hata ayıklama"yı durdurma kesme noktasını 647213126d7a4c7b.png tıklayın.

5. Basit Bir CRUD Dinlenme Hizmeti Geliştirme

Bu noktada uygulamanız, container mimarisine alınmış geliştirme için tamamen yapılandırıldı ve Cloud Code ile temel geliştirme iş akışını öğrendiniz. Aşağıdaki bölümlerde, Google Cloud'da yönetilen bir veritabanına bağlanan dinlenme hizmeti uç noktaları ekleyerek öğrendiklerinizi uygulayacaksınız.

Geri kalan hizmeti kodlayın

Aşağıdaki kod, uygulamayı destekleyen veritabanı olarak Spanner'ı kullanan basit bir dinlenme hizmeti oluşturur. Aşağıdaki kodu uygulamanıza kopyalayarak uygulamayı oluşturun.

  1. app.py öğesini aşağıdaki içeriklerle değiştirerek ana uygulamayı oluşturun
import os
from flask import Flask, request, jsonify
from google.cloud import spanner


app = Flask(__name__)


instance_id = "music-catalog"

database_id = "musicians"

spanner_client = spanner.Client()
instance = spanner_client.instance(instance_id)
database = instance.database(database_id)


@app.route("/")
def hello_world():
    return "<p>Hello, World!</p>"

@app.route('/singer', methods=['POST'])
def create():
    try:
        request_json = request.get_json()
        singer_id = request_json['singer_id']
        first_name = request_json['first_name']
        last_name = request_json['last_name']
        def insert_singers(transaction):
            row_ct = transaction.execute_update(
                f"INSERT Singers (SingerId, FirstName, LastName) VALUES" \
                f"({singer_id}, '{first_name}', '{last_name}')"
            )
            print("{} record(s) inserted.".format(row_ct))

        database.run_in_transaction(insert_singers)

        return {"Success": True}, 200
    except Exception as e:
        return e



@app.route('/singer', methods=['GET'])
def get_singer():

    try:
        singer_id = request.args.get('singer_id')
        def get_singer():
            first_name = ''
            last_name = ''
            with database.snapshot() as snapshot:
                results = snapshot.execute_sql(
                    f"SELECT SingerId, FirstName, LastName FROM Singers " \
                    f"where SingerId = {singer_id}",
                    )
                for row in results:
                    first_name = row[1]
                    last_name = row[2]
                return (first_name,last_name )
        first_name, last_name = get_singer()  
        return {"first_name": first_name, "last_name": last_name }, 200
    except Exception as e:
        return e


@app.route('/singer', methods=['PUT'])
def update_singer_first_name():
    try:
        singer_id = request.args.get('singer_id')
        request_json = request.get_json()
        first_name = request_json['first_name']
        
        def update_singer(transaction):
            row_ct = transaction.execute_update(
                f"UPDATE Singers SET FirstName = '{first_name}' WHERE SingerId = {singer_id}"
            )

            print("{} record(s) updated.".format(row_ct))

        database.run_in_transaction(update_singer)
        return {"Success": True}, 200
    except Exception as e:
        return e


@app.route('/singer', methods=['DELETE'])
def delete_singer():
    try:
        singer_id = request.args.get('singer')
    
        def delete_singer(transaction):
            row_ct = transaction.execute_update(
                f"DELETE FROM Singers WHERE SingerId = {singer_id}"
            )
            print("{} record(s) deleted.".format(row_ct))

        database.run_in_transaction(delete_singer)
        return {"Success": True}, 200
    except Exception as e:
        return e

port = int(os.environ.get('PORT', 8080))
if __name__ == '__main__':
    app.run(threaded=True, host='0.0.0.0', port=port)

Veritabanı Yapılandırmaları Ekleyin

Spanner'a güvenli bir şekilde bağlanmak için uygulamayı İş Yükü Kimlikleri kullanacak şekilde ayarlayın. Bu, uygulamanızın kendi hizmet hesabı gibi davranmasını ve veritabanına erişirken ayrı izinlere sahip olmasını sağlar.

  1. deployment.yaml adlı cihazı güncelleyin. Dosyanın sonuna aşağıdaki kodu ekleyin (aşağıdaki örnekte sekme girintilerini koruduğunuzdan emin olun)
      serviceAccountName: python-ksa
      nodeSelector:
        iam.gke.io/gke-metadata-server-enabled: "true" 

Değişikliklerden sonra spesifikasyon bölümü aşağıdaki gibi görünecektir

   spec:
     containers:
     - name: python-app
       image: python-app
     serviceAccountName: python-ksa
     nodeSelector:
       iam.gke.io/gke-metadata-server-enabled: "true"

Uygulamayı Dağıtma ve Doğrulama

  1. Cloud Shell Düzenleyici'nin alt kısmındaki bölmede Cloud Code simgesini ve ardından ekranın üst kısmındaki Debug on Kubernetes öğesini seçin.
  2. Derleme ve testler tamamlandığında Çıkış sekmesinde Resource deployment/python-app status completed successfully görüntülenir ve bir URL listelenir: "python-app hizmetinden yönlendirilen URL: http://localhost:8080"
  3. Birkaç giriş ekleyin.

Cloudshell Terminal'den aşağıdaki komutu çalıştırın

curl -X POST http://localhost:8080/singer -H 'Content-Type: application/json' -d '{"first_name":"Cat","last_name":"Meow", "singer_id": 6}'
  1. Terminalde aşağıdaki komutu çalıştırarak GET operatörünü test edin.
curl -X GET http://localhost:8080/singer?singer_id=6
  1. Test Silme: Şimdi aşağıdaki komutu çalıştırarak bir girişi silmeyi deneyin. Gerekirse item-id değerini değiştirin.
curl -X DELETE http://localhost:8080/singer?singer_id=6
    This throws an error message
500 Internal Server Error

Sorunu belirleme ve düzeltme

  1. Hata ayıklama moduna geçip sorunu bulun. Aşağıda bazı ipuçları verilmiştir:
  • DELETE ile ilgili bir sorun olduğunun farkındayız çünkü bu komut istenen sonucu döndürmüyor. Bu nedenle, ayrılma noktasını delete_singer yöntemindeki app.py içinde ayarlarsınız.
  • Yürütmeyi adım adım çalıştırın ve sol penceredeki yerel değişkenlerin değerlerini gözlemlemek için her adımdaki değişkenleri izleyin.
  • singer_id ve request.args gibi belirli değerleri gözlemlemek için bu değişkenleri İzleme penceresine ekleyin.
  1. singer_id öğesine atanan değerin None olduğuna dikkat edin. Sorunu düzeltmek için kodu değiştirin.

Düzeltilmiş kod snippet'i şöyle görünür.

@app.route('/delete-singer', methods=['DELETE', 'GET'])
def delete_singer():
    try:
        singer_id = request.args.get('singer_id')
  1. Uygulama yeniden başlatıldıktan sonra, silmeyi deneyerek tekrar test edin.
  2. Hata ayıklama araç çubuğundaki kırmızı kare simgesini tıklayarak hata ayıklama oturumunu durdurun 647213126d7a4c7b.png

6. Temizleme

Tebrikler! Bu laboratuvarda, sıfırdan yeni bir Python uygulaması oluşturdunuz ve bu uygulamayı container'larla etkili bir şekilde çalışacak şekilde yapılandırdınız. Ardından geleneksel uygulama yığınlarında bulunan geliştirici akışını izleyerek uygulamanızı uzak bir GKE kümesine dağıttınız ve hatalarını ayıkladınız.

Laboratuvarı tamamladıktan sonra yer açmak için:

  1. Laboratuvarda kullanılan dosyaları silme
cd ~ && rm -rf ~/music-service
  1. İlgili tüm altyapı ve kaynakları kaldırmak için projeyi silin