Kubernetes-native Apps in Clustern bereitstellen

Bereitstellung von containerisierten Anwendungen in IBM Cloud® Kubernetes Service unter Verwendung von Kubernetes Techniken. Führen Sie rollierende Updates und Rollbacks ohne Ausfallzeiten für Ihre Benutzer durch.

Weitere Informationen zur Erstellung von Konfigurationsdateien finden Sie im Handbuch Best Practices für die Konfiguration.

Kubernetes-Dashboard starten

Greifen Sie auf das Kubernetes Dashboard zu, um Cluster- und Worker-Node-Informationen über die IBM Cloud Konsole oder CLI anzuzeigen.

Bevor Sie beginnen, vergewissern Sie sich, dass Sie die richtige Zugangsrolle haben. Melden Sie sich an Ihrem Konto an. If applicable, target the appropriate resource group. Legen Sie den Kontext für den Cluster fest.

Kubernetes-Dashboard über die IBM Cloud-Konsole starten

  1. Melden Sie sich bei der IBM Cloud -Konsole an.
  2. Wählen Sie in der Menüleiste das Konto aus, das Sie verwenden möchten.
  3. Klicken Sie im Menü !["Menü-Symbol](../icons/icon_hamburger.svg " "") auf "Container > Cluster ".
  4. Klicken Sie auf der Seite Cluster auf den Cluster, auf den Sie zugreifen möchten.
  5. Klicken Sie auf der Seite mit den Clusterdetails auf die Schaltfläche Kubernetes-Dashboard.

Kubernetes-Dashboard über die Befehlszeilenschnittstelle starten

Die CLI-Methode ermöglicht Automatisierung und CI/CD-Integration. Installieren Sie die CLI, bevor Sie beginnen.

  1. Holen Sie sich Ihren Kubernetes Ausweis.

    kubectl config view -o jsonpath='{.users[0].user.auth-provider.config.id-token}'
    
  2. Kopieren Sie den ID-Token-Wert aus der Ausgabe.

  3. Starten Sie den Proxy.

    kubectl proxy
    

    Beispielausgabe

    Starting to serve on 127.0.0.1:8001
    
  4. Melden Sie sich beim Dashboard an.

    1. Rufen Sie in Ihrem Browser die folgende Website auf: URL:

      http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
      
    2. Wählen Sie auf der Anmeldeseite die Authentifizierungsmethode Token aus.

    3. Fügen Sie den Wert des ID-Tokens in das Feld Token ein und klicken Sie auf SIGN IN.

Verwenden Sie CTRL+C, um den Befehl proxy zu beenden. Führen Sie kubectl proxy erneut aus, um das Dashboard neu zu starten.

Apps über das Kubernetes-Dashboard bereitstellen

Stellen Sie Anwendungen über das Dashboard bereit, indem Sie Konfigurationsdetails eingeben oder eine YAML-Datei hochladen.

Bevor Sie beginnen, öffnen Sie das Dashboard und vergewissern Sie sich, dass Sie eine Dienstzugriffsrolle haben. Melden Sie sich an Ihrem Konto an. If applicable, target the appropriate resource group. Legen Sie den Kontext für den Cluster fest.

So stellen Sie Ihre Anwendung bereit

  1. Klicken Sie auf + Erstellen.

  2. Wählen Sie eine Verteilungsmethode:

    • Wählen Sie Anwendungsdetails angeben und geben Sie die Details ein.
    • Wählen Sie YAML- oder JSON-Datei hochladen, um die Konfigurationsdatei Ihrer Anwendung hochzuladen.
  3. Klicken Sie auf Bereitstellungen, um zu überprüfen, ob Ihre Anwendung erfolgreich bereitgestellt wurde.

Apps über die CLI (Befehlszeilenschnittstelle) bereitstellen

Die CLI-Methode bietet eine präzise Steuerung und ermöglicht eine Automatisierung. Sie erstellen Konfigurationsdateien, in denen die Ressourcen Ihrer Anwendung definiert sind und die versionskontrolliert werden können.

Bevor Sie beginnen, installieren Sie die CLI und vergewissern Sie sich, dass Sie über eine Dienstzugangsrolle verfügen. Melden Sie sich an Ihrem Konto an. If applicable, target the appropriate resource group. Legen Sie den Kontext für den Cluster fest.

