Men-deploy aplikasi Windows Server


Di halaman ini, Anda akan mempelajari cara men-deploy aplikasi Windows Server stateless di cluster Google Kubernetes Engine (GKE), yang dapat bersifat publik atau pribadi. Anda juga dapat mempelajari cara men-deploy aplikasi Windows stateful.

Sebelum memulai

Sebelum memulai, pastikan Anda telah melakukan tugas berikut:

  • Mengaktifkan Artifact Registry API dan Google Kubernetes Engine API.
  • Aktifkan API
  • Jika Anda ingin menggunakan Google Cloud CLI untuk tugas ini, instal lalu initialize gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan gcloud components update.

Men-deploy aplikasi Windows Server ke cluster

Untuk men-deploy aplikasi Windows Server ke cluster publik GKE, Anda harus melakukan tugas-tugas berikut:

  1. Membuat cluster.
  2. Membuat file manifes Deployment.
  3. Membuat dan mengekspos Deployment.
  4. Memverifikasi bahwa Pod berjalan.

Membuat cluster

Jika Anda sudah memiliki cluster GKE yang menggunakan node pool Windows Server, lanjutkan ke langkah berikutnya. Jika tidak, buat cluster menggunakan node pool Windows Server

Membuat file manifes Deployment

Node Windows Server diberi taint menggunakan key-value pair berikut: node.kubernetes.io/os=windows:NoSchedule.

Taint ini memastikan bahwa penjadwal GKE tidak mencoba menjalankan container Linux pada node Windows Server. Untuk menjadwalkan container Windows Server di node Windows Server, file manifes Anda harus menyertakan pemilih node ini:

nodeSelector:
 kubernetes.io/os: windows

Webhook penerimaan yang berjalan di cluster akan memeriksa workload baru untuk mengetahui keberadaan pemilih node Windows ini dan jika ditemukan, akan menerapkan toleransi berikut ke workload yang memungkinkannya berjalan pada node Windows Server yang telah diberi taint:

tolerations:
- effect: NoSchedule
  key: node.kubernetes.io/os
  operator: Equal
  value: windows

Dalam beberapa kasus, Anda mungkin perlu menyertakan toleransi ini secara eksplisit dalam file manifes. Misalnya, jika Anda men-deploy DaemonSet dengan image container multi-arch untuk dijalankan pada semua node Linux dan Windows Server dalam cluster, file manifes tidak akan menyertakan pemilih node Windows. Anda harus menyertakan toleransi untuk taint Windows secara eksplisit.

Contoh manifes file

Contoh file Deployment (iis.yaml) berikut men-deploy image IIS Microsoft ke satu Pod:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: iis
  labels:
    app: iis
spec:
  replicas: 1
  selector:
    matchLabels:
      app: iis
  template:
    metadata:
      labels:
        app: iis
    spec:
      nodeSelector:
        kubernetes.io/os: windows
      containers:
      - name: iis-server
        image: mcr.microsoft.com/windows/servercore/iis
        ports:
        - containerPort: 80

File ini ditujukan untuk cluster dengan semua workload menggunakan jenis dan versi image node Windows Server yang sama. Untuk mengetahui detail tentang cara menggunakan image node campuran, lihat bagian Menggunakan image node campuran.

Membuat dan mengekspos Deployment

Membuat dan mengekspos file Deployment yang sudah Anda buat di langkah sebelumnya sebagai Layanan Kubernetes dengan Deployment load balancer eksternal.

  1. Untuk membuat resource Deployment, jalankan perintah berikut:

    kubectl apply -f iis.yaml
    
  2. Untuk mengekspos Deployment sebagai load balancer eksternal, jalankan perintah berikut:

    kubectl expose deployment iis \
        --type=LoadBalancer \
        --name=iis
    

Memverifikasi bahwa Pod sedang berjalan

