NodeJS ile InnerLoop Geliştirme

1. Genel Bakış

Bu laboratuvar, container mimarisine alınmış bir ortamda NodeJS uygulamaları geliştirmekten sorumlu yazılım mühendislerinin geliştirme iş akışını kolaylaştırmak için tasarlanmış özellikleri ve olanakları gösterir. 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:

  • Başlangıç Nodejs uygulaması oluşturma
  • Container geliştirme için Nodejs uygulamasını yapılandırma
  • Basit bir CRUD Dinlenme Hizmeti'ni kodlama
  • 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
  • İsteğe bağlı: Arka uç kalıcılığı için CloudSQL entegrasyonu

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 ve bunu istediğiniz zaman güncelleyebilirsiniz.
  • Proje Kimliği, tüm Google Cloud projelerinde benzersiz olmalıdır 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ğine referans vermeniz gerekir (ve bu kimlik genellikle PROJECT_ID olarak tanımlanır). Beğenmezseniz başka bir rastgele kod oluşturun ya da kendi proje kimliğinizi deneyip mevcut olup olmadığına bakın. Sıcaklık "soğudu" takip etmeniz gerekir.
  • 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. Ardından, 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ırmayla karşılaşmamak için kaynakları kapatmak istiyorsanız tüm "temizleme" işlemlerini uygulayın buradaki talimatları uygulayın. 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.

gcloud'u kurun

Cloud Shell'de proje kimliğinizi ve uygulamanızı dağıtmak istediğiniz bölgeyi ayarlayın. Bunları PROJECT_ID ve REGION değişkenleri olarak kaydedin.

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

GKE kümesini ve veritabanını kurma

  1. Kurulum komut dosyasını indirin ve yürütülebilir hale getirin.
wget https://raw.githubusercontent.com/GoogleCloudPlatform/container-developer-workshop/main/labs/nodejs/setup.sh
chmod +x setup.sh

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. Aşağıdaki kurulum komut dosyası, bu altyapıyı sizin için hazırlar.

  1. setup.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 CloudSQL veritabanını desteklemek için kurulum komut dosyasını çalıştırın
./setup.sh
  1. Cloud Shell'de mynodejsapp adında yeni bir dizin oluşturun
mkdir mynodejsapp
  1. Bu dizine geçin ve çalışma alanı olarak açın. Bu işlem, yeni oluşturulan klasörde bir çalışma alanı yapılandırması oluşturarak düzenleyiciyi yeniden yükler.
cd mynodejsapp && cloudshell workspace .
  1. NVM kullanarak Düğüm ve NPM'yi yükleyin.
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
        
        # This loads nvm bash_completion
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  

nvm install stable

nvm alias default stable

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

  1. Uygulamayı başlatma

Aşağıdaki komutu çalıştırarak package.json dosyası oluşturma

npm init
    Choose the entry point: (index.js) src/index.js and default values for the rest of the parameters. This will create the file with following contents
{
  "name": "mynodejsapp",
  "version": "1.0.0",
  "description": "",
  "main": "src/index.js",,
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}
  1. Giriş Noktası Ekleme

Bu dosyayı, "start": "node src/index.js", komut dosyasına başlat komutunu içerecek şekilde düzenleyin. Değişiklikten sonra, komut dosyaları aşağıdaki kod snippet'i gibi görünmelidir:

