Peta dunia

 

EN: Read in English

Dunia K5: Waktu Puncak

Pilih gerai: nodeSelector dan affinity

Anda akan belajar: cara hantar pod hanya ke node yang ada label betul.

Teks BM belum disemak oleh penutur asli.

Disemak dengan Kubernetes 1.37 pada 31 Okt 2026

Masalahnya

Anda di sini: kluster kind-dev namespace default
Pod fast dicipta, tapi selepas 5 saat ia masih Pending, 0 daripada 1 sedia. Output terminal: $ kubectl apply -f fast.yaml pod/fast created $ sleep 5 $ kubectl get pod fast NAME READY STATUS RESTARTS AGE fast 0/1 Pending 0 5s

Pod (dulang) fast kata Pending. Ia tak pernah bermula. Apa yang ia tunggu?

Tengok

fast.yaml bawa papan tanda. nodeSelector: Papan tanda pada pod: "hanya node dengan label ini". kata: “hanya node (gerai) dengan label ini.”

spec:
  nodeSelector:
    disk: ssd

Gerai mana boleh terima pod fast?

Pilih satu jawapan.

Cuba

Letak setiap pod di atas gerai. Baca papan tanda dulu.

Tekan satu dulang, kemudian tekan satu gerai. Atau seret dulang itu.

Dulang menunggu

  • stall-a
    disk=ssd
    CPU 0 daripada 2
    Memori 0Mi daripada 4Gi
    • stall-b
      disk=hdd
      CPU 0 daripada 2
      Memori 0Mi daripada 4Gi
      • Pending

        Dulang yang tak muat di mana-mana gerai menunggu di sini.

        Semak

        Anda di sini: kluster kind-dev namespace default
        Event FailedScheduling: 0 daripada 3 node tersedia. 1 ada taint yang tak dibenarkan, 2 tak sepadan dengan node affinity atau selector pod. Output terminal: $ kubectl apply -f fast.yaml pod/fast created $ sleep 5 $ kubectl get events --field-selector reason=FailedScheduling -o jsonpath={.items[0].message} 0/3 nodes are available: 1 node(s) had untolerated taint(s), 2 node(s) didn't match Pod's node affinity/selector. preemption: 0/3 nodes are available: 3 Preemption is not helpful for scheduling.

        Itu kata-kata sebenar scheduler. Dalam bahasa mudah: satu gerai berkunci. Dua ada label salah. Tiada gerai bertanda disk=ssd.

        Cuba

        Beri gerai dev-worker2 papan tanda itu. Pod yang menunggu patut masuk.

        kubectl label nodes dev-worker2 disk=ssd
        Anda di sini: kluster kind-dev namespace default
        Gerai: 3. Dulang: 0 (0 sedia). Menunggu gerai: 1.
        dev-control-planeBukaPengurus

        Tiada dulang di sini.

        dev-workerBuka

        Tiada dulang di sini.

        dev-worker2Buka

        Tiada dulang di sini.

        Menunggu gerai
        • fastPending
        Masa: +0s (dipercepat)

        Tengok

        node affinity: Senarai hajat untuk node: syarat wajib dan syarat pilihan. ialah senarai hajat: syarat wajib (required) dan syarat pilihan (preferred). Pod fast perlu ssd. Ia suka zon front. Asingkan kedua-duanya.

        Seret kad ke dalam kotak. Atau ketik kad, kemudian ketik kotak.

            Dalam YAML, dua senarai itu nampak begini:

            affinity:
              nodeAffinity:
                requiredDuringSchedulingIgnoredDuringExecution:
                  nodeSelectorTerms:
                    - matchExpressions:
                        - { key: disk, operator: In, values: [ssd] }
                preferredDuringSchedulingIgnoredDuringExecution:
                  - weight: 50
                    preference:
                      matchExpressions:
                        - { key: zone, operator: In, values: [front] }

            Teka

            Pod fast berjalan di dev-worker2. Sekarang anda buang label itu: kubectl label nodes dev-worker2 disk-. Apa jadi pada pod itu?

            Pilih satu jawapan.

            Anda berjaya!

            Kini anda boleh hantar pod ke gerai yang betul dengan label.

            Nak tahu lebih (pilihan)

            kubectl get nodes --show-labels senaraikan label setiap gerai. Label terbina termasuk kubernetes.io/hostname dan, dalam cloud, topology.kubernetes.io/zone. Pod affinity letak pod dekat pod lain. Anti-affinity jauhkan mereka.

            Latihan sebenar (pilihan): guna kluster kind untuk dibuang. Labelkan satu pekerja, kemudian apply pod dengan nodeSelector.