Pastikan Pod berfungsi dengan cara memvalidasinya.

  1. Periksa status Pod menggunakan kubectl:

    kubectl get pods
    
  2. Tunggu hingga output yang ditampilkan menunjukkan bahwa Pod memiliki Running sebagai statusnya:

    NAME                   READY     STATUS    RESTARTS   AGE
    iis-5c997657fb-w95dl   1/1       Running   0          28s
    
  3. Dapatkan status layanan, dan tunggu hingga kolom EXTERNAL-IP terisi:

    kubectl get service iis
    

    Anda akan melihat output berikut:

    NAME   TYPE           CLUSTER-IP    EXTERNAL-IP      PORT(S)        AGE
    iis    LoadBalancer   10.44.2.112   external-ip    80:32233/TCP   17s
    

Untuk melihat halaman web IIS, Anda kini dapat menggunakan browser untuk membuka http://EXTERNAL_IP.

Men-deploy aplikasi Windows Server ke cluster pribadi

Bagian ini menunjukkan cara men-deploy aplikasi container Windows Server ke cluster pribadi.

Image container Windows Server memiliki beberapa lapisan, dan lapisan dasar disediakan oleh Microsoft. Lapisan dasar disimpan sebagai lapisan asing, bukan disematkan dengan image seperti lapisan image Docker Linux. Saat image container Windows Server diambil untuk kali pertama, lapisan dasar biasanya harus didownload dari server Microsoft. Karena node cluster pribadi tidak memiliki konektivitas ke internet, lapisan container dasar Windows Server tidak dapat langsung diambil dari server Microsoft.

Untuk menggunakan cluster pribadi, Anda dapat mengonfigurasi daemon Docker guna mengizinkan pengiriman lapisan yang tidak dapat didistribusikan ke registry pribadi. Untuk mempelajari lebih lanjut, lihat Mengizinkan push artefak yang tidak dapat didistribusikan di halaman GitHub Docker.

Untuk men-deploy aplikasi Windows Server ke cluster pribadi:

  1. Membuat cluster pribadi dengan node Windows Server.
  2. Membangun image Docker aplikasi Windows Server.
  3. Men-deploy aplikasi ke cluster pribadi.
  4. Memverifikasi bahwa Pod berjalan.

Membuat cluster pribadi

Ikuti petunjuk di bagian Membuat cluster dengan node Windows Server dan Membuat cluster pribadi untuk membuat dan menambahkan node pool Windows ke cluster pribadi.

Membangun image Docker aplikasi Windows Server

  1. Untuk membangun image Docker, mulai instance Compute Engine dengan versi Windows Server tempat Anda ingin menjalankan container aplikasi, seperti Windows Server 2019 atau Windows Server versi 20H2. Selain itu, pastikan Anda memiliki konektivitas internet.

  2. Di instance Compute Engine, buka konfigurasi daemon Docker:

    cat C:\ProgramData\docker\config\daemon.json
    
  3. Konfigurasikan file daemon.json Docker agar lapisan asing dapat dikirim ke registry pribadi Anda dengan menambahkan baris berikut:

    {
      "allow-nondistributable-artifacts": ["REGISTRY_REGION-docker.pkg.dev"]
    }
    

    Dalam contoh ini, REGISTRY_REGION-docker.pkg.dev merujuk pada Artifact Registry, tempat image akan dihosting.

  4. Mulai ulang daemon Docker:

    Restart-Service docker
    
  5. Buat repositori Docker di Artifact Registry.

  6. Bangun dan beri tag image Docker untuk aplikasi Anda:

    cd C:\my-app
    
    docker build -t REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/my-app:v2 .
    

    Perintah ini akan memerintahkan Docker untuk membangun image menggunakan Dockerfile dalam direktori saat ini dan memberinya tag dengan nama, seperti us-central1-docker.pkg.dev/my-project/my-repository/my-app:v2.

  7. Kirim image Docker aplikasi ke repositori Artifact Registry di project Anda. Kumpulan konfigurasi allow-nondistributable-artifacts menyebabkan lapisan dasar Windows dikirim ke registry pribadi Anda.

    docker push REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/my-app:v2
    

Membuat file manifes Deployment

Berikut adalah contoh file manifes Deployment yang bernama my-app.yaml. Image dalam contoh ini adalah image yang telah Anda kirim pada langkah sebelumnya (REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/my-app:v2).

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  labels:
    app: my-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      nodeSelector:
        kubernetes.io/os: windows
      containers:
      - name: my-server
        image: REGISTRY_REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/my-app:v2
  1. Gunakan perintah get-credentials agar kubectl dapat berfungsi dengan cluster yang telah Anda buat:

    gcloud container clusters get-credentials CLUSTER_NAME
    

    Ganti CLUSTER_NAME dengan nama cluster pribadi yang telah Anda buat.

  2. Deploy aplikasi yang ditentukan dalam file my-app.yaml ke cluster pribadi Anda:

    kubectl apply -f my-app.yaml
    

