全部产品
Search
文档中心

Container Service for Kubernetes:Menyebar dan menjalankan beban kerja GPU

更新时间:Nov 21, 2025

Setelah mengaktifkan mode Smart Hosting pada kluster, Anda dapat menggunakan kelompok node terkelola untuk menskalakan sumber daya GPU secara dinamis. Hal ini secara signifikan mengurangi biaya untuk beban kerja GPU dengan lalu lintas yang fluktuatif, seperti inferensi online.

Penerapan

Langkah 1: Buat kelompok node terkelola dengan tipe instans GPU

Buat kelompok node terpisah untuk beban kerja GPU. Saat Anda mengirimkan beban kerja yang memerlukan sumber daya GPU, sistem akan secara otomatis membuat node GPU berdasarkan kebutuhan tersebut. Node tersebut akan dilepas secara otomatis saat tidak digunakan dan memenuhi kondisi skala-masuk, sehingga Anda hanya dikenai biaya atas sumber daya yang benar-benar digunakan.

  1. Klik Create Node Pool dan konfigurasikan parameter.

    Parameter utama dijelaskan di bawah ini. Untuk informasi selengkapnya tentang parameter, lihat Create a node pool.

    Item Konfigurasi

    Deskripsi

    Hosting Configuration

    Pilih Smart Hosting.

    VSwitch

    Saat kelompok node melakukan penskalaan, node diperluas atau dikurangi di zona vSwitch yang dipilih berdasarkan Scaling Policy. Untuk ketersediaan tinggi, pilih dua atau lebih vSwitch di zona yang berbeda.

    Konfigurasi terkait instans

    Atur Instance Configuration Method menjadi Specify Instance Type.

    • Architecture: Elastic GPU Service.

    • Instance Type: Pilih instance family yang sesuai sesuai kebutuhan, misalnya ecs.gn7i-c8g1.2xlarge (NVIDIA A10). Untuk meningkatkan tingkat keberhasilan skala keluar, pilih beberapa tipe instans.

    Taints

    Untuk mencegah beban kerja non-GPU dijadwalkan ke node GPU yang lebih mahal, gunakan taint untuk isolasi logis.

    • Key: nvidia.com/gpu

    • Value: true

    • Effect: NoSchedule

Langkah 2: Konfigurasikan permintaan sumber daya dan toleransi taint untuk beban kerja GPU

Untuk memastikan aplikasi Anda dapat dijadwalkan ke kelompok node dan memicu pembuatan otomatis node GPU, Anda harus menentukan kebutuhan sumber daya GPU serta toleransi terhadap taint node dalam konfigurasi YAML.

  • Konfigurasikan permintaan sumber daya GPU: Tentukan sumber daya GPU yang dibutuhkan dalam bidang resources kontainer.

    # ...
    spec:
      containers:
      - name: gpu-automode
        resources:
          limits:
            nvidia.com/gpu: 1   # Meminta 1 sumber daya kartu GPU
    # ...
    
  • Konfigurasikan toleransi taint: Tambahkan bidang tolerations untuk mencocokkan taint kelompok node. Hal ini memungkinkan Pod dijadwalkan ke node dengan taint tersebut.

    # ...
    spec:
       tolerations:
        - key: "nvidia.com/gpu"  # Cocokkan Key dari taint yang ditetapkan untuk kelompok node
          operator: "Equal"
          value: "true"          # Cocokkan Value dari taint yang ditetapkan untuk kelompok node
          effect: "NoSchedule"   # Cocokkan Effect dari taint yang ditetapkan untuk kelompok node
    # ...

Langkah 3: Sebarkan beban kerja GPU dan verifikasi skalabilitas elastis

