Agen startup container di Compute Engine tidak digunakan lagi. Agen ini memungkinkan Anda men-deploy container di instance Compute Engine saat membuat VM.
Dokumen ini menjelaskan cara memigrasikan container yang ada yang dibuat oleh agen startup di VM atau grup instance terkelola (MIG) ke layananGoogle Cloud lain.
Berdasarkan persyaratan Anda, pilih salah satu opsi berikut untuk memigrasikan container yang di-deploy di VM menggunakan metode yang tidak digunakan lagi:
- Jika Anda ingin terus menjalankan container di VM dan MIG individual, gunakan skrip startup atau cloud-init.
- Jika Anda memiliki aplikasi container stateless dan tugas berukuran kecil hingga sedang, gunakan Cloud Run.
- Jika penampung Anda adalah tugas batch yang memiliki status akhir yang pasti dan memerlukan resource komputasi tambahan, gunakan Batch.
- Jika Anda memerlukan kontrol dan skalabilitas tingkat lanjut atau jika Anda tidak dapat memenuhi persyaratan dengan opsi lain, gunakan GKE di Google Cloud.
Untuk kasus penggunaan dan solusi alternatif lainnya, lihat Membandingkan opsi deployment container.
Mencegah pembuatan VM baru yang menggunakan agen startup container
Untuk mencegah pembuatan VM baru yang menggunakan agen startup penampung yang tidak digunakan lagi, administrator organisasi dapat menerapkan kebijakan organisasi. Untuk mengetahui informasi selengkapnya, lihat Mencegah pembuatan VM yang menggunakan metadata container yang tidak digunakan lagi.
Opsi yang tidak digunakan lagi untuk mengonfigurasi container di VM
Saat Anda mengonfigurasi container selama pembuatan VM,
Compute Engine menggunakan agen startup container untuk membaca metadata gce-container-declaration yang menyimpan informasi container, dan untuk men-deploy container di VM.
Opsi berikut untuk men-deploy container langsung di VM atau MIG yang menggunakan agen startup container dan gce-container-metadata tidak digunakan lagi.
Konsol
Opsi Deploy container di halaman Create an instance tidak digunakan lagi:

gcloud
Perintah gcloud berikut yang mengonfigurasi container di VM atau template instance tidak digunakan lagi:
- gcloud compute instances create-with-container
- gcloud compute instances update-container
- gcloud compute instance-templates create-with-container
- Perintah gcloud compute instances create yang menggunakan flag
--metadatauntuk menetapkan kunci metadatagce-container-declaration - Perintah gcloud compute instance-templates create yang menggunakan flag
--metadatauntuk menetapkan kunci metadatagce-container-declaration
Terraform
Modul Terraform gce-container
dan kunci metadata gce-container-declaration untuk mengonfigurasi container tidak digunakan lagi.
Mencegah pembuatan VM yang menggunakan agen startup container
Untuk mencegah pembuatan VM baru yang menggunakan agen startup container yang tidak digunakan lagi dengan menggunakan kebijakan organisasi, lihat Mencegah pembuatan VM yang menggunakan metadata container yang tidak digunakan lagi.
Mengidentifikasi instance yang menggunakan metadata container yang tidak digunakan lagi
Untuk mengidentifikasi instance di project Anda yang menggunakan metadata penampung yang tidak digunakan lagi, ikuti langkah-langkah berikut untuk memeriksa kunci metadata gce-container-declaration:
Jalankan salah satu perintah berikut:
Untuk mencantumkan semua instance dalam project Anda yang menggunakan kunci dan nilai metadata
gce-container-declaration, jalankan perintah gcloud CLI berikut:gcloud compute instances list --filter="metadata.items.key:gce-container-declaration"Perintah ini memberikan daftar semua instance VM dalam project yang dikonfigurasi yang berisi kunci metadata
gce-container-declaration. Kunci metadata mengidentifikasi VM secara unik yang berada dalam cakupan penghentian penggunaan. Jika Anda menggunakan beberapa project, jalankan perintah ini di semua project aktif.Untuk memvalidasi instance tertentu, jalankan perintah gcloud CLI berikut:
gcloud compute instances describe VM_NAME --format="(metadata.items)"Ganti
VM_NAMEdengan nama instance VM yang ingin Anda validasi.
Jika output perintah dari langkah sebelumnya mencantumkan instance yang menggunakan kunci metadata
gce-container-declaration, jalankan perintah berikut untuk mendapatkan detail selengkapnya tentang deklarasi penampung di VM Anda:gcloud compute instances list \ --filter='metadata.items.key:gce-container-declaration AND (metadata.items.value~"image:")' \ --format="table(name, zone, metadata.items.filter(key='gce-container-declaration').extract(value).slice(0):label=CONTAINER_DECLARATION)"Berdasarkan output perintah, pertimbangkan hal berikut:
Jika metadata berisi definisi untuk agen startup penampung yang tidak digunakan lagi, Anda harus memigrasikan deployment penampung ke solusi alternatif seperti yang dijelaskan dalam dokumen ini.
Jika kunci metadata
gce-container-declarationada, tetapi Anda tidak menggunakannya untuk agen startup container, lakukan tindakan berikut:- Periksa apakah Anda menggunakan kembali kunci metadata ini untuk konfigurasi lain.
- Jika Anda menggunakan kembali kunci, gunakan kunci metadata yang berbeda untuk konfigurasi lainnya.
Untuk mengetahui informasi selengkapnya tentang cara melihat metadata, lihat Melihat dan membuat kueri metadata.
Membandingkan opsi deployment container
Tabel berikut merangkum kasus penggunaan untuk menjalankan container di VM dan merekomendasikan solusi container alternatif untuk memigrasikan workload Anda:
| Kasus penggunaan | Jenis penggantian | Biaya | Solusi yang direkomendasikan |
|---|---|---|---|
|
|
Penggantian langsung | Tanpa biaya tambahan | Gunakan skrip startup untuk men-deploy container di VM. |
|
Misalnya, membuat pengguna, mengimpor file, memasang disk, atau menggunakan mode istimewa. |
Penggantian langsung | Tanpa biaya tambahan | Gunakan cloud-init untuk menjalankan tugas selama siklus proses VM. |
| Menjalankan tugas batch yang memiliki status akhir yang pasti dan memerlukan resource komputasi tambahan. | Layanan terkelola | Bergantung pada karakteristik workload dan kompleksitas konfigurasi penampung Anda. | Batch |
|
|
Layanan terkelola | Solusi tanpa biaya hingga biaya rendah untuk workload yang lebih kecil. | Cloud Run |
|
|
Layanan terkelola | Bergantung pada karakteristik workload dan kompleksitas konfigurasi container. | Google Kubernetes Engine |
Saat Anda beralih dari agen startup container Compute Engine ke solusi alternatif, pertimbangkan perubahan yang diperlukan berikut dan potensi upaya untuk menerapkannya:
- VM yang menjalankan Container-Optimized OS: Mengambil kepemilikan penuh atas penyiapan, konfigurasi, keamanan, dan pemeliharaan VM dan runtime container, yang sering kali melibatkan pembuatan skrip dengan skrip startup atau
cloud-init. - Cloud Run atau Batch: Pastikan aplikasi Anda tidak memiliki status dan sesuai dengan model eksekusi berbasis tugas atau berbasis permintaan. Pendekatan ini mungkin melibatkan penyesuaian aplikasi agar dapat berfungsi dengan layanan pengelolaan status eksternal.
- GKE: Terapkan prinsip Kubernetes, tentukan beban kerja menggunakan file manifes Kubernetes, dan kelola resource cluster.
Menggunakan skrip startup untuk men-deploy container di VM
Anda dapat menjalankan container dasar di VM menggunakan skrip startup.
Pertimbangkan poin-poin berikut saat Anda menggunakan skrip startup untuk mengonfigurasi container:
- Anda dapat menggunakan skrip startup untuk skenario dasar. Untuk konfigurasi lanjutan, pertimbangkan penggunaan
cloud-init. - Karena Anda membuat VM baru dengan container yang dikonfigurasi menggunakan skrip startup, Anda harus merencanakan transisi workload apa pun yang di-deploy di VM yang ada.
- Uji dan pastikan semuanya berfungsi seperti yang diharapkan sebelum Anda merutekan traffic ke VM yang baru dibuat dengan container.
Untuk membuat VM dan men-deploy container di VM atau MIG, lakukan hal berikut:
- Memetakan container saat ini di metadata VM ke perintah skrip startup
- Membuat skrip startup berdasarkan konfigurasi metadata yang ada
- Buat VM menggunakan skrip startup atau Buat MIG menggunakan skrip startup.
Memetakan metadata container ke perintah docker run
Anda dapat memetakan metadata VM atau flag gcloud
ke argumen docker run dan menyertakannya dalam skrip startup untuk membuat VM.
Beberapa tanda gcloud diterjemahkan langsung ke metadata VM. Flag ini juga diterjemahkan langsung ke flag docker run.
Jika memiliki penampung yang ada di VM, Anda dapat membaca konfigurasi metadata VM dan membuat skrip startup menggunakan perintah docker run yang setara.
# Get your existing VM instance configuration in yaml format
gcloud compute instances describe VM_NAME --format="(metadata.items)"
Outputnya mirip dengan hal berikut ini:
metadata:
items:
- key: gce-container-declaration
value: |
spec:
containers:
- args:
- '"hello world!"'
command:
- echo
env:
- name: ONE
value: '1'
image: docker.io/library/busybox
name: my-instance
securityContext:
privileged: true
stdin: true
tty: true
restartPolicy: Always
- key: google-logging-enabled
value: 'true'
Gunakan tabel berikut untuk memetakan spesifikasi yang ada ke perintah docker run:
| Flag gcloud CLI | Kunci metadata VM | Perintah Docker run |
|---|---|---|
--container-image |
containers.image |
Tentukan sebagai argumen tanpa tanda apa pun. Misalnya: docker run gcr.io/google-containers/busybox |
--container-command |
command |
Tentukan sebagai argumen tanpa flag apa pun, setelah nama image
container. Contoh: docker run gcr.io/google-containers/busybox echo "hello world" |
--container-arg |
args |
Tentukan sebagai argumen tanpa flag apa pun, setelah perintah. Misalnya: docker run gcr.io/google-containers/busybox echo "hello world" |
--container-env |
containers.env array |
--env KEY=VALUE [--env KEY=VALUE ...] |
--container-restart-policy |
restartPolicy |
--restartNilai yang mungkin adalah no, on-failure, dan always. Default-nya adalah no. |
--container-stdin |
containers.stdin |
-iFlag boolean, benar jika ada, salah secara default. |
--container-tty |
containers.tty |
-tFlag boolean, benar jika ada, salah secara default. |
--container-privileged |
containers.securityContext.privileged |
--privilegedFlag boolean, benar jika ada, salah secara default. |
--container-mount-disk |
- | Tidak ada perintah docker run yang setara.Anda dapat memasang disk secara terpisah. |
Contoh skrip startup
Contoh berikut menunjukkan cara menyertakan perintah docker dalam skrip
startup Anda:
- Contoh 1: menjalankan container mandiri di VM berdasarkan Container-Optimized OS.
Contoh 2: menjalankan penampung server web di VM berdasarkan Container-Optimized OS.
Contoh 1
Jalankan container mandiri di VM berdasarkan Container-Optimized OS:
#!/bin/bash
# A name for the container
CONTAINER_NAME="my-app-container"
# Stop and remove the container if it exists
docker stop $CONTAINER_NAME || true
docker rm $CONTAINER_NAME || true
# Pull the latest version of the container image from Docker Hub
docker pull busybox:latest
# Run docker container from image in docker hub
docker run busybox:latest \
echo "hello world!"
Contoh 2
Jalankan penampung server web di VM berdasarkan Container-Optimized OS:
#!/bin/bash
# Enable incoming traffic
iptables -A INPUT -j ACCEPT
# A name for the container
CONTAINER_NAME="my-app-container"
# Stop and remove the container if it exists
docker stop $CONTAINER_NAME || true
docker rm $CONTAINER_NAME || true
# Pull the latest version of the container image from Docker Hub
docker pull nginx:latest
# Run docker container from image in docker hub
docker run \
--name=$CONTAINER_NAME \
--privileged \
--restart=always \
--tty \
--detach \
--network="host" \
nginx:latest
Opsi konfigurasi tambahan untuk deployment container
Bagian ini menjelaskan parameter konfigurasi tambahan untuk men-deploy container di VM Anda.
Untuk mengetahui informasi selengkapnya tentang opsi ini, lihat Mengonfigurasi opsi untuk menjalankan container.
Akses ke image Artifact Registry
Jika Anda memerlukan akses ke image container dari gcr.io atau pkg.dev, gunakan alat docker-credential-gcr, yang sudah diinstal sebelumnya di Container-Optimized OS, dan konfigurasi autentikasi ke Artifact Registry untuk Docker.
Jalankan perintah berikut sebelum Anda menjalankan container:
# Set home directory to save docker credentials
export HOME=/home/appuser
# Configure docker with credentials for gcr.io and pkg.dev
docker-credential-gcr configure-docker --registries LOCATION-docker.pkg.dev
Ganti LOCATION dengan lokasi repositori Anda.
Untuk mengetahui informasi selengkapnya, lihat Mengonfigurasi autentikasi ke Artifact Registry untuk Docker.
Mengonfigurasi logging
Sebaiknya gunakan Cloud Logging dengan mengaktifkan agen logging di VM.
Atau, jika ingin mengubah driver logging, Anda dapat menyertakan
parameter --log-driver dengan perintah docker run:
# Use Cloud Logging logging driver
docker run --log-driver=gcplogs nginx:latest
Untuk mengetahui informasi selengkapnya, lihat Menggunakan Cloud Logging dengan Container-Optimized OS
Mengonfigurasi firewall internal
Container-Optimized OS menolak traffic masuk secara default, jadi Anda harus menambahkan aturan iptables untuk mengizinkan traffic tersebut. Perhatikan bahwa perintah ini mengonfigurasi firewall internal sistem operasi host. Selain itu, Anda harus mengonfigurasi firewall Virtual Private Cloud (VPC) untuk mengizinkan traffic tersebut ke VM baru
Untuk mengetahui informasi selengkapnya, lihat Menggunakan aturan firewall VPC.
# Enable all incoming and routed traffic
iptables -A INPUT -j ACCEPT
iptables -A FORWARD -j ACCEPT
Untuk mengetahui informasi selengkapnya, lihat Mengonfigurasi firewall host.
Melampirkan volume ke penampung
Jika volume terpasang ke container, metadata container mencakup entri
volumes dan array volumeMounts. name dari entri di volumes
sesuai dengan nama entri di volumeMounts, dan sebaliknya.
Untuk setiap volume yang Anda kumpulkan, kumpulkan informasi yang diperlukan dari
entri volumes atau dari entri volumeMounts.
Jika tidak ada volume yang terpasang ke container, Anda dapat melewati bagian ini dan langsung membuat VM menggunakan skrip startup.
Untuk mengetahui informasi selengkapnya tentang disk dan sistem file di Container-Optimized OS, lihat Ringkasan disk dan sistem file.
Pasang sistem file tmpfs
Untuk memasang sistem file tmpfs kosong ke container, tentukan argumen --tmpfs
dengan perintah docker run Anda. Misalnya, untuk memasang sistem file cache
ke container nginx, jalankan perintah berikut:
# mount a cache file system to the nginx container
docker run -d --name=$CONTAINER_NAME --tmpfs /var/cache/nginx:rw,size=512m,noexec,nosuid,nodev --network="host" nginx:latest
Untuk mengetahui informasi selengkapnya tentang pemasangan sistem file tmpfs, lihat pemasangan tmpfs.
Pasang direktori host
Untuk memasang direktori dari VM host ke container, tentukan argumen --mount
dengan perintah docker run:
# mount a read-only directory to the nginx container
docker run -d --name=$CONTAINER_NAME --mount type=bind,source=/var/www/html,target=/usr/share/nginx/html,ro nginx:latest
Untuk mengetahui informasi selengkapnya, lihat Bind mount.
Pasang persistent disk ke container
Pemasangan disk ke container memerlukan langkah tambahan. Untuk memasang disk, pasang terlebih dahulu di VM, lalu pasang disk tersebut ke container:
Untuk memasang disk ke VM, jalankan perintah berikut:
#!/bin/bash DISK_DEVICE_NAME="my-persistent-disk" # This name MUST match the 'device-name' in the gcloud --disk flag DISK_BY_ID_PATH="/dev/disk/by-id/google-${DISK_DEVICE_NAME}" HOST_MOUNT_POINT="/mnt/disks/my-persistent-disk" # This is the path where the disk will be mounted on the VM CONTAINER_MOUNT_PATH="/usr/share/my-persistent-disk" # This is the path where the disk will be mounted in the container # format a disk as an ext4 filesystem, if it doesn't already contain one file -sL $DISK_BY_ID_PATH | grep -q filesystem || \ mkfs.ext4 -m 0 -E lazy_itable_init=0,lazy_journal_init=0,discard $DISK_BY_ID_PATH # create a directory for mounting point sudo mkdir -p "${HOST_MOUNT_POINT}" # mount a disk to the VM sudo mount -o defaults,discard "${DISK_BY_ID_PATH}" "${HOST_MOUNT_POINT}"Setelah memasang disk ke VM, tambahkan flag
--mountdengan perintahdocker rununtuk memasang disk ke container:docker run -d --name=$CONTAINER_NAME --mount type=bind,source="${HOST_MOUNT_POINT}",target="${CONTAINER_MOUNT_PATH}",readonly nginx:latest
Membuat skrip startup dengan bantuan Gemini
Anda dapat menggunakan Gemini untuk membantu Anda membuat skrip startup berdasarkan deklarasi penampung yang ada.
Untuk menggunakan Gemini Cloud Assist dalam membuat skrip startup, ikuti langkah-langkah berikut:
Buka halaman Compute Engine.
Di toolbar Google Cloud , klik spark Buka atau tutup chat AI Gemini untuk membuka chat Gemini Cloud Assist.
Di kolom Masukkan perintah, masukkan perintah contoh yang disediakan di bagian ini. Ganti placeholder untuk skrip dan YAML container dengan skrip startup dan konfigurasi container yang ada.
Klik Send prompt.
Untuk mengetahui informasi selengkapnya tentang cara menyiapkan dan menggunakan Gemini Cloud Assist, lihat Menyiapkan Gemini Cloud Assist.
Contoh perintah untuk membuat skrip startup dari konfigurasi container yang ada
<OBJECTIVE_AND_PERSONA>
You are a senior systems architect migrating container deployments on Compute Engine. The legacy container startup agent, Konlet, is deprecated, which is the reason for this migration. Your task is to process the input YAML specification, which is the existing container declaration being migrated, and translate it into a robust Bash startup script for Container-Optimized OS on Compute Engine. You must ensure complete functional equivalence with 1:1 Konlet parity by following the `<INSTRUCTIONS>` and referring to the `<CONTEXT>` element below.
</OBJECTIVE_AND_PERSONA>
<INSTRUCTIONS>
To complete this task, follow these instructions in sequence:
1. Initialize the script with the shebang `#!/bin/bash` and options `set -euo pipefail`.
2. Integrate the "Existing Script" input verbatim immediately after the initialization.
3. Add a blank line, then define a function wrapper: `start_gce_container() { ... }`.
4. Inside the function, include the mandatory logic blocks for Firewall, Cleanup, and Authentication provided in the `<CONTEXT>`.
5. Translate the provided YAML "Container Declaration" using the mapping rules in the `<CONTEXT>`.
6. Generate HostPath, EmptyDir, or Persistent Disk volume preparation steps using the patterns provided in the `<CONTEXT>`.
7. Finalize the function, add a blank line, and provide the invocation and completion echo statements as specified in the `<OUTPUT_FORMAT>`.
</INSTRUCTIONS>
<CONSTRAINTS>
1. Do not simplify: Ensure all logic steps and verbatim blocks are included. Omitting any block constitutes a functional failure.
2. UI link protection: Define all URLs using split-string variables to prevent the UI from breaking the script with Markdown links:
`KLT_URL="http""://metadata.google.internal/..."`
3. Nsenter prefix: You must prefix every `mkdir`, `mount`, `umount`, `blkid`, `mkfs`, and `grep` (when checking `/proc/mounts`) with: `nsenter -t 1 -m --`.
4. One command per line: Every single Bash command must be on its own separate line. Do not split a single command's arguments across multiple lines (e.g. keep `docker run` and its flags on one line, or use backslash `\` line continuations if you split the command).
5. Comment style: Include headers and comments using the `#` symbol for clarity.
6. Docker execution rules: Always run containers in detached mode using `docker run -d`. Never use the `--rm` flag. Never use the shell background operator (`&`) at the end of the `docker run` command.
</CONSTRAINTS>
<CONTEXT>
## Translation dictionary (1:1 Konlet parity)
1. Restart policy:
- Always: `--restart always`
- OnFailure: `--restart on-failure`
- Never: `--restart no`
2. Security context:
- privileged: true -> Add `--privileged` flag.
- If disk name contains 'local-ssd', use dev path: `/dev/disk/by-id/google-local-nvme-ssd-0`
3. Multi-container support:
- If `spec.containers` has multiple entries, generate a separate `docker run` command for EACH container.
4. Background execution:
- To run containers in the background, you must use the `docker run -d` (detached) flag. Do not use `--rm` or `&`.
## Verbatim logic blocks (Use as-is inside function)
Firewall:
/sbin/iptables -C INPUT -j ACCEPT 2>/dev/null || /sbin/iptables -A INPUT -j ACCEPT
/sbin/iptables -C FORWARD -j ACCEPT 2>/dev/null || /sbin/iptables -A FORWARD -j ACCEPT
Cleanup:
/usr/bin/docker ps -a --filter "name=klt-" -q | xargs -r /usr/bin/docker rm -f
nsenter -t 1 -m -- /bin/sh -c 'for m in $(/bin/grep "/mnt/disks/gce-containers-mounts/" /proc/mounts | /usr/bin/awk '\''{print $2}'\'' | /bin/sort -r); do /bin/umount "$m" || true; done'
Authentication (Hardened for boot-time race conditions):
export DOCKER_CONFIG="/var/lib/docker-config"
/bin/mkdir -p "$DOCKER_CONFIG"
KLT_URL_TOKEN="http""://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token"
KLT_URL_REG="https""://gcr.io"
/bin/sleep 2
KLT_TOKEN=$(/usr/bin/curl -s -H "Metadata-Flavor: Google" "$KLT_URL_TOKEN" | /bin/grep -o '"access_token":"[^"]*' | /bin/grep -o '[^"]*$')
if [ -n "$KLT_TOKEN" ]; then
echo "$KLT_TOKEN" | /usr/bin/docker login -u oauth2accesstoken --password-stdin "$KLT_URL_REG"
fi
## Volume preparation patterns
Pattern A (GcePersistentDisk):
nsenter -t 1 -m -- /bin/mkdir -p [MNT_PATH]
nsenter -t 1 -m -- /sbin/blkid [DEV_PATH] || nsenter -t 1 -m -- /sbin/mkfs.ext4 -m 0 -E lazy_itable_init=0,lazy_journal_init=0,discard [DEV_PATH]
nsenter -t 1 -m -- /bin/mount -t ext4 -o discard,defaults [DEV_PATH] [MNT_PATH]
nsenter -t 1 -m -- /bin/grep -q " [MNT_PATH] " /proc/mounts || exit 1
Pattern B (EmptyDir Memory):
nsenter -t 1 -m -- /bin/mkdir -p [MNT_PATH]
nsenter -t 1 -m -- /bin/mount -t tmpfs tmpfs [MNT_PATH]
nsenter -t 1 -m -- /bin/grep -q " [MNT_PATH] " /proc/mounts || exit 1
Pattern C (HostPath):
nsenter -t 1 -m -- /bin/mkdir -p [HOST_PATH]
</CONTEXT>
<OUTPUT_FORMAT>
1. Shebang & Opts: `#!/bin/bash` and `set -euo pipefail`.
2. Existing Script: Integrated verbatim.
3. [BLANK LINE]
4. Function Wrapper: `start_gce_container() { ... }`
5. [BLANK LINE]
6. Invocation: `start_gce_container || echo "Error: Container failed to start..."`
7. Completion: `echo "Startup script finished."`
</OUTPUT_FORMAT>
<FEW_SHOT_EXAMPLES>
<INPUT_YAML>
```yaml
spec: \
containers: \
- name: klt-main \
image: gcr.io/my-proj/app:v1 \
volumeMounts: \
- name: data \
mountPath: /data \
volumes: \
- name: data \
gcePersistentDisk: \
pdName: data-disk \
fsType: ext4
```
</INPUT_YAML>
<OUTPUT_THOUGHTS>
The model should identify Pattern A for GcePersistentDisk and use the `nsenter` prefix for mounts.
</OUTPUT_THOUGHTS>
<OUTPUT_SNIPPETS>
<SAMPLE_STARTUP_SCRIPT>
#!/bin/bash \
set -euo pipefail \
echo "=== STARTING CUSTOM PRE-STARTUP ===" \
mkdir -p /tmp/test-marker \
echo "marker-content" > /tmp/test-marker/ok.txt \
echo "=== FINISHED CUSTOM PRE-STARTUP ==="
start_gce_container() {
# Firewall:
/sbin/iptables -C INPUT -j ACCEPT 2>/dev/null || /sbin/iptables -A INPUT -j ACCEPT
/sbin/iptables -C FORWARD -j ACCEPT 2>/dev/null || /sbin/iptables -A FORWARD -j ACCEPT
# Cleanup:
/usr/bin/docker ps -a --filter "name=klt-" -q | xargs -r /usr/bin/docker rm -f
nsenter -t 1 -m -- /bin/sh -c 'for m in $(/bin/grep "/mnt/disks/gce-containers-mounts/" /proc/mounts | /usr/bin/awk '\''{print $2}'\'' | /bin/sort -r); do /bin/umount "$m" || true; done'
# Authentication (Hardened for boot-time race conditions):
export DOCKER_CONFIG="/var/lib/docker-config"
/bin/mkdir -p "$DOCKER_CONFIG"
KLT_URL_TOKEN="http""://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token"
KLT_URL_REG="https""://gcr.io"
/bin/sleep 2
KLT_TOKEN=$(/usr/bin/curl -s -H "Metadata-Flavor: Google" "$KLT_URL_TOKEN" | /bin/grep -o '"access_token":"[^"]*' | /bin/grep -o '[^"]*$')
if [ -n "$KLT_TOKEN" ]; then
echo "$KLT_TOKEN" | /usr/bin/docker login -u oauth2accesstoken --password-stdin "$KLT_URL_REG"
fi
</SAMPLE_STARTUP_SCRIPT>
</OUTPUT_SNIPPETS>
</FEW_SHOT_EXAMPLES>
<RECAP>
As the systems architect leading this migration on Compute Engine, you must ensure that the final script retains full functional equivalence with the deprecated Konlet agent. This requires applying the host-level execution constraints using `nsenter` specified in the `<CONTEXT>` element, protecting URLs with string splitting, and strictly conforming to the `<OUTPUT_FORMAT>` without skipping any logic blocks.
</RECAP>
# Input
1. Existing script: EXISTING_SCRIPT
2. Container declaration (YAML): CONTAINER_YAML
Ganti kode berikut:
EXISTING_SCRIPT: konten skrip startup yang ada. Tambahkan garis miring terbalik (\) di akhir setiap baris, bukan jeda baris.CONTAINER_YAML: spesifikasi YAML deployment penampung dari kunci metadatagce-container-declaration. Tambahkan garis miring terbalik (\) di akhir setiap baris, bukan pemisah baris.
Buat VM menggunakan skrip startup
Setelah membuat skrip startup dengan konfigurasi container, gunakan skrip startup ini untuk membuat VM berdasarkan Container-Optimized OS. Untuk mengetahui informasi selengkapnya tentang cara membuat VM berdasarkan Container-Optimized OS, lihat Membuat instance dari image publik.
Untuk mengetahui informasi selengkapnya tentang penggunaan skrip startup, lihat Menggunakan skrip startup di VM Linux.
Konsol
Di konsol Google Cloud , buka halaman Create an instance.
Jika diminta, pilih project Anda, lalu klik Lanjutkan. Halaman Create an instance akan muncul dan menampilkan panel Machine configuration.
Di panel Konfigurasi mesin, pilih kelompok mesin dan jenis mesin untuk VM Anda.
Di menu navigasi, klik OS dan penyimpanan. Di panel Operating system and storage yang muncul, konfigurasi disk boot Anda dengan melakukan hal berikut:
- Klik Ubah. Panel Boot disk akan muncul dan menampilkan tab Public images.
- Di daftar Operating system, pilih Container Optimized OS.
- Dalam daftar Versi, pilih versi OS.
- Pada daftar Boot disk type, pilih jenis boot disk.
- (Opsional) Jika Anda memerlukan disk tambahan, tambahkan disk di bagian Additional disks.
- Klik Pilih.
Di menu navigasi, klik Lanjutan.
- Di bagian Automation, tempel skrip startup yang Anda buat untuk deployment penampung Anda.
Untuk membuat dan memulai VM, klik Create.
gcloud
Saat menggunakan gcloud CLI, simpan skrip startup dalam file terpisah.
Untuk membuat VM menggunakan skrip startup, jalankan perintah berikut:
gcloud compute instances create VM_NAME \ --zone=ZONE \ --image-family=IMAGE_FAMILY \ --image-project=IMAGE_PROJECT \ --machine-type=MACHINE_TYPE \ --metadata-from-file=startup-script=STARTUP_SCRIPT_FILEGanti kode berikut:
VM_NAME: nama VM baru.ZONE: zona untuk membuat instance.IMAGE_PROJECT: project gambar Container-Optimized OS yang berisi gambar, misalnya,cos-cloud.IMAGE_FAMILY: kelompok image Container-Optimized OS, misalnya,cos-stable.MACHINE_TYPE: jenis mesin untuk VM baru, yang dapat berupa jenis mesin bawaan atau jenis mesin kustom.STARTUP_SCRIPT_FILE: jalur relatif di komputer Anda ke file skrip startup, misalnya,./startup_script.sh.
Contoh:
# Create COS-based VM by using a startup script gcloud compute instances create "cos-instance-with-startup-script" \ --zone="us-central1-c" \ --machine-type="e2-medium" \ --image-family="cos-stable" \ --image-project="cos-cloud" \ --metadata-from-file=startup-script="./startup_script.sh"
Pastikan bahwa Compute Engine telah membuat VM dengan menjalankan perintah berikut:
gcloud compute instances describe VM_NAME
Ganti
VM_NAMEdengan nama VM yang Anda buat.
Terraform
Untuk membuat VM, Anda dapat menggunakan resource google_compute_instance.
provider "google" {
project = "PROJECT_ID"
}
resource "google_compute_instance" "cos_vm_instance" {
name = "VM_NAME"
machine_type = "MACHINE_TYPE"
zone = "ZONE"
# Use a Container-Optimized OS image for the boot disk
boot_disk {
initialize_params {
image = "IMAGE_PROJECT/IMAGE_FAMILY"
}
}
# Attaches the instance to the default network
network_interface {
network = "default"
}
# Specify the relative path to the startup script on your local machine
metadata = {
startup-script = file("STARTUP_SCRIPT_FILE")
}
}
Ganti kode berikut:
VM_NAME: name VM baruZONE: zona untuk membuat instance.IMAGE_PROJECT: project image Container-Optimized OS yang berisi image, misalnya,cos-cloud.IMAGE_FAMILY: kelompok image Container-Optimized OS, misalnya,cos-stable.MACHINE_TYPE: jenis mesin untuk VM baru, yang dapat berupa jenis mesin bawaan atau jenis mesin kustom.STARTUP_SCRIPT_FILE: jalur relatif di komputer Anda ke file skrip startup, misalnya,./startup_script.sh.
Contoh:
provider "google" {
project = "my-project"
}
resource "google_compute_instance" "my_container_vm" {
name = "my-container-vm-startup"
machine_type = "e2-medium"
zone = "us-central1-a"
boot_disk {
initialize_params {
image = "cos-cloud/cos-stable"
}
}
network_interface {
network = "default"
}
metadata = {
startup-script = file("./startup_script.sh")
}
}
Membuat MIG menggunakan skrip startup
Setelah membuat template instance menggunakan skrip startup, gunakan salah satu metode berikut untuk membuat MIG.
Untuk mengetahui informasi selengkapnya tentang cara membuat MIG, lihat Membuat grup instance terkelola.
Konsol
Buat template instance yang didasarkan pada skrip startup yang Anda buat di bagian sebelumnya.
- Di bagian Operating system, pilih Container Optimized OS dan versinya.
- Di bagian Automation, tempel skrip startup yang Anda buat untuk deployment penampung.
Buat MIG menggunakan template instance yang dibuat pada langkah sebelumnya.
gcloud
Buat template instance menggunakan perintah
instance-templates create.Anda harus menggunakan image Container-Optimized OS untuk VM. Anda dapat menentukan jalur relatif ke file skrip startup dalam tanda
--metadata-from-file.Buat MIG menggunakan template instance yang dibuat pada langkah sebelumnya.
Contoh:
# Create the instance template that uses a startup script
gcloud compute instance-templates create startup-template \
--machine-type=e2-medium \
--image-family=cos-stable \
--image-project=cos-cloud \
--metadata-from-file=startup-script=./startup_script.sh
# Create the managed instance group
gcloud compute instance-groups managed create startup-mig \
--template=startup-template \
--size=2 \
--zone=us-central1-a
Terraform
Gunakan resource google_compute_instance_template dan google_compute_instance_group_manager untuk
membuat template instance dan MIG, seperti yang ditunjukkan dalam contoh berikut:
Contoh:
resource "google_compute_instance_template" "startup_template" {
name_prefix = "startup-template-"
machine_type = "e2-medium"
disk {
source_image = "cos-cloud/cos-stable"
auto_delete = true
boot = true
}
network_interface {
network = "default"
}
metadata = {
startup-script = file("./startup_script.sh")
}
}
resource "google_compute_instance_group_manager" "startup_mig" {
name = "startup-mig"
base_instance_name = "startup-vm"
zone = "us-central1-a"
version {
instance_template = google_compute_instance_template.startup_template.id
}
target_size = 2
}
Menguji dan menghapus
Setelah berhasil membuat VM atau MIG, validasi bahwa aplikasi Anda berjalan di container dan berfungsi seperti yang diharapkan. Untuk memperbaiki masalah, lihat Pemecahan masalah.
Jika aplikasi berhasil berjalan di VM baru yang dibuat menggunakan skrip startup, Anda dapat menghapus VM dan MIG yang menggunakan metode deployment container yang tidak digunakan lagi.
Memecahkan masalah skrip startup
Bagian ini memberikan informasi pemecahan masalah untuk masalah yang mungkin Anda alami saat menggunakan skrip startup.
Tidak dapat menyimpan konfigurasi docker
Saat menjalankan perintah docker-credential-gcr configure-docker dalam skrip startup,
Anda mungkin mendapatkan pesan error berikut:
ERROR: Unable to save docker config: mkdir /root/.docker: read-only file system
Error ini terjadi karena docker-credential-gcr mencoba menulis kredensial
ke file /root/.docker/config.json. Sistem file root di
Container-Optimized OS bersifat hanya baca, sehingga Anda tidak dapat menulis ke dalamnya.
Untuk mengatasi masalah ini, tetapkan variabel lingkungan $HOME agar mengarah ke direktori utama kustom sebelum Anda menjalankan perintah docker.
Contoh:
export HOME=/home/appuser docker-credential-gcr configure-docker
Melihat log untuk men-debug masalah
Untuk memecahkan masalah yang mungkin terjadi saat Anda mengonfigurasi container di VM menggunakan skrip startup, lihat log skrip startup dan log container.
Untuk melihat log skrip startup di instance VM, jalankan perintah berikut:
sudo journalctl | grep "startup-script"
Untuk melihat log dari container Docker, jalankan perintah
docker logs:docker logs CONTAINER_NAME
Ganti
CONTAINER_NAMEdengan nama container Anda.
Untuk memecahkan masalah lainnya, lihat dokumen berikut:
- Ringkasan Cloud Logging
- Menggunakan Cloud Logging dengan Container-Optimized OS
- Memecahkan masalah daemon Docker
- Memecahkan masalah dan mendiagnosis
- Memecahkan masalah Terraform
- Memecahkan masalah saat menjalankan server web dasar
- Menyiapkan dan mengelola penafsiran alamat jaringan dengan Public NAT
Menggunakan cloud-init dengan Container-Optimized OS
Anda dapat menggunakan cloud-init, solusi lintas platform dan standar industri, untuk men-deploy container di VM yang menjalankan Container-Optimized OS.
Alat ini memungkinkan Anda menjalankan konfigurasi kustom selama pembuatan atau startup VM.
Untuk mengetahui informasi selengkapnya, lihat
Menggunakan cloud-init dengan format konfigurasi Cloud.
Menggunakan layanan terkelola untuk deployment container
Bagian ini menjelaskan layanan terkelola yang disediakan oleh Google Cloud yang dapat Anda gunakan untuk men-deploy container.
Cloud Run
Cloud Run adalah opsi yang bagus untuk aplikasi container stateless dan tugas kecil hingga sedang.
Fitur utama Cloud Run meliputi hal berikut:
- Anda dapat memilih untuk hanya mengalokasikan CPU selama pemrosesan permintaan, atau selalu mengalokasikan CPU.
- Anda dapat menjalankan aplikasi container stateless atau menjalankan tugas sekaligus, sesuai jadwal, atau sebagai bagian dari alur kerja.
- Anda dapat mengonfigurasi waktu tunggu untuk setiap permintaan atau tugas.
- Sangat skalabel dan aman.
- Layanan ini memiliki load balancing dan penskalaan otomatis terintegrasi.
Untuk mengetahui informasi selengkapnya tentang cara men-deploy container di Cloud Run, lihat Men-deploy image container ke Cloud Run
Batch
Batch adalah layanan terkelola sepenuhnya yang memungkinkan Anda menjadwalkan, memasukkan dalam antrean, dan menjalankan workload batch processing pada resource Google Cloud . Layanan ini dirancang untuk menjalankan workload gaya batch yang dapat diparalelkan, termasuk yang dikemas dalam container.
Untuk mengetahui informasi selengkapnya tentang men-deploy container di Batch, lihat dokumen berikut:
GKE
Jika Anda menjalankan aplikasi kompleks, microservice, operasi berkelanjutan, dan memerlukan kontrol serta skalabilitas yang terperinci, Google Kubernetes Engine (GKE) adalah penawaran yang paling sesuai. Untuk mengetahui informasi selengkapnya tentang men-deploy container di GKE, lihat dokumen berikut:
- Ringkasan GKE
- Panduan memulai: Men-deploy aplikasi ke cluster GKE
- Men-deploy aplikasi web dalam container
Mendapatkan dukungan
Jika ada pertanyaan tentang proses migrasi atau jika Anda memerlukan bantuan, tinjau FAQ atau hubungi DukunganGoogle Cloud .