So stellen Sie Ihre Anwendung bereit

  1. Erstellen Sie eine Konfigurationsdatei, die je nach Bedarf Bereitstellungs-, Dienst- und Ingress-Ressourcen enthält. Erfahren Sie mehr über das Sichern der persönlichen Daten bei der Arbeit mit Kubernetes-Ressourcen.

  2. Wenden Sie die Konfigurationsdatei an.

    kubectl apply -f config.yaml
    
  3. Überprüfen Sie, ob Sie auf Ihre Anwendung zugreifen können.

Apps für bestimmte Workerknoten mithilfe von Bezeichnungen bereitstellen

Wenn Sie eine App bereitstellen, werden die App-Pods ohne Unterschied für verschiedene Workerknoten in Ihrem Cluster bereitgestellt. Manchmal möchten Sie vielleicht die Workerknoten einschränken, auf denen die App-Pods bereitgestellt werden sollen. Beispiel: Sie möchten, dass App-Pods nur für Workerknoten in einem bestimmten Worker-Pool bereitgestellt werden, weil sich diese Workerknoten auf Bare-Metal-Maschinen befinden. Fügen Sie Ihrer App-Bereitstellung eine Affinitätsregel hinzu, um die Workerknoten anzugeben, für die die App-Pods bereitgestellt werden müssen.

Vorbereitende Schritte

Gehen Sie wie folgt vor, um Apps auf bestimmten Workerknoten bereitzustellen

  1. Rufen Sie die ID des Worker-Pools ab, in dem die App-Pods bereitgestellt werden sollen.

    ibmcloud ks worker-pool ls --cluster <cluster_name_or_ID>
    
  2. Listen Sie die Workerknoten auf, die sich in dem Worker-Pool befinden, und notieren Sie sich eine der privaten IP-Adressen.

    ibmcloud ks worker ls --cluster <cluster_name_or_ID> --worker-pool <worker_pool_name_or_ID>
    
  3. Beschreiben Sie den Workerknoten. Notieren Sie sich in der Ausgabe für Labels die Bezeichnung der Worker-Pool-ID: ibm-cloud.kubernetes.io/worker-pool-id.

    In den Schritten dieses Abschnitts wird eine Worker-Pool-ID zum Bereitstellen von App-Pods für Workerknoten in diesem Worker-Pool verwendet. Zum Bereitstellen von App-Pods für bestimmte Workerknoten durch Verwendung einer anderen Bezeichnung (Label), notieren Sie sich dementsprechend diese andere Bezeichnung. Beispiel: Zum Bereitstellen von App-Pods nur für Workerknoten in einem bestimmten privaten VLAN, verwenden Sie die Bezeichnung privateVLAN=.

    kubectl describe node <worker_node_private_IP>
    

    Beispielausgabe

    NAME:               10.xxx.xx.xxx
    Roles:              <none>
    Labels:             arch=amd64
                        beta.kubernetes.io/arch=amd64
                        beta.kubernetes.io/instance-type=b3c.4x16.encrypted
                        beta.kubernetes.io/os=linux
                        failure-domain.beta.kubernetes.io/region=us-south
                        failure-domain.beta.kubernetes.io/zone=dal10
                        ibm-cloud.kubernetes.io/encrypted-docker-data=true
                        ibm-cloud.kubernetes.io/ha-worker=true
                        ibm-cloud.kubernetes.io/iaas-provider=softlayer
                        ibm-cloud.kubernetes.io/machine-type=b3c.4x16.encrypted
                        ibm-cloud.kubernetes.io/sgx-enabled=false
                        ibm-cloud.kubernetes.io/worker-pool-id=00a11aa1a11aa11a1111a1111aaa11aa-11a11a
                        ibm-cloud.kubernetes.io/worker-version=1.35_1534
                        kubernetes.io/hostname=10.xxx.xx.xxx
                        privateVLAN=1234567
                        publicVLAN=7654321
    Annotations:        node.alpha.kubernetes.io/ttl=0
    ...
    
  4. Hinzufügen einer Affinitätsregel für das Worker-Pool-ID-Label für die App-Bereitstellung.

    YAML-Beispieldatei

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: with-node-affinity
    spec:
      template:
        spec:
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                - matchExpressions:
                  - key: ibm-cloud.kubernetes.io/worker-pool-id
                    operator: In
                    values:
                    - <worker_pool_ID>
    ...
    

    Im Abschnitt Affinität der YAML-Beispieldatei steht ibm-cloud.kubernetes.io/worker-pool-id für key und <worker_pool_ID> für value.

  5. Wenden Sie die aktualisierte Bereitstellungskonfigurationsdatei an.

    kubectl apply -f with-node-affinity.yaml
    
  6. Stellen Sie sicher, dass die App-Pods auf den richtigen Workerknoten bereitgestellt wurden.

    1. Listen Sie die Pods in Ihrem Cluster auf.

      kubectl get pods -o wide
      

      Beispielausgabe

      NAME                   READY     STATUS              RESTARTS   AGE       IP               NODE
      cf-py-d7b7d94db-vp8pq  1/1       Running             0          15d       172.30.xxx.xxx   10.176.48.78
      
    2. Geben Sie in der Ausgabe einen Pod für Ihre App an. Notieren Sie sich die private IP-Adresse (NODE) des Workerknotens, auf dem sich der Pod befindet.

      In der vorherigen Beispielausgabe befindet sich der App-Pod cf-py-d7b7d94db-vp8pq auf einem Workerknoten mit der IP-Adresse 10.xxx.xx.xxx.

    3. Listen Sie die Workerknoten im Worker-Pool auf, die Sie in Ihrer App-Bereitstellung angegeben haben.

      ibmcloud ks worker ls --cluster <cluster_name_or_ID> --worker-pool <worker_pool_name_or_ID>
      

      Beispielausgabe

      ID                                                 Public IP       Private IP     Machine Type      State    Status  Zone    Version
      kube-dal10-crb20b637238bb471f8b4b8b881bbb4962-w7   169.xx.xxx.xxx  10.176.48.78   b3c.4x16          normal   Ready   dal10   1.8.6_1504
      kube-dal10-crb20b637238bb471f8b4b8b881bbb4962-w8   169.xx.xxx.xxx  10.176.48.83   b3c.4x16          normal   Ready   dal10   1.8.6_1504
      kube-dal12-crb20b637238bb471f8b4b8b881bbb4962-w9   169.xx.xxx.xxx  10.176.48.69   b3c.4x16          normal   Ready   dal12   1.8.6_1504
      

      Wenn Sie eine App-Affinitätsregel basierend auf einem anderen Faktor erstellt haben, rufen Sie stattdessen diesen Wert ab. Um beispielsweise zu bestätigen, dass der App-Pod auf einem Workerknoten in einem bestimmten VLAN bereitgestellt wurde, zeigen Sie das VLAN an, in dem sich der Workerknoten befindet, indem Sie ibmcloud ks worker get --cluster <cluster_name_or_ID> --worker <worker_ID> ausführen.

    4. Vergewissern Sie sich in der Ausgabe, dass der Workerknoten mit der privaten IP-Adresse, die Sie im vorherigen Schritt angegeben haben, in diesem Worker-Pool bereitgestellt ist.

