Memigrasikan konfigurasi ke Cloud Run

Anda harus menyelesaikan proses migrasi konfigurasi untuk setiap aplikasi Cloud Foundry yang Anda migrasikan to Cloud Run. Migrasi konfigurasi terdiri atas hal-hal berikut:

  • Mengonversi manifest.yaml Cloud Foundry ke service.yaml Cloud Run .
  • Memasang layanan pendukung pada aplikasi untuk deployment ke Cloud Run.
  • Men-deploy aplikasi Anda ke layanan Cloud Run.

Mengonversikan manifest.yaml ke service.yaml

Anda harus mengkonversi manifes Cloud Foundry dan/atau flag CLI cf menjadi YAML definisi layanan Cloud Run yang setara.

Cloud Run memerlukan setiap aplikasi untuk memiliki file YAML layanan yang terpisah. Untuk memigrasikan aplikasi dalam manifes Cloud Foundry ke file YAML layanan:

  1. Kumpulkan setiap properti yang tercantum dalam tabel berikut untuk aplikasi Anda. Properti yang tidak diubah pada tingkat aplikasi mungkin telah digantikan dengan konfigurasi platform Cloud Foundry global. Lihat dokumentasi yang disediakan oleh administrator platform Anda untuk mendapatkan nilai sebenarnya

    Properti Aplikasi Flag CLI v6 cf Deskripsi
    name Argumen NAME Nama unik aplikasi di Cloud Foundry.
    command -c Perintah yang akan dijalankan di /bin/sh atau /bin/bash
    disk_quota -k Jumlah disk yang akan ditetapkan untuk aplikasi.

    Satuan yang valid adalah: M, MB, G , r B

    Kemungkinan default: 1G

    docker.image --docker-image, -o Image yang berisi aplikasi yang akan dijalankan.
    health-check-http-endpoint T/A Endpoint yang digunakan untuk menentukan kondisi HTTP jika jenis health check-nya adalah HTTP.

    Default: /

    health-check-invocation-timeout T/A Waktu dalam detik antara port individual dengan health check berbasis HTTP.

    Default: 1

    health-check-type --health-check-type, -u Jenis health check yang akan dijalankan pada aplikasi. Nilai yang valid adalah: port, http, none, process.

    Default: port

    instances -i Jumlah instance aplikasi yang akan dijalankan Cloud Foundry.

    Default: 1

    memory -m Batas memori per instance untuk aplikasi.

    Satuan yang valid adalah: M, MB, G , atau GB

    Kemungkinan default: 1G

    timeout -t Jumlah detik yang diizinkan saat aplikasi dijalankan dengan health check pertama

    Kemungkinan default: 60

  2. Kumpulkan informasi berikut untuk project Google Cloud dan penyiapan Cloud Run Anda:

    Properti Deskripsi
    project_number Nomor project untuk Project Google Cloud yang ingin Anda deploy.
    region Wilayah tempat Anda ingin men-deploy aplikasi.
    vpc-access-connector Nama konektor VPC yang administrator platform Anda inginkan untuk aplikasi berjalan.
    vpc-access-egress Nama egress VPC yang administrator platform Anda inginkan untuk aplikasi berjalan.
    custom-audiences Audiens kustom yang dapat melakukan autentikasi ke aplikasi Anda.
    serviceAccountName Identitas yang akan digunakan aplikasi Anda di Google Cloud.
    image Image aplikasi yang Anda buat pada langkah sebelumnya.
  3. Isi template berikut ke dalam file service.yaml di root project Anda

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  # Set this to be the name of your app
  name: "APP_NAME"
  # Set this to be the project number of the project you're deploying to.
  namespace: "PROJECT_NUMBER"
  labels:
    # Set this to be the region you're deploying in.
    cloud.googleapis.com/location: REGION
    migrated-from: cloud-foundry
  annotations:
    run.googleapis.com/ingress: internal-and-cloud-load-balancing