"scripts": {
    "start": "node src/index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  1. Ekspres Bağımlılığı Ekleyin

Ekleyeceğimiz kod express adresini de kullandığından bu bağımlılığı bu package.json dosyasına ekleyelim. Bu nedenle, tüm değişikliklerden sonra package.json dosyası aşağıda gösterildiği gibi olmalıdır.

​​{
  "name": "mynodejsapp",
  "version": "1.0.0",
  "description": "",
  "main": "src/index.js",
  "scripts": {
    "start": "node src/index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Your Name",
  "license": "ISC",
  "dependencies": {
    "express": "^4.16.4"
  }
}
  1. index.js dosyasını oluşturma

src adında bir kaynak dizin oluşturun

Aşağıdaki kodla src/index.js oluşturun

const express = require('express');
const app = express();
const PORT = 8080;

app.get('/', (req, res) => {
    var message="Greetings from Node";
    res.send({ message: message });
  });

app.listen(PORT, () => {
  console.log(`Server running at: http://localhost:${PORT}/`);

});

PORT değerinin 8080 değerine ayarlandığına dikkat edin

Manifest Oluşturma

Skaffold, container geliştirmeyi basitleştirmek için entegre araçlar sunar. Bu adımda temel kubernetes YAML dosyalarını otomatik olarak oluşturacak şekilde skaffold'u başlatacaksınız. İşlemi başlatmak için aşağıdaki komutu yürütün.

Terminalde aşağıdaki komutu yürütün

skaffold init --generate-manifests

İstendiğinde:

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

Çalışma alanı görünümüne şu iki dosya eklendi: skaffold.yaml ve deployment.yaml

Uygulama adını güncelleyin

Yapılandırmada yer alan varsayılan değerler şu anda uygulamanızın adıyla eşleşmemektedir. Dosyaları, varsayılan değerler yerine uygulama adınızı referans alacak şekilde güncelleyin.

  1. Skaffold yapılandırmasındaki girişleri değiştir
  • skaffold.yaml uygulamasını aç
  • Şu anda package-json-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ı mynodejsapp olarak yazın
  1. Kubernetes yapılandırmasındaki girişleri değiştir
  • deployment.yaml dosyasını aç
  • Şu anda package-json-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ı mynodejsapp olarak yazın

skaffold.yaml dosyasındaki build bölümünün, uygulamayı container mimarisine almak için buildpacks kullandığına dikkat edin. Bu kodda Dockerfile yoktur ve geliştiricinin bu uygulamayı container mimarisine almak için Docker hakkında bilgi sahibi olması gerekmez.

Ayrıca, çalışır durumda senkronizasyon, bu katman yapılandırması tarafından düzenleyici ile çalışan kapsayıcı arasında otomatik olarak etkinleştirilir. Çalışır durumda senkronizasyonu etkinleştirmek için ek yapılandırma gerekmez.

4. Geliştirme sürecinde rehberlik etme

Bu bölümde, temel işlemleri öğrenmek ve başlangıç uygulamanızın yapılandırmasını ve kurulumunu doğrulamak için Cloud Code eklentisini kullanma konusunda birkaç adım öğreneceksiniz.

Cloud Code, 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 uygulamanızı GKE'ye dağıtır. Bu, perde arkasında olup ayrıntıları geliştirici akışından uzaklaştırarak gerçekleşir. Cloud Code, container tabanlı geliştirme için geleneksel hata ayıklama ve hotspot özellikleri sağlayarak geliştirme sürecinizi de iyileştirir.

Kubernetes'e dağıtma

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

fdc797a769040839.png

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

cfce0d11ef307087.png

  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.

817ee33b5b412ff8.png

  1. 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

eb4469aed97a25f6.png

  1. İlerleme durumunu ve bildirimleri görüntülemek için alt bölmede Çıkış sekmesini seçin

f95b620569ba96c5.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

94acdcdda6d2108.png

  1. "Kubernetes: Çalıştır/Hata Ayıklama"yı seçerek basitleştirilmiş görünüme dönün açılır menüden
  2. Derleme ve testler tamamlandığında Çıkış sekmesinde Resource deployment/mynodejsapp status completed successfully görüntülenir ve bir URL listelenir: "Hizmet demo uygulamasından yönlendirilen URL: http://localhost:8080"
  3. Cloud Code terminalinde çıkıştaki URL'nin (http://localhost:8080) üzerine gelin. Ardından, görünen araç ucunda Web Önizlemesini Aç'ı seçin.

Yanıt şöyle olacaktır:

{"message":"Greetings from Node"}

Sıcak Yeniden Yükle

  1. src/index.js adresine gidiş rotasını izle. 'Hello from Node' için karşılama mesajının kodunu düzenleyin

İ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
File sync started for 1 files for gcr.io/myproject/mynodejsapp:latest@sha256:f554756b3b4d6c301c4b26ef96102227cfa2833270db56241248ae42baa1971a
File sync succeeded for 1 files for gcr.io/myproject/mynodejsapp:latest@sha256:f554756b3b4d6c301c4b26ef96102227cfa2833270db56241248ae42baa1971a
Update succeeded
  1. Kubernetes: Run/Debug - Detailed görünümüne geçerseniz dosya değişikliklerini algıladığını ve düğümü yeniden başlattığını fark edersiniz
files modified: [src/index.js]
Copying files:map[src/index.js:[/workspace/src/index.js]]togcr.io/myproject/mynodejsapp:latest@sha256:f554756b3b4d6c301c4b26ef96102227cfa2833270db56241248ae42baa1971a
Syncing 1 files for gcr.io/myproject/mynodejsapp:latest@sha256:f554756b3b4d6c301c4b26ef96102227cfa2833270db56241248ae42baa1971a
Watching for changes...
[mynodejsapp]
[mynodejsapp]> mynodejsapp@1.0.0 start /workspace
[mynodejsapp]> node src/index.js
[mynodejsapp]
[mynodejsapp]Server running at: http://localhost:8080/
  1. Güncellenen sonuçları görmek için tarayıcınızı yenileyin.

Hata ayıklama

  1. Hata Ayıklama görünümüne gidin ve mevcut iş parçacığını (647213126d7a4c7b.png) durdurun.
  2. 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.
  • Uygulamanın derlenmesi ve dağıtılması birkaç dakika sürer. Bu sefer eklenmiş bir hata ayıklayıcı görürsünüz.
Port forwarding pod/mynodejsapp-6bbcf847cd-vqr6v in namespace default, remote port 9229 -> http://127.0.0.1:9229
[mynodejsapp]Debugger attached.
  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 mynodejsapp-service: http://localhost:8080
Debuggable container started pod/mynodejsapp-deployment-6bc7598798-xl9kj:mynodejsapp (default)
Update succeeded
***********************************

Kesme noktalarından yararlanma

  1. src/index.js uygulamasını açın
  2. var message="Greetings from Node"; 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. 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
  5. "message" değişkenini bulana kadar değişkenler bölümünü tıklayın.
  6. 7cfdee4fd6ef5c3a.png Üzerine git'e basarak satırı yürütün
  7. "message" değişkeninin mevcut değerinin "Greetings from Node" olarak değiştiğini gözlemleyin
  8. "target" değişken adını çift tıklayın pop-up'ta değeri "Hello from Node" gibi farklı bir değerle değiştirin.
  9. Hata ayıklama kontrol panelinde Devam düğmesini tıklayın
  10. Az önce girdiğiniz güncellenmiş değeri gösteren yanıtı tarayıcınızda inceleyin.
  11. "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.

Bağımlılıkları Yapılandırma

Uygulama kodu, geri kalan hizmet verilerini saklamak için bir veritabanı kullanır. package.json dosyasına aşağıdakini ekleyerek bağımlılıkların mevcut olduğundan emin olun:

  1. Postgres CRUD uygulaması oluşturmak için package.json dosyasına iki bağımlılık daha pg ve sequelize ekleyin. Değişiklikleri yüklediğinizde bağımlılıklar bölümü aşağıdaki gibi görünür.
    "dependencies": {
    "express": "^4.16.4",
    "pg": "^8.7.3",
    "sequelize": "^6.17.0"
  }

REST hizmetini kodlama

  1. CRUD uygulama kodunu bu uygulamaya ekleyin
wget -O app.zip https://github.com/GoogleCloudPlatform/container-developer-workshop/raw/main/labs/nodejs/app.zip

unzip app.zip

Bu kodda

  • item varlık modeline sahip models klasörü
  • CRUD işlemlerini gerçekleştiren kodu içeren controllers klasörü
  • Belirli URL kalıplarını farklı çağrılara yönlendiren routes klasörü
  • Veritabanı bağlantı ayrıntılarını içeren config klasörü
  1. db.config.js dosyasındaki veritabanı yapılandırmasının, veritabanına bağlanmak için sağlanması gereken ortam değişkenlerini ifade ettiğini unutmayın. Ayrıca gelen isteği URL kodlaması için ayrıştırmanız gerekir.
  2. Ana JavaScript dosyanızdaki CRUD koduna, app.listen(PORT, () => { ile başlayan son bölümden hemen önce bağlanabilmek için aşağıdaki kod snippet'ini src/index.js bölümüne ekleyin.
const bodyParser = require('body-parser')
app.use(bodyParser.json())
app.use(
 bodyParser.urlencoded({
   extended: true,
 })
)
const db = require("../app/models");
db.sequelize.sync();
require("../app/routes/item.routes")(app);
  1. Veritabanı bağlantı bilgilerini sağlamak için ortam değişkenlerini eklemek üzere deployment.yaml dosyasındaki dağıtımı düzenleyin.

Dosyanın sonundaki spesifikasyon girişini aşağıdaki tanımla eşleşecek şekilde güncelleyin

    spec:
      containers:
      - name: mynodejsapp
        image: mynodejsapp
        env:
        - name: DB_HOST
          value: ${DB_INSTANCE_IP}        
        - name: DB_PORT
          value: "5432"  
        - name: DB_USER
          valueFrom:
            secretKeyRef:
              name: gke-cloud-sql-secrets
              key: username
        - name: DB_PASS
          valueFrom:
            secretKeyRef:
              name: gke-cloud-sql-secrets
              key: password
        - name: DB_NAME
          valueFrom:
            secretKeyRef:
              name: gke-cloud-sql-secrets
              key: database
  1. DB_HOST değerini Veritabanınızın adresiyle değiştirin
export DB_INSTANCE_IP=$(gcloud sql instances describe mytest-instance \
    --format=json | jq \
    --raw-output ".ipAddresses[].ipAddress")

envsubst < deployment.yaml > deployment.new && mv deployment.new deployment.yaml

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/mynodejsapp status completed successfully görüntülenir ve bir URL listelenir: "mynodejsapp hizmetinden yönlendirilen URL: http://localhost:8080"
  3. Birkaç öğe ekleyin.

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

URL=localhost:8080
curl -X POST $URL/items -d '{"itemName":"Body Spray", "itemPrice":3.2}' -H "Content-Type: application/json"
curl -X POST $URL/items -d '{"itemName":"Nail Cutter", "itemPrice":2.5}' -H "Content-Type: application/json"
  1. Tarayıcıda $URL/items çalıştırarak GET URL'sini test edin. Curl işlemini komut satırından da çalıştırabilirsiniz
curl -X GET $URL/items
  1. Silme Testi: Şimdi, çalıştırarak bir öğeyi silmeyi deneyin. Gerekirse item-id değerini değiştirin.
curl -X DELETE $URL/items/1
    This throws an error message
{"message":"Could not delete Item with id=[object Object]"}

Sorunu belirleme ve düzeltme

  1. Uygulamayı Hata Ayıklama modunda yeniden başlatıp 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. Dolayısıyla, ayrılma noktasını itemcontroller.js->exports.delete yönteminde 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.
  • request.params gibi belirli değerleri gözlemlemek için bu değişkeni İzleme penceresine ekleyin.
  1. id öğesine atanan değerin undefined olduğuna dikkat edin. Sorunu düzeltmek için kodu değiştirin.

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

// Delete a Item with the specified id in the request
exports.delete = (req, res) => {
    const id = req.params.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 Nodejs uygulaması oluşturdunuz ve bu uygulamayı container'larla etkin dağıtım modunda ç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 mynodejsapp && rm -f setup.sh
  1. İlgili tüm altyapı ve kaynakları kaldırmak için projeyi silin