Bereitstellen einer Anwendung auf einem NVIDIA GPU-Rechner

Wenn Sie einen GPU-Maschinentyp haben, können Sie die Verarbeitungszeit beschleunigen, die für rechenintensive Workloads wie KI, maschinelles Lernen, Inferenzen usw. erforderlich ist.

Wichtige Treiberänderungen ab Kubernetes Version 1.36: IBM Cloud Kubernetes Service installiert nicht mehr NVIDIA GPU-Treiber auf Worker Nodes mit GPUs ab Kubernetes Version 1.36. Wenn Sie GPU-Workloads auf Clustern der Version 1.36 oder höher ausführen möchten, müssen Sie die Installation und den Lebenszyklus der GPU-Treiber auf Ihren eigenen Worker Nodes verwalten. Für Cluster mit der Version 1.35 oder früher sind die von IBM bereitgestellten GPU-Treiber weiterhin verfügbar. Eine Anleitung zur Migration finden Sie unter Migration auf selbstverwaltete NVIDIA GPU-Treiber.

In den nachfolgenden Abschnitten erfahren Sie, wie Sie Workloads bereitstellen, für die die GPU erforderlich ist. Sie können jedoch auch Anwendungen bereitstellen, die ihre Arbeitslasten nicht sowohl auf der GPU als auch auf der CPU verarbeiten müssen.

Mit dieser Kubernetes Demo können Sie auch mathematisch intensive Workloads wie das TensorFlow Machine-Learning-Framework ausprobieren.

Voraussetzungen

Vorbereitende Schritte

  • Erstellen Sie einen Cluster oder Worker-Pool, der einen GPU-Typ verwendet. Beachten Sie, dass das Einrichten einer Bare-Metal-Maschine mehr als einen Geschäftstag in Anspruch nehmen kann. Eine Liste der verfügbaren Versionen finden Sie unter den folgenden Links.

  • Stellen Sie sicher, dass Ihnen eine Servicezugriffsrolle zugeordnet ist, die Ihnen die entsprechende RBAC-Rolle für Kubernetes erteilt, um mit Kubernetes-Ressourcen im Cluster arbeiten zu können.