spec:
  template:
    metadata:
      annotations:
        # Set to the greater of 1 or the `instances` attribute.
        autoscaling.knative.dev/minScale: '1'
        # Set to the greater of 1 or the `instances` attribute.
        autoscaling.knative.dev/maxScale: '1'
        run.googleapis.com/cpu-throttling: CPU_ALLOCATION
        run.googleapis.com/startup-cpu-boost: 'true'
        # Set to true if you rely on sticky sessions. These will be turned
        # on in Cloud Foundry if the server sends a JSESSIONID cookie back
        # on responses.
        run.googleapis.com/sessionAffinity: 'false'
        run.googleapis.com/execution-environment: gen2
        # Set the following values to match what your platform administrator recommends.
        run.googleapis.com/vpc-access-connector: ADMINISTRATOR_PROVIDED
        run.googleapis.com/vpc-access-egress: ADMINISTRATOR_PROVIDED
        run.googleapis.com/custom-audiences: ADMINISTRATOR_PROVIDED
    spec:
      # CF doesn't limit, but CR has a max of 1000.
      containerConcurrency: 1000
      # Default value for gorouter in PCF.
      timeoutSeconds: 900
      # Set the following value to match what your platform administrator recommends.
      serviceAccountName: ADMINISTRATOR_PROVIDED
      containers:
      - name: user-container
        # Set the following value to either:
        # - The image you built for your application in the last section of the guide.
        # - The docker.image attribute of your app's configuration if it's a Docker app.
        image: IMAGE
        # Set `command` based on the following rules:
        # - If your app has no `command` attribute: null.
        # - If your app has a docker.image attribute: ['/bin/sh', '-c']
        # - Otherwise: ['/bin/bash', '-c']
        command: null
        # Set `args` based on the following rules:
        # - If your app has no `command` attribute: null.
        # - If your app has a `command` attribute: ['value of command']
        args: null
        ports:
          # Set name based on the following rules:
          # - If your app is HTTP/2 or gRPC: "h2c"
          # - Else: "http1"
        - name: HTTP1_OR_H2C
          containerPort: 8080
        env:
          # For each key/value pair in your space's running environment variable groups,
          # which can be retried by running `cf running-environment-variable-group`,
          # add the following:
        - name: KEY
          value: VALUE
          # For each key/value pair in your manifest's `env` map, add the following:
        - name: KEY
          value: VALUE
          # Populate MEMORY_LIMIT with the amount of memory supplied to this instance
          # in MiB with 'M' as a suffix.
        - name: MEMORY_LIMIT
          value: '0M'
          # Set the following values in the JSON below:
          # - `application_name` and `name` to match metadata.name in this file.
          # - `application_uris` and `uris` to be the URI you want to assign the app on the
          #    load balancer.
          # - `limits.disk` to be the amount (in MiB) of disk assigned to your app.
          #   The amount will be in the `disk_quota` attribute of the CF manifest, or a
          #   default value for your cluster, typically 1GiB.
          # - `limits.mem` to be the amount (in MiB) of memory assigned to your app.
          #   The amount will be in your `memory` attribute of the CF manifest, or a
          #   default value for your cluster, typically 1GiB.
          # - `space_name` to be the value of metadata.space in this file.
        - name: VCAP_APPLICATION
          value: |-
                  {
                    "application_id": "00000000-0000-0000-0000-000000000000",
                    "application_name": "app-name",
                    "application_uris": [],
                    "limits": {
                      "disk": 1024,
                      "mem": 256
                    },
                    "name": "app-name",
                    "process_id": "00000000-0000-0000-0000-000000000000",
                    "process_type": "web",
                    "space_name": "none",
                    "uris": []
                  }
        resources:
          limits:
            # Set memory limit to be the sum of the memory and disk assigned to your app in CF.
            #
            # Disk amount will be in the `disk_quota` attribute of the CF manifest, or a
            # default value for your cluster, typically 1GiB.
            #
            # Memory will be in your `memory` attribute of the CF manifest, or a
            # default value for your cluster, typically 1GiB.
            memory: MEMORY_LIMIT
            # Set cpu according to the following calculation:
            #
            # 1. Take the amount of memory in your `memory` attribute of the CF
            #    manifest, or a default value for your cluster, typically 1GiB.
            # 2. Divide that by the total amount of memory on the underlying BOSH VM.
            # 3. Multiply that by the total number of CPUs on the BOSH VM.
            # 4. Find the nearest valid value based on the rules in:
            #    https://cloud.google.com/run/docs/configuring/cpu#setting
            cpu: CPU_LIMIT
        # If `health-check-type` is "process" or "none", delete the startupProbe section.
        startupProbe:
          # If `health-check-type` is "port" or blank, delete the httpGet section.
          httpGet:
            # Set to be the value of `health-check-http-endpoint` or / if blank.
            path: CHECK_PATH
            port: 8080
          # If `health-check-type` is "http", delete the tcpSocket section.
          tcpSocket:
            port: 8080
          # Set to the value of `health-check-invocation-timeout` or 1
          timeoutSeconds: 1
          # Set failure threshold to be the following calculation:
          #
          # 1. Take the `timeout` from the CF manifest, use 60 if unset.
          # 2. Divide by 2.
          # 3. Round up to the nearest integer.
          failureThreshold: 1
          successThreshold: 1
          periodSeconds: 2
        # If `health-check-type` is "process" or "none", delete the livenessProbe section.
        livenessProbe:
          # If `health-check-type` is "port" or blank, delete the httpGet section.
          httpGet:
            # Set to be the value of `health-check-http-endpoint` or / if blank.
            path: CHECK_PATH
            port: 8080
          # If `health-check-type` is "http", delete the tcpSocket section.
          tcpSocket:
            port: 8080
          # Set to the value of `health-check-invocation-timeout` or 1.
          timeoutSeconds: 1
          failureThreshold: 1
          successThreshold: 1
          periodSeconds: 30
  traffic:
  - percent: 100
    latestRevision: true