Bagian ini menggunakan aplikasi Stable Diffusion Web UI sebagai contoh untuk menunjukkan proses penyebaran dan memverifikasi skalabilitas elastis.

  1. Buat dan sebarkan beban kerja.

    Klik untuk melihat contoh

    1. Buat file bernama stable-diffusion.yaml.

      File YAML ini berisi dua bagian:

      • Deployment: Mendefinisikan beban kerja Stable Diffusion. Pod meminta satu GPU NVIDIA dan dikonfigurasi dengan toleransi taint yang sesuai.

      • Service: Membuat layanan LoadBalancer untuk mengekspos beban kerja melalui alamat IP publik dan meneruskan permintaan ke port 7860 kontainer.

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        labels:
          app: stable-diffusion
        name: stable-diffusion
        namespace: default
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: stable-diffusion
        template:
          metadata:
            labels:
              app: stable-diffusion
          spec:
            containers:
            - args:
              - --listen
              command:
              - python3
              - launch.py
              image: yunqi-registry.cn-shanghai.cr.aliyuncs.com/lab/stable-diffusion:v1.0.0-gpu
              imagePullPolicy: IfNotPresent
              name: stable-diffusion
              ports:
              - containerPort: 7860
                protocol: TCP
              readinessProbe:
                tcpSocket:
                  port: 7860
              resources:
                limits:
                  # Meminta 1 sumber daya kartu GPU
                  nvidia.com/gpu: 1
                requests:
                  cpu: "6"
                  memory: 12Gi  
            # Deklarasikan toleransi taint untuk memastikan Pod dapat dijadwalkan ke kelompok node yang sesuai
            tolerations:
            - key: "nvidia.com/gpu"
              operator: "Equal"
              value: "true"
              effect: "NoSchedule"   
      ---
      apiVersion: v1
      kind: Service
      metadata:
        annotations:
          # Menentukan bahwa titik akhir LoadBalancer adalah alamat IP publik
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: internet
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-instance-charge-type: PayByCLCU
        name: stable-diffusion-svc
        namespace: default
      spec:
        externalTrafficPolicy: Local
        ports:
        - port: 7860
          protocol: TCP
          targetPort: 7860
         # Asosiasikan dengan Pod yang memiliki label app=stable-diffusion
        selector:
          app: stable-diffusion
         # Buat layanan LoadBalancer
        type: LoadBalancer
    2. Sebarkan beban kerja.

      kubectl apply -f stable-diffusion.yaml
  2. Verifikasi skala keluar otomatis node.

    Setelah penyebaran, Pod masuk ke status Pending karena sumber daya GPU belum tersedia.

    1. Periksa status Pod.

      kubectl get pod -l app=stable-diffusion
    2. Periksa event Pod.

      kubectl describe pod -l app=stable-diffusion

      Di bagian Events, pertama kali muncul event FailedScheduling, diikuti oleh event ProvisionNode. Hal ini menunjukkan bahwa skala keluar telah dipicu.

      ......
      Events:
        Type     Reason            Age                From               Message
        ----     ------            ----               ----               -------
        Warning  FailedScheduling  15m                default-scheduler  0/3 nodes are available: 1 node(s) had untolerated taint {node.kubernetes.io/not-ready: }, 2 Insufficient cpu, 2 Insufficient memory, 2 Insufficient nvidia.com/gpu. preemption: 0/3 nodes are available: 3 Preemption is not helpful for scheduling., ,
        Normal   ProvisionNode     16m                GOATScaler         Provision node asa-2ze2h0f4m5ctpd8kn4f1 in Zone: cn-beijing-k with InstanceType: ecs.gn7i-c8g1.2xlarge, Triggered time 2025-11-19 02:58:01.096
        Normal   AllocIPSucceed    12m                terway-daemon      Alloc IP 10.XX.XX.141/16 took 4.764400743s
        Normal   Pulling           12m                kubelet            Pulling image "yunqi-registry.cn-shanghai.cr.aliyuncs.com/lab/stable-diffusion:v1.0.0-gpu"
        Normal   Pulled            3m48s              kubelet            Successfully pulled image "yunqi-registry.cn-shanghai.cr.aliyuncs.com/lab/stable-diffusion:v1.0.0-gpu" in 8m47.675s (8m47.675s including waiting). Image size: 11421866941 bytes.
        Normal   Created           3m42s              kubelet            Created container: stable-diffusion
        Normal   Started           3m24s              kubelet            Started container stable-diffusion
    3. Ambil nama node tempat Pod berjalan.

      # Simpan nama node tempat Pod berjalan ke variabel NODE_NAME
      NODE_NAME=$(kubectl get pod -l app=stable-diffusion -o jsonpath='{.items[0].spec.nodeName}')
      
      # Cetak nama node
      echo "Stable Diffusion berjalan di node: $NODE_NAME"
      
      # Lihat detail node untuk memastikan node berada dalam status Ready
      kubectl get node $NODE_NAME
  3. Akses Stable Diffusion.
    Tunggu beberapa menit hingga node baru bergabung ke kluster dan Pod mulai berjalan. Setelah itu, Anda dapat mengakses aplikasi melalui Internet.

    1. Jalankan perintah berikut untuk mengambil alamat IP publik (EXTERNAL-IP) layanan.

      kubectl get svc stable-diffusion-svc

      Dalam keluaran, temukan EXTERNAL-IP.

      NAME                   TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
      stable-diffusion-svc   LoadBalancer   192.XXX.XX.196   8.XXX.XX.68   7860:31302/TCP   18m
    2. Buka browser, lalu arahkan ke http://<EXTERNAL-IP>:7860.

      Jika halaman Stable Diffusion Web UI berhasil dimuat, berarti beban kerja sedang berjalan di node GPU.

  4. Verifikasi skala-masuk otomatis node (pemicu manual).
    Untuk memverifikasi kemampuan skala-masuk otomatis, hapus deployment secara manual agar node menjadi idle.

    1. Hapus deployment dan layanan yang telah Anda buat.

      # Hapus deployment
      kubectl delete deployment stable-diffusion
      
      # Hapus layanan
      kubectl delete service stable-diffusion-svc
    2. Amati skala-masuk node.

      Komponen penskalaan node secara otomatis menghapus node dari kluster untuk menghemat biaya setelah delay pemicu skala-masuk tercapai. Delay default adalah 3 menit dalam mode Smart Hosting. Gunakan nama node yang telah Anda peroleh sebelumnya untuk mengkueri kembali node tersebut.

      kubectl get node $NODE_NAME

      Keluaran yang diharapkan menunjukkan bahwa node tidak ditemukan. Hal ini mengonfirmasi bahwa node telah secara otomatis diskala-masuk dan dilepas sesuai harapan.

      Error from server (NotFound): nodes "<nodeName>" not found