Für Kubernetes Version 1.36 und höher: Sie müssen den NVIDIA GPU-Treiber-Stack selbst installieren und verwalten. IBM Cloud Kubernetes Service bietet keine vorinstallierten GPU-Treiber mehr auf Worker Nodes. Folgen Sie der Installationsanleitung NVIDIA GPU Operator, um die erforderlichen Komponenten zu installieren:

  • NVIDIA Kernel-Treiber
  • Container-Laufzeitkomponenten (z. B. nvidia-container-toolkit)
  • Kubernetes Geräte-Plugin

Solange der Treiber nicht installiert ist, bleiben Pods, die GPUs anfordern, im Zustand Pending. Sie werden automatisch auf Running umgestellt, sobald ein kompatibler Treiber auf dem Knoten verfügbar ist.

Für Kubernetes Version 1.35 und früher: IBM-vorausgesetzte GPU-Treiber werden automatisch auf GPU-Worker-Nodes installiert. Eine zusätzliche Treiberinstallation ist nicht erforderlich.

Workload implementieren

  1. Erstellen Sie eine YAML-Datei. In diesem Beispiel verwaltet eine Job YAML batch-ähnliche Workloads, indem sie einen kurzlebigen Pod erstellt, der so lange läuft, bis der Befehl abgeschlossen und erfolgreich beendet ist.

    Für GPU-Workloads müssen Sie das Feld resources: limits: nvidia.com/gpu in der YAML des Auftrags angeben.

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: nvidia-devicequery
      labels:
        name: nvidia-devicequery
    spec:
      template:
        metadata:
          labels:
            name: nvidia-devicequery
        spec:
          containers:
          - name: nvidia-devicequery
            image: nvcr.io/nvidia/k8s/cuda-sample:devicequery-cuda11.7.1-ubuntu20.04
            imagePullPolicy: IfNotPresent
            resources:
              limits:
                nvidia.com/gpu: 2
          restartPolicy: Never
    
    Verstehen Ihrer YAML-Komponenten
    Komponente Beschreibung
    Namen für Metadaten und Bezeichnung Geben Sie einen Namen und eine Bezeichnung für den Job ein und verwenden Sie denselben Namen sowohl in den Metadaten der Datei als auch in den spec template-Metadaten. Beispiel: nvidia-devicequery.
    containers.image Geben Sie ein Image an, von dem der Container eine Instanz ausführt. In diesem Beispiel wird der Wert für die Verwendung des CUDA-Einheitenabfrageimage DockerHub festgelegt:nvcr.io/nvidia/k8s/cuda-sample:devicequery-cuda11.7.1-ubuntu20.04.
    containers.imagePullPolicy Um nur ein neues Image zu extrahieren, wenn das Image sich nicht aktuell auf dem Workerknoten befindet, geben Sie IfNotPresent an.
    resources.limits

    Für GPU-Maschinen müssen Sie eine Ressourcengrenze angeben. Das Kubernetes Device Plug-in stellt die Standard-Ressourcenanforderung so ein, dass sie dem Limit entspricht.

    • Sie müssen den Schlüssel als nvidia.com/gpu angeben.
    • Geben Sie die ganze Anzahl der von Ihnen angeforderten GPUs ein, z. B. 2. Beachten Sie, dass Container-Pods keine GPUs gemeinsam nutzen und GPUs nicht überlastet werden können. Wenn Sie zum Beispiel nur über eine Maschine des Typs mg1c.16x128 verfügen, stehen Ihnen nur zwei GPUs auf dieser Maschine zur Verfügung und es kann maximal der Wert 2 angegeben werden.
  2. Wenden Sie die YAML-Datei an. Zum Beispiel:

    kubectl apply -f nvidia-devicequery.yaml
    
  3. Überprüfen Sie den Job-Pod, indem Sie Ihre Pods nach dem Label nvidia-devicequery filtern. Stellen Sie sicher, dass der STATUS den Wert Completed aufweist.

    kubectl get pod -A -l 'name in (nvidia-devicequery)'
    

    Beispielausgabe

    NAME                  READY     STATUS      RESTARTS   AGE
    nvidia-devicequery-ppkd4      0/1       Completed   0          36s
    
  4. Beschreiben Sie den Pod, um zu sehen, wie das GPU-Einheiten-Plug-in den Pod terminiert hat.

    • In den Feldern Limits und Requests entspricht die von Ihnen angegebene Ressourcengrenze der Anforderung, die das Einheiten-Plug-in automatisch festgelegt hat.

    • Überprüfen Sie in den Ereignissen, dass der Pod dem GPU-Workerknoten zugewiesen ist.

      kubectl describe pod nvidia-devicequery-ppkd4
      

      Beispielausgabe

      NAME:           nvidia-devicequery-ppkd4
      Namespace:      default
      ...
      Limits:
          nvidia.com/gpu:  1
      Requests:
          nvidia.com/gpu:  1
      ...
      Events:
      Type    Reason                 Age   From                     Message
      ----    ------                 ----  ----                     -------
      Normal  Scheduled              1m    default-scheduler        Successfully assigned nvidia-devicequery-ppkd4 to 10.xxx.xx.xxx
      ...
      
  5. Um sicherzustellen, dass der Job die GPU zum Berechnen der Workload verwendet hat, können Sie die entsprechenden Protokolle überprüfen.

    kubectl logs nvidia-devicequery-ppkd4
    

    Beispielausgabe

    /cuda-samples/sample Starting...
    
    CUDA Device Query (Runtime API) version (CUDART static linking)
    
    Detected 1 CUDA Capable device(s)
    
    Device 0: "Tesla P100-PCIE-16GB"
    CUDA Driver Version / Runtime Version          11.4 / 11.7
    CUDA Capability Major/Minor version number:    6.0
    Total amount of global memory:                 16281 MBytes (17071734784 bytes)
    (056) Multiprocessors, (064) CUDA Cores/MP:    3584 CUDA Cores
    GPU Max Clock rate:                            1329 MHz (1.33 GHz)
    Memory Clock rate:                             715 Mhz
    Memory Bus Width:                              4096-bit
    L2 Cache Size:                                 4194304 bytes
    Maximum Texture Dimension Size (x,y,z)         1D=(131072), 2D=(131072, 65536), 3D=(16384, 16384, 16384)
    Maximum Layered 1D Texture Size, (num) layers  1D=(32768), 2048 layers
    Maximum Layered 2D Texture Size, (num) layers  2D=(32768, 32768), 2048 layers
    Total amount of constant memory:               65536 bytes
    Total amount of shared memory per block:       49152 bytes
    Total shared memory per multiprocessor:        65536 bytes
    Total number of registers available per block: 65536
    Warp size:                                     32
    Maximum number of threads per multiprocessor:  2048
    Maximum number of threads per block:           1024
    Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
    Max dimension size of a grid size    (x,y,z): (2147483647, 65535, 65535)
    Maximum memory pitch:                          2147483647 bytes
    Texture alignment:                             512 bytes
    Concurrent copy and kernel execution:          Yes with 2 copy engine(s)
    Run time limit on kernels:                     No
    Integrated GPU sharing Host Memory:            No
    Support host page-locked memory mapping:       Yes
    Alignment requirement for Surfaces:            Yes
    Device has ECC support:                        Enabled
    Device supports Unified Addressing (UVA):      Yes
    Device supports Managed Memory:                Yes
    Device supports Compute Preemption:            Yes
    Supports Cooperative Kernel Launch:            Yes
    Supports MultiDevice Co-op Kernel Launch:      Yes
    Device PCI Domain ID / Bus ID / location ID:   0 / 175 / 0
    Compute Mode:
    < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >
    
    deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 11.4, CUDA Runtime Version = 11.7, NumDevs = 1
    Result = PASS
    

    In diesem Beispiel sehen Sie, dass eine GPU zur Ausführung des Jobs verwendet wurde, da die GPU im Workerknoten terminiert wurde. Wenn der Grenzwert auf 2 gesetzt ist, werden nur 2 GPUs angezeigt.

Nachdem Sie nun eine Test-GPU-Arbeitslast bereitgestellt haben, möchten Sie Ihren Cluster vielleicht so einrichten, dass er ein Tool ausführt, das auf GPU-Verarbeitung angewiesen ist, wie z. B. IBM Maximo Visual Inspection.

Umstellung auf selbstverwaltete NVIDIA GPU-Treiber

Ausführliche Anleitungen zur Migration von IBM-bereitgestellten GPU-Treibern zu selbstverwalteten Treibern beim Upgrade auf Kubernetes Version 1.36 finden Sie unter Migration zu selbstverwalteten NVIDIA GPU-Treibern für Kubernetes 1.36.