Memasang layanan pendukung

Anda harus membuat variabel lingkungan VCAP_SERVICES untuk memungkinkan injeksi dan penemuan layanan oleh aplikasi Cloud Foundry Anda, seperti Spring atau Steeltoe. Anda harus selalu melakukan hal ini untuk setiap aplikasi yang dimigrasikan. Baca dokumentasi Cloud Foundry VCAP_SERVICES untuk mengetahui informasi selengkapnya.

Jika aplikasi Anda sudah berjalan di Cloud Foundry dan Anda ingin terhubung ke layanan yang sama pada Cloud Run, gunakan variabel lingkungan yang ada. Jika tidak, Anda harus membuat VCAP_SERVICES baru.

Untuk mengkonfigurasi variabel lingkungan VCAP_SERVICES:

  1. Untuk VCAP_SERVICES yang sudah ada:

    1. Coba dapatkan variabel lingkungan VCAP_SERVICES dengan menjalankan cf env APP_NAME.
    2. Jika cara tersebut tidak berhasil:
      1. Hubungkan ke aplikasi Anda di Cloud Foundry: cf ssh APP_NAME
      2. Jalankan perintah env dan dapatkan output VCAP_SERVICES.
      3. Keluar dari sesi SSH dengan menjalankan exit.
    3. Simpan nilai VCAP_SERVICES ke dalam file baru bernama vcap.json.
  2. Jika Anda ingin menambahkan layanan atau terhubung ke layanan yang berbeda di Cloud Foundry, buat VCAP_SERVICES baru:

    1. Di editor teks, buat peta JSON kosong {}
    2. Untuk setiap layanan yang ingin Anda tambahkan, lakukan hal-hal berikut:
    3. Lihat dokumentasi untuk library yang digunakan aplikasi Anda untuk mengurai VCAP_SERVICES pada jenis yang ingin Anda tambahkan agar dapat memahami cara aplikasi menemukan pengikatnya.
    4. Tambahkan kunci ke peta dengan nama penyedia layanan jika belum ada, biasanya seperti mysql, postgresql, atau elasticsearch. Tetapkan nilai menjadi array kosong:
    5. Tambahkan objek ke dalam array dengan properti seperti berikut:

      1. Metadata yang biasanya tidak digunakan untuk menemukan/mengikat layanan:

        • binding_name, sebuah string yang mewakili resource yang memberikan izin aplikasi pada layanan tersebut. Ini dapat berupa nama pengguna untuk database, aturan firewall, nama akun layanan, atau lainnya.
        • instance_name, sebuah string yang mewakili nama layanan pendukung. Ini dapat berupa nama database Anda, nilai acak, atau nilai sentinel untuk suatu layanan global.
        • name, binding_name jika ada; jika tidak, instance_name. Nilai ini biasanya tidak penting.
        • label, Nilai dari kunci yang ada dalam peta VCAP_SERVICES tempat binding ini disusun.
        • plan, nama dari paket layanan. Contohnya mencakup: "user-provided", "high-availability".
      2. Nilai yang sering digunakan untuk menemukan/mengikat layanan:

        • tags Daftar tag untuk membantu library menemukan layanan yang kompatibel. Sering kali menyertakan nama umum untuk layanan, seperti mysql untuk MySQL dan MariaDB, redis untuk Redis atau Cloud Memorystore, atau postgres untuk database yang kompatibel dengan Postgres.
        • credentials Sebuah objek yang berisi kredensial yang digunakan oleh library klien untuk melakukan koneksi. Sebagian besar library klien mengandalkan kolom uri yang berisi URI standar layanan atau berformat JDBC.
    6. Simpan konten sebagai vcap.json.

