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 işlevler gösterilmektedir. Tipik container geliştirme sürecinde kullanıcının container'larla ve container derleme işlemiyle ilgili ayrıntıları anlaması gerekir. Ayrıca geliştiriciler, uygulamalarını uzak ortamlarda test edip hata ayıklama yapmak için genellikle akışlarını kesip IDE'lerinden çıkmak zorunda kalırlar. Bu eğitimde bahsedilen araçlar ve teknolojiler sayesinde geliştiriciler, IDE'lerinden ayrılmadan kapsayıcılı uygulamalarla etkili bir şekilde çalışabilir.

Öğrenecekleriniz

Bu laboratuvarda, GCP'de kapsayıcılarla geliştirme yöntemlerini öğreneceksiniz. Bu yöntemler arasında şunlar yer alır:

  • Yeni bir Python başlangıç uygulaması oluşturma
  • Geliştirme sürecini inceleme
  • Basit bir CRUD REST hizmeti geliştirme
  • GKE'ye dağıtma
  • Hata durumunu ayıklama
  • Kesme noktası / günlükleri kullanma
  • Değişiklikleri GKE'ye hızlı dağıtma

58a4cdd3ed7a123a.png

2. Kurulum ve Gereksinimler

Yönlendirmesiz ortam kurulumu

  1. Google Cloud Console'da oturum açın ve 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. Dilediğiniz zaman bunu güncelleyebilirsiniz.
  • Proje kimliği, tüm Google Cloud projelerinde benzersizdir ve sabittir (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dizeyi otomatik olarak oluşturur. Genellikle bu dizenin ne olduğuyla ilgilenmezsiniz. Çoğu codelab'de proje kimliğine (genellikle PROJECT_ID olarak tanımlanır) başvurmanız gerekir. Oluşturulan kimliği beğenmezseniz başka bir rastgele kimlik oluşturabilirsiniz. Dilerseniz kendi adınızı deneyerek kullanılabilir olup olmadığını kontrol edebilirsiniz. Bu adımdan sonra değiştirilemez ve proje süresince geçerli kalır.
  • Bazı API'lerin kullandığı üçüncü bir değer olan Proje Numarası da vardır. Bu üç değer hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i tamamlamak neredeyse hiç maliyetli değildir. Bu eğitimin ötesinde faturalandırma ücreti alınmaması için kaynakları kapatmak üzere oluşturduğunuz kaynakları veya projenin tamamını silebilirsiniz. Google Cloud'un yeni kullanıcıları 300 ABD doları değerinde ücretsiz deneme programından yararlanabilir.

Cloud Shell Düzenleyici'yi başlatma

Bu laboratuvar, Google Cloud Shell Düzenleyici ile 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. Open Editor (Düzenleyiciyi Aç) düğmesini tıklayın.

9e504cb98a6a8005.png

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

Ortam Kurulumu

Cloud Shell'de projenizin proje 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ğlama

Bu laboratuvarda, GKE'ye kod dağıtacak ve 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ı indirip 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 bir GKE kümesi ve Spanner veritabanı oluşturmak 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 durumuna gelmesini bekleyin.

305e1a3d63ac7ff6.png

İş istasyonu yapılandırması oluşturma

  1. Cloud Shell oturumunuzun bağlantısı kesildiyse "Yeniden bağlan"ı tıklayın ve 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 bir ö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. İş istasyonları bölümündeki sonuçları doğrulayın.

İş istasyonunu başlatma

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

682f8a307032cba3.png

  1. Adres çubuğundaki simgeyi tıklayarak üçüncü 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 başlatıldıktan sonra Code OSS IDE'nin açıldığını görürsünüz. İş istasyonu IDE'sindeki Başlarken sayfasında "Bitti olarak işaretle"yi tıklayın.

94874fba9b74cc22.png

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

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şturma ve bunu çalışma alanı olarak açma
mkdir music-service && cd music-service

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

Bu mesajı görürseniz iş istasyonuna kopyalayıp yapıştırabilmek için İzin ver düğmesini tıklayın.

58149777e5cc350a.png

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

789e8389170bd900.png

Flask
gunicorn
google-cloud-spanner
ptvsd==4.3.2
  1. app.py adlı 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 adlı bir dosya oluşturun ve aşağıdakileri 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 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 Dosyaları Oluşturma

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

  1. Aşağıdaki komutla Skaffold'u 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:

  • Bağlantı noktası için 8080
  • Yapılandırmayı kaydetmek için y

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

  • Varsayılan uygulama adını değiştirme
  • skaffold.yaml uygulamasını aç
  • Şu anda dockerfile-image olarak ayarlanmış resim adını seçin.
  • Sağ tıklayın ve Tüm Oluşumları Değiştir'i seçin.
  • Yeni adı python-app olarak yazın.
  • Derleme bölümünü aşağıdaki şekilde düzenleyin:
  • docker.buildArgs öğesini FLASK_DEBUG=1 kartına ekle
  • IDE'den çalışan kapsayıcıya *.py dosyalarındaki değişiklikleri yüklemek için ayarları senkronize edin.

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

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ış resim adını seçin.
  • Sağ tıklayın ve Tüm Oluşumları Değiştir'i seçin.
  • Yeni adı python-app olarak yazın.

4. Geliştirme sürecini inceleme

İş mantığı eklendiğinden artık uygulamanızı dağıtabilir ve test edebilirsiniz. Aşağıdaki bölümde Cloud Code eklentisinin kullanımı gösterilecektir. Bu eklenti, diğer özelliklerinin yanı sıra geliştirme sürecinizi kolaylaştırmak için skaffold ile entegre olur. Aşağıdaki adımlarda GKE'ye dağıtım yaptığınızda Cloud Code ve Skaffold, kapsayıcı görüntünüzü otomatik olarak oluşturur, Container Registry'ye gönderir ve ardından your uygulamasını GKE'ye dağıtır. Bu işlem, geliştirici akışından ayrıntıları soyutlayarak arka planda gerçekleşir.

Google Cloud'da oturum açma

  1. Cloud Code simgesini tıklayın ve "Google Cloud'da oturum aç"ı seçin:

1769afd39be372ff.png

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

923bb1c8f63160f9.png

  1. Terminal'deki çıktıyı 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 iş istasyonu sekmesine dönün.

6719421277b92eac.png

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

e9847cfe3fa8a2ce.png

Kubernetes kümesi ekleme

  1. Küme ekleme

62a3b97bdbb427e5.png

  1. Google Kubernetes Engine'i seçin:

9577de423568bbaa.png

  1. Projeyi seçin.

c5202fcbeebcd41c.png

  1. İlk kurulumda oluşturulan "python-cluster"ı seçin.

719c2fc0a7f9e84f.png

  1. Küme artık Cloud Code'un altındaki Kubernetes kümeleri listesinde gösteriliyor. Buradan kümeye gidip kümeyi keşfedin.

7e5f50662d4eea3c.png

gcloud CLI'yı kullanarak mevcut proje kimliğini ayarlama

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

fcff2d10007ec5bc.png

  1. Terminalden proje kimliğini ayarlamak için 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 YERİNE KOYUN.
gcloud config set project qwiklabs-gcp-project-id

Kubernetes'e dağıtma

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

d99a88992e15fea9.png

  1. En üstte görünen panelde Kubernetes'te çalıştır'ı seçin. İstenirse mevcut Kubernetes bağlamını kullanmak için Evet'i seçin.

bfd65e9df6d4a6cb.png

Bu komut, kaynak kodun derlenmesini 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 belirlenen 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ışırken 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, mevcut Kubernetes bağlamını kullanmak isteyip istemediğinizi soran bir istem görünür. Kabul etmek ve mevcut bağlamı kullanmak için "Evet"i seçin.
  2. Ardından, hangi Container Registry'nin kullanılacağını soran bir istem gösterilir. Sağlanan varsayılan değeri kabul etmek için Enter tuşuna basın.
  3. İlerleme durumunu ve bildirimleri görüntülemek için alt bölmede "Çıkış" sekmesini seçin. Açılır listeyi kullanarak "Kubernetes: Run/Debug" seçeneğini belirleyin.

9c87ccbf5d06f50a.png

  1. Ek ayrıntıları ve kapsayıcılardan canlı olarak yayınlanan günlükleri görüntülemek için sağdaki kanal açılır listesinde "Kubernetes: Run/Debug - Detailed"ı seçin.

804abc8833ffd571.png

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

  1. Cloud Code terminalinde, çıkıştaki ilk URL'nin (http://localhost:8080) üzerine gelin ve ardından açılan araç ipucunda Web Önizlemesini Aç'ı seçin.
  2. Yeni bir tarayıcı sekmesi açılır ve mesaj görüntülenir. Hello, World!

Hot Reload

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

Output penceresinde, Kubernetes: Run/Debug görünümünde, izleyicinin güncellenen dosyaları Kubernetes'teki kapsayıcıyla senkronize ettiğini hemen fark edeceksiniz.

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 dosya değişikliklerini tanıdığını, ardından uygulamayı oluşturup yeniden dağıttığını fark edersiniz.
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üncellenmiş 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ı durdurun 647213126d7a4c7b.png. İstenirse her çalıştırmadan sonra temizleme yapmayı seçebilirsiniz.
  2. 70d6bd947d04d1e6.png
  3. Alt menüde Cloud Code simgesini tıklayın ve uygulamayı debug modunda çalıştırmak için Debug on Kubernetes simgesini seçin.
  • Output penceresinin Kubernetes Run/Debug - Detailed görünümünde, Skaffold'un bu uygulamayı hata ayıklama modunda dağıtacağını unutmayın.
  1. İşlem tamamlandığında. Bir hata ayıklayıcının eklendiğini ve Çıkış sekmesinde Attached debugger to container "python-app-8476f4bbc-h6dsl" successfully. ifadesinin yer aldığını, ayrıca http://localhost:8080 URL'sinin listelendiğini görürsünüz.
Port forwarding pod/python-app-8bd64cf8b-cskfl in namespace default, remote port 5678 -> http://127.0.0.1:5678
  1. Alt durum çubuğu, hata ayıklama modunda olduğunu belirtmek için rengini maviden turuncuya değiştirir.
  2. Kubernetes Run/Debug görünümünde, hata ayıklanabilir bir kapsayıcının başlatıldığını fark 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çın.
  2. return message ifadesini bulun.
  3. Satır numarasının solundaki boş alanı tıklayarak bu satıra kesme noktası ekleyin. Kesme noktasının ayarlandığını belirtmek için kırmızı bir gösterge gösterilir.
  4. Bu işlem ilk kez çalıştırıldığında, istemde kaynağın kapsayıcı içindeki konumu sorulur. Bu değer, Dockerfile'daki dizinlerle ilgilidir.

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

fccc866f32b5ed86.png

Uygulamanın oluşturulup 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. Yereller'i tıklayın. Burada "message" değişkenini bulabilirsiniz.
  4. "message" değişken adını çift tıklayın ve 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 tıklayın. 607c33934f8d6b39.png
  6. Tarayıcınızda, az önce girdiğiniz güncellenmiş değeri gösteren yanıtı inceleyin.
  7. Durdur düğmesine 647213126d7a4c7b.png basarak "Hata ayıklama" modunu durdurun ve kesme noktasına tekrar tıklayarak kesme noktasını kaldırın.

5. Basit bir CRUD Rest Hizmeti Geliştirme

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

Geri kalan hizmeti kodlama

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

  1. app.py yerine aşağıdaki içerikleri kullanarak 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ı Ekleme

Spanner'a güvenli bir şekilde bağlanmak için uygulamayı Workload Identity'leri kullanacak şekilde ayarlayın. Bu sayede uygulamanız kendi hizmet hesabı gibi davranabilir ve veritabanına erişirken ayrı izinlere sahip olabilir.

  1. deployment.yaml adlı cihazı güncelleyin. Aşağıdaki kodu dosyanın sonuna ekleyin (aşağıdaki örnekteki 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ünmelidir.

   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, ardından ekranın üst kısmında Debug on Kubernetes simgesini seçin.
  2. Derleme ve testler tamamlandığında Çıkış sekmesinde Resource deployment/python-app status completed successfully ifadesi gösterilir ve "Forwarded URL from service python-app: http://localhost:8080" URL'si listelenir.
  3. Birkaç giriş ekleyin.

Cloud Shell terminalinde 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'i 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 modunu kullanarak sorunu bulun. Aşağıda bazı ipuçları verilmiştir:
  • DELETE yönteminin istenen sonucu döndürmediği için bir sorun olduğunu biliyoruz. Bu nedenle, app.py yönteminde delete_singer içinde kesme noktası ayarlarsınız.
  • Adım adım yürütme işlemini çalıştırın ve sol penceredeki yerel değişkenlerin değerlerini gözlemlemek için her adımda 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ğunu unutmayın. 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ı kareyi 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ı kapsayıcı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ğıtıp hatalarını ayıklarsınız.

Laboratuvarı tamamladıktan sonra temizlik yapmak için:

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