Membangun image multi-arch Windows Server


Tutorial ini menunjukkan cara mengelola kompleksitas pembuatan versi dalam membangun image yang menargetkan beberapa versi Windows Server. Container Windows Server memiliki persyaratan kompatibilitas versi yang mencegah container berjalan di lebih dari satu versi host Windows Server. Namun, Docker di Windows Server mendukung image container multi-arch (atau multi-platform) yang dapat berjalan di beberapa versi Windows Server.

Dengan image multi-arch, Anda dapat mengupgrade node pool Windows Server Google Kubernetes Engine (GKE) ke versi Windows Server pilihan Anda tanpa perlu membangun ulang image dan mengubah spesifikasi Pod. Misalnya:

  • GKE versi 1.15 mendukung Windows Server 1809
  • GKE versi 1.16 mendukung Windows Server 1909

Untuk mengupgrade GKE ke versi yang lebih baru secara otomatis, Anda harus membangun image multi-arch untuk workload Windows Anda. Untuk membangun image multi-arch, Anda harus membangun image untuk setiap versi Windows Server, kemudian membuat manifes yang merujuk image tersebut untuk setiap versi Windows Server. Anda dapat membangun image secara manual jika ingin kontrol penuh atas proses pembuatan dan pembangunan gambar. Atau, Anda dapat menggunakan Cloud Build untuk membangun image multi-arch Windows Server secara otomatis.

Tujuan

Dalam tutorial ini, Anda akan mempelajari cara membuat image multi-arch Windows Server secara manual atau dengan Cloud Build.

  • Membuat image secara manual:

    • Buat 2 image Docker dengan versi atau jenis Server Windows yang berbeda, misalnya Long-Term Servicing Channel (LTSC) dan Semi-Annual Channel (SAC).
    • Buat VM Windows Server.
    • Buat manifes dan kirim ke registry.
  • Membangun image menggunakan Cloud Build:

    • Siapkan lingkungan Anda dengan membuat project, mengaktifkan API, dan memberikan izin.
    • Buat aplikasi, Dockerfile, dan file build.
    • Jalankan perintah untuk membangun image.

Biaya

Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.

Sebelum memulai

Sebelum memulai, pastikan Anda telah melakukan tugas berikut:

  1. Menginstal Google Cloud CLI untuk menjalankan perintah gcloud.
  2. Menginstal Docker untuk membangun container.
  3. Menginstal Go untuk membuat biner Windows Server.
  4. Tutorial ini menggunakan Artifact Registry sebagai repositori. Pastikan Anda telah membuat repositori Docker.

Membangun gambar multi-arch secara manual