Melampirkan kredensial ke resource Cloud Run Anda

Untuk melampirkan kredensial:

  1. Buat secret untuk menyimpan konten variabel lingkungan VCAP_SERVICES Anda dan catat versi dari output dengan perintah:

    gcloud secrets create APP_NAME-vcap \
      --replication-policy="automatic" \
      --data-file=vcap.json
    
  2. Beri akun layanan aplikasi Anda izin untuk membaca secret:

    gcloud secrets add-iam-policy-binding APP_NAME-vcap \
      --member="serviceaccount:app-service-account" \
      --role="roles/secretmanager.secretAccessor"
    
  3. Tambahkan variabel lingkungan berikut ke service.yaml aplikasi Anda pada array spec.template.spec.containers[0].env array :

    - name: VCAP_SERVICES
      valueFrom:
        secretKeyRef:
          key: Version output by step 1
          name: APP_NAME-vcap
    

Template untuk layanan pendukung umum

Berikut informasi tentang layanan pendukung yang biasa digunakan

MySQL

Library MySQL biasanya memerlukan tag mysql. Merupakan hal umum untuk menyertakan kunci berikut dalam credentials:

  • uri template: mysql://username:password@host:port/dbname. Dokumentasi MySQL dapat membantu saat membuat string URI. Port yang biasanya digunakan adalah 3306.
  • username Nama pengguna koneksi, yang diperlukan oleh beberapa library meskipun disertakan dalam uri
  • password Sandi koneksi, diperlukan oleh beberapa library meskipun disertakan dalam uri

Redis

Library Redis biasanya memerlukan tag redis. Merupakan hal umum untuk menyertakan kunci berikut dalam credentials:

  • uri Template: redis://:password@host:port/dbunumber.

Dokumentasi URI Redis IANA dapat membantu saat membuat string URI. Port yang biasanya digunakan adalah 6379.

RabbitMQ

Library RabbitMQ biasanya memerlukan tag rabbitmq dan kunci berikut di credentials:

  • uri Template: amqp://username:password@host:port/vhost?query.

Dokumentasi RabbitMQ dapat membantu saat membuat string URI. Port yang biasanya digunakan adalah 5672.

Layanan User-provided

Layanan User-provided adalah jenis layanan khusus di Cloud Foundry yang memungkinkan Anda memasukkan kredensial apa pun. Label yang digunakan selalu user-provided. Tag adalah nilai yang diteruskan ke cf create-user-provided-service melalui flag -t, dan kredensialnya adalah konten dari flag -p.

Men-deploy aplikasi Anda

Untuk men-deploy aplikasi Cloud Foundry yang dimigrasikan sepenuhnya ke layanan Cloud Run:

  1. Jika Anda belum melakukannya, siapkan lingkungan Cloud Run mu.

  2. Jalankan perintah

    gcloud run services replace service.yaml
    

    Tunggu sebentar sampai proses deployment selesai. Jika berhasil, command line akan menampilkan URL layanan.

  3. Kunjungi layanan yang telah di-deploy dengan membuka URL layanan pada browser web.

Selamat! Anda baru saja memigrasikan aplikasi Cloud Foundry Anda ke Cloud Run