Memverifikasi bahwa Pod berjalan

Mencantumkan semua Pod untuk memastikan aplikasi berjalan dengan benar:

kubectl get pods

Anda akan melihat Pod dengan status Running seperti di output berikut:

NAME                     READY   STATUS    RESTARTS   AGE
my-app-c95fc5596-c9zcb   1/1     Running   0          5m

Menggunakan image node campuran

Cluster Anda dapat berisi node pool dengan beberapa jenis Windows Server dan versi Windows Server. Cluster juga dapat menggabungkan workload Windows Server dan Linux. Bagian berikut memberikan detail tentang cara mengonfigurasi workload Anda untuk menggunakan jenis cluster ini.

Menggunakan workload dengan jenis image node Windows Server yang berbeda

Anda dapat menambahkan node pool menggunakan jenis image Windows Server yang berbeda ke cluster Anda. Pada cluster dengan jenis Windows Server campuran, Anda harus memastikan bahwa container Windows Server tidak dijadwalkan ke node Windows Server yang tidak kompatibel.

Jika Anda memiliki satu node pool LTSC Windows Server dan satu node pool SAC Windows Server, tambahkan label node gke-os-distribution ke kedua workload Anda.

Sertakan nodeSelector berikut dalam file manifes untuk workload LTSC Windows Server Anda:

nodeSelector:
   kubernetes.io/os: windows
   cloud.google.com/gke-os-distribution: windows_ltsc

Sertakan nodeSelector berikut dalam file manifes untuk workload SAC Windows Server Anda.

nodeSelector:
   kubernetes.io/os: windows
   cloud.google.com/gke-os-distribution: windows_sac

Menambahkan label ini memastikan bahwa image container LTSC Anda tidak dijadwalkan ke node SAC yang tidak kompatibel dan juga sebaliknya.

Menggunakan workload dengan versi OS Windows Server LTSC yang berbeda

Node Windows Server mendukung image OS LTSC2022 dan LTSC2019. Anda dapat menentukan versi OS Windows yang akan digunakan (LTSC2022) dengan key-value pair berikut di nodeSelector: cloud.google.com/gke-windows-os-version=2022.

Label node ini memastikan bahwa penjadwal GKE akan memilih node Server Windows yang benar untuk menjalankan workload LTSC2022 atau LTSC2019. Kedua node Windows Server termasuk dalam jenis image windows_ltsc_containerd. Nilai label node dapat berupa 2022 atau 2019. Jika label node tidak ditentukan, node LTSC2019 atau LTSC2022 dapat digunakan untuk menjadwalkan container. Untuk menjadwalkan container Windows Server hanya di node Windows Server LTSC2022, file manifes Anda harus menyertakan pemilih node ini:

nodeSelector:
   kubernetes.io/os: windows
   cloud.google.com/gke-os-distribution: windows_ltsc
   cloud.google.com/gke-windows-os-version: 2022

Menggunakan workload dengan versi Windows Server yang berbeda

Jika Anda harus menjalankan node pool Windows Server dengan beberapa versi LTSC atau SAC yang berbeda, sebaiknya buat image container sebagai image multi-arch yang dapat berjalan di semua versi Windows Server yang digunakan di cluster Anda. Label node gke-os-distribution tidak cukup untuk mencegah workload Anda dari kemungkinan dijadwalkan ke node yang tidak kompatibel.

Menggunakan workload Linux dan Windows Server dalam cluster

Tambahkan pemilih node berikut ke workload Linux Anda untuk memastikan workload tersebut selalu dijadwalkan ke node Linux:

nodeSelector:
   kubernetes.io/os: linux

Tindakan ini akan memberikan perlindungan tambahan agar workload Linux tidak dijadwalkan ke node Windows Server jika taint NoSchedule tidak sengaja dihapus dari node Windows Server.