Membangun image multi-arch secara manual memberi Anda fleksibilitas untuk membangun image yang menyertakan versi Windows Server yang Anda butuhkan. Untuk membangun image multi-arch secara manual:

  1. Buat image single-arch Docker LTSC 2019. Lihat detail tentang membuat image Docker di Men-deploy aplikasi Windows Server. Misalnya, us-docker.pkg.dev/my-project/docker-repo/foo:1.0-2019.
  2. Buat image single-arch Docker LTSC 2022. Misalnya, us-docker.pkg.dev/my-project/docker-repo/foo:1.0-2022
  3. Buat image single-arch Docker SAC 20H2. Misalnya, us-docker.pkg.dev/my-project/docker-repo/foo:1.0-20h2.
  4. Buat VM Windows Server, misalnya versi 20H2. Lihat Panduan memulai menggunakan VM Windows Server.
  5. Menggunakan RDP untuk terhubung ke VM.
  6. Buka jendela PowerShell untuk menjalankan perintah di langkah berikutnya.
  7. Mengaktifkan fitur eksperimental docker manifest. Manifes Docker adalah daftar image yang akan dikirim ke registry:

    PS C:\> $env:DOCKER_CLI_EXPERIMENTAL = 'enabled'
    
  8. Buat manifes multi-arch:

    docker manifest create `
      REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/foo:1.0 `
      REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/foo:1.0-2019 `
      REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/foo:1.0-2022 `
      REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/foo:1.0-20h2
    
  9. Kirim manifes image multi-arch yang baru dibuat ke repositori Artifact Registry:

     docker manifest push `
       REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/foo:1.0
    
  10. Untuk memastikan image multi-arch Anda berhasil dibuat dan dikirim, buka REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/foo dan klik image tersebut. Anda akan melihat 3 image di dalam:

    • foo:1.0-2019
    • foo:1.0-2022
    • foo:1.0-20h2
    • foo:1.0

Sekarang Anda dapat merujuk ke image multi-arch REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/foo:1.0 di spesifikasi Pod. Langkah ini memungkinkan Anda untuk menggunakan upgrade otomatis untuk node pool GKE Windows dengan aman.

Membangun image multi-arch menggunakan gke-windows-builder Cloud Build

Untuk memudahkan langkah-langkah membangun secara manual, Anda dapat menggunakan gke-windows-builder berdasarkan OSS gke-windows-builder. Anda dapat menggunakan gke-windows-builder dengan Cloud Build untuk membangun image multi-arch Windows Server secara otomatis. GKE mengupdate builder untuk menyertakan versi SAC dan LTSC Windows baru yang didukung saat dirilis. Manfaat lain dari penggunaan builder adalah Anda tidak perlu membuat VM Windows sendiri dengan Powershell untuk membangun image. VM Windows diganti dengan container Docker yang menjalankan perintah untuk Anda di dalam Cloud Build.

Untuk membantu Anda memahami cara kerja builder, ikuti contoh ini untuk membangun image multi-arch "hello world". Langkah-langkah ini dapat dilakukan di server Linux atau Windows.

Mempersiapkan lingkungan

Untuk mempersiapkan lingkungan Anda, lakukan langkah-langkah berikut:

  1. Buat direktori ruang kerja di komputer kerja Anda, misalnya: ~/gke-windows-builder/hello-world.
  2. Buat atau pilih project untuk tutorial ini.
  3. Pastikan penagihan diaktifkan untuk project Anda.
  4. Aktifkan Compute Engine, Cloud Build, dan Artifact Registry API untuk project Anda. gke-windows-builder dipanggil menggunakan Cloud Build, dan image container multi-arch yang dihasilkan dikirim ke Artifact Registry. Compute Engine diperlukan builder untuk membuat dan mengelola VM Windows Server.

    gcloud services enable compute.googleapis.com cloudbuild.googleapis.com \
      artifactregistry.googleapis.com cloudbuild.googleapis.com
    
  5. Berikan peran Identity and Access Management (IAM) berikut ke akun layanan Cloud Build Anda menggunakan Google Cloud CLI:

    1. Tetapkan variabel:

      export PROJECT=$(gcloud info --format='value(config.project)')
      export MEMBER=$(gcloud projects describe $PROJECT --format 'value(projectNumber)')@cloudbuild.gserviceaccount.com
      
    2. Tetapkan peran. Peran ini diperlukan builder untuk membuat VM Windows Server, menyalin ruang kerja ke bucket Cloud Storage, mengonfigurasi jaringan guna membangun image Docker, dan mengirim image yang dihasilkan ke Artifact Registry:

      gcloud projects add-iam-policy-binding $PROJECT --member=serviceAccount:$MEMBER --role='roles/compute.instanceAdmin'
      gcloud projects add-iam-policy-binding $PROJECT --member=serviceAccount:$MEMBER --role='roles/iam.serviceAccountUser'
      gcloud projects add-iam-policy-binding $PROJECT --member=serviceAccount:$MEMBER --role='roles/compute.networkViewer'
      gcloud projects add-iam-policy-binding $PROJECT --member=serviceAccount:$MEMBER --role='roles/storage.admin'
      gcloud projects add-iam-policy-binding $PROJECT --member=serviceAccount:$MEMBER --role='roles/artifactregistry.writer'
      
  6. Tambahkan aturan firewall bernama allow-winrm-ingress agar WinRM dapat terhubung ke VM Windows Server untuk menjalankan build Docker:

    gcloud compute firewall-rules create allow-winrm-ingress --allow=tcp:5986 --direction=INGRESS
    
  7. Buat repositori Docker di Artifact Registry untuk project Anda. Jika Anda belum pernah menggunakan repositori Docker di Artifact Registry, selesaikan Panduan Memulai Docker terlebih dahulu. Jalankan perintah ini untuk membuat repositori Anda:

    gcloud artifacts repositories create REPOSITORY \
      --repository-format=docker --location=REGISTRY_REGION \
      --description="Docker repository"
    

    Ganti kode berikut:

Membuat biner hello.exe di ruang kerja Anda

Untuk tutorial ini, buat aplikasi "hello world" sederhana, yang ditulis dalam Go. Kode untuk aplikasi contoh ada di GitHub.

  1. Buat clone repositori yang berisi kode contoh untuk tutorial ini ke komputer lokal Anda dengan perintah berikut:

     git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
     cd kubernetes-engine-samples/windows/windows-multi-arch
    
  2. File hello.go akan mencetak kata "Hello World":

    package main
    
    import "fmt"
    
    func main() {
    	fmt.Println("Hello World!")
    }
    
  3. Buat biner hello.exe:

    GOOS=windows go build hello.go
    

Anda akan melihat biner hello.exe di ruang kerja Anda.

Membuat Dockerfile dan membangun file di ruang kerja Anda

Di bagian ini, Anda menggunakan Dockerfile untuk membangun semua image Server Windows single-arch, lalu menggunakan file build untuk memicu Cloud Build. Build ini menggabungkan image single-arch menjadi image multi-arch.

  1. Dockerfile adalah dokumen teks yang berisi petunjuk untuk Docker dalam membangun image. gke-windows-builder mengganti WINDOWS_VERSION dengan versi Windows Server tertentu yang sesuai dengan image yang dibangun. Misalnya, builder akan menjalankan docker build -t multi-arch-helloworld:latest_20h2 --build-arg WINDOWS_VERSION=20H2 . di Windows Server 20H2.

    ARG WINDOWS_VERSION=
    FROM mcr.microsoft.com/windows/servercore:${WINDOWS_VERSION}
    COPY hello.exe /hello.exe
    USER ContainerUser
    ENTRYPOINT ["hello.exe"]
  2. Dalam direktori yang sama yang berisi Dockerfile, file cloudbuild.yaml adalah file konfigurasi build Anda. Ganti <REPOSITORY> dan <REGISTRY_REGION> dengan nama dan region untuk repositori Artifact Registry yang Anda buat di langkah sebelumnya. Pada waktu build, Cloud Build mengganti $PROJECT_ID dengan ID project Anda secara otomatis.

    timeout: 3600s
    steps:
    - name: 'us-docker.pkg.dev/gke-windows-tools/docker-repo/gke-windows-builder:latest'
      args:
      - --container-image-name
      # Replace <REGISTRY_REGION> and <REPOSITORY>.
      - '<REGISTRY_REGION>-docker.pkg.dev/$PROJECT_ID/<REPOSITORY>/multiarch-helloworld:latest'
      # Specify specific variants of images to be built. Or, remove the following 2 lines to default to all available variants.
      - --versions
      - '20H2,ltsc2019'

Membangun image

Sekarang Anda dapat membangun image dan melihat log untuk memverifikasi build yang berhasil.

  1. Untuk membangun image, jalankan perintah berikut:

    gcloud builds submit --config=cloudbuild.yaml .
    
  2. Anda akan melihat log seperti contoh ini. Baris terakhir dalam log menunjukkan bahwa build berhasil:

    Creating temporary tarball archive of 2 file(s) totalling 492 bytes before compression.
    Uploading tarball of [.] to [gs://PROJECT_ID_cloudbuild/source/1600082502.509759-b949721a922d462c94a75da9be9f1181.tgz]
    Created [https://cloudbuild.googleapis.com/v1/projects/PROJECT_ID/builds/ec333452-1301-47e8-90e2-716aeb2f5650].
    Logs are available at [https://console.cloud.google.com/cloud-build/builds/ec333452-1301-47e8-90e2-716aeb2f5650?project=840737568665].
    ------------------------ REMOTE BUILD OUTPUT---------------------------------------
    ...
    ...
    
    Created manifest list REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/multiarch-helloworld:latest
    sha256:3ecbbc9f5144f358f81f7c7f1a7e28f069c98423d59c40eaff72bf184af0be02
    2020/09/14 11:34:25 Instance: 35.184.178.49 shut down successfully
    PUSH
    DONE
    -----------------------------------------------------------------------------------
    
    ID                                    CREATE_TIME                DURATION  SOURCE                                                                                      IMAGES  STATUS
    ec333452-1301-47e8-90e2-716aeb2f5650  2020-09-14T11:21:43+00:00  12M43S    gs://PROJECT_ID_cloudbuild/source/1600082502.509759-b949721a922d462c94a75da9be9f1181.tgz  -                 SUCCESS
    

Anda baru saja membangun image menggunakan file konfigurasi build dan mengirim image ke Artifact Registry di REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/multiarch-helloworld:latest.

Men-deploy image

Untuk men-deploy image multi-arch Windows ke cluster, lihat Men-deploy aplikasi Windows Server untuk mempelajari cara men-deploy image.

Penggunaan gke-windows-builder tingkat lanjut

Anda dapat menyesuaikan perilaku gke-windows-builder dengan menambahkan flag ke bagian args dari file konfigurasi build cloudbuild.yaml. Beberapa flag untuk perilaku umum dijelaskan di bagian ini, tetapi ini bukan daftar lengkap. Untuk melihat daftar lengkap flag yang didukung gke-windows-builder, jalankan perintah berikut di server Linux atau di Cloud Shell:

docker run -it us-docker.pkg.dev/gke-windows-tools/docker-repo/gke-windows-builder:latest --help

Untuk mempercepat build, Anda dapat menggunakan jenis mesin yang lebih besar untuk instance Windows:

  - --machineType
  - 'n1-standard-8'

Alih-alih membangun image untuk semua versi Windows yang didukung GKE, Anda dapat memilih versi Windows Server tertentu untuk dibangun menggunakan flag --versions:

  - --versions
  - '20H2,ltsc2019'

Jika ruang kerja Anda memiliki banyak file, build image akan lebih andal jika Anda mengonfigurasi builder untuk menyalin ruang kerja melalui Cloud Storage, bukan WinRM. Buat bucket di project Anda, seperti gs://{your project}_builder, lalu tetapkan flag --workspace-bucket:

  - --workspace-bucket
  - '{your project}_builder'

Untuk menjalankan instance builder Windows dalam project layanan VPC Bersama, gunakan flag yang mengontrol penyiapan jaringan instance ini:

  - --subnetwork-project
  - 'shared-vpc-host-project'
  - --subnetwork
  - 'host-project-subnet-shared-with-service-project'

Pembersihan

Setelah menyelesaikan tutorial, Anda dapat membersihkan resource yang dibuat agar resource tersebut berhenti menggunakan kuota dan dikenai biaya. Bagian berikut menjelaskan cara menghapus atau menonaktifkan resource ini.

Menghapus image

Untuk menghapus image multiarch-helloworld di Artifact Registry, lihat Menghapus image.

Menghapus project

Cara termudah untuk menghilangkan penagihan adalah dengan menghapus project yang Anda buat untuk tutorial.

Untuk menghapus project:

  1. Di konsol Google Cloud, buka halaman Manage resource.

    Buka Manage resource

  2. Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Langkah selanjutnya