IBM Cloud Docs
Kubernetes ネイティブ・アプリをクラスターにデプロイする

Kubernetes ネイティブ・アプリをクラスターにデプロイする

IBM Cloud® Kubernetes Service で Kubernetes の手法を使用して、アプリをコンテナーにデプロイし、それらのアプリが稼働中であることを確認できます。 例えば、ダウン時間なしでローリング更新とロールバックを実行できます。

アプリケーションのコンフィギュレーション・ファイルの作成についての詳細は、 コンフィギュレーションのベスト・プラクティスを参照してください。

Kubernetes ダッシュボードの起動

ローカル・システムで Kubernetes ダッシュボードを開くと、クラスターとそのすべてのワーカー・ノードに関する情報が表示されます。 IBM Cloud コンソールでは、便利なワンクリック・ボタンでダッシュボードにアクセスできます。 CLI を使用すると、ダッシュボードにアクセスしたり、CI/CD パイプラインなどの自動化プロセスのステップを使用したりできます。

クラスター内のリソースやユーザーが多すぎて Kubernetes ダッシュボードが少し遅くなっていますか? クラスター管理者は kubernetes-dashboard を実行して kubectl -n kube-system scale deploy kubernetes-dashboard --replicas=3 デプロイメントをスケーリングできます。

個々のアプリ・ポッドのログを確認するには、kubectl logs <pod name> を実行します。 Kubernetes ダッシュボードを使用してポッドのログのストリーミングをしないでください。Kubernetes ダッシュボードへのアクセスが中断される可能性があります。

開始前に

クラスターの Kubernetes ダッシュボードを起動するために、デフォルトのポートを使用するか、独自のポートを設定できます。

IBM Cloud コンソールからの Kubernetes ダッシュボードの起動

  1. IBM Cloud コンソール にログインします。
  2. メニュー・バーから、使用するアカウントを選択します。
  3. メニューからメニューアイコン をクリックし 、Containers(コンテナ) > Clusters(クラスタ) の順にクリックします。
  4. **「クラスター」**ページで、アクセスするクラスターをクリックします。
  5. クラスターの詳細ページで、**「Kubernetes Dashboard」**ボタンをクリックします。

CLI からの Kubernetes ダッシュボードの起動

始めに、CLI をインストールします。

  1. Kubernetes の資格情報を取得します。

    kubectl config view -o jsonpath='{.users[0].user.auth-provider.config.id-token}'
    
  2. 出力に示された id-token 値をコピーします。

  3. デフォルトのポート番号でプロキシーを設定します。

    kubectl proxy
    

    出力例

    Starting to serve on 127.0.0.1:8001
    
  4. ダッシュボードにサインインします。

    1. ブラウザーで、次の URL に移動します。

      http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
      
    2. サインオン・ページで、トークン認証方式を選択します。

    3. 次に、先ほどコピーした id-token 値を Token フィールドに貼り付けて、**「SIGN IN」**をクリックします。

Kubernetes ダッシュボードでの作業が完了したら、CTRL+C を使用して proxy コマンドを終了します。 終了した後は、Kubernetes ダッシュボードを使用できなくなります。 Kubernetes ダッシュボードを再始動するには、proxy コマンドを実行します。

次に、ダッシュボードから構成ファイルを実行できます。.

Kubernetes ダッシュボードでアプリをデプロイする方法

Kubernetes ダッシュボードを使用してアプリをクラスターにデプロイすると、デプロイメント・リソースが、クラスター内にポッドを自動的に作成し、更新および管理します。 ダッシュボードの使い方の詳細については、 Kubernetes のドキュメントをご覧ください。

クラスター内のリソースやユーザーが多すぎて Kubernetes ダッシュボードが少し遅くなっていますか? クラスター管理者は kubernetes-dashboard を実行して kubectl -n kube-system scale deploy kubernetes-dashboard --replicas=3 デプロイメントをスケーリングできます。

開始前に

アプリをデプロイするには、以下のようにします。

  1. Kubernetes ダッシュボードを開き、**「+ 作成」**をクリックします。

  2. 2 つの方法のいずれかでアプリの詳細を入力します。

    • アプリの詳細を指定 」を選択し、詳細を入力します。
    • Upload a YAML or JSON fileを選択して、アプリ 設定ファイルをアップロードします。

    構成ファイルのヘルプが必要な場合は、 この YAML ファイルの例を確認してください。 この例では、コンテナーは米国南部リージョンの ibmliberty イメージからデプロイされます。 Kubernetes リソースを処理する際の個人情報の保護の詳細を確認してください。

  3. 以下のいずれかの方法でアプリを正常にデプロイしたことを確認します。

    • Kubernetes ダッシュボードで、**「デプロイメント」**をクリックします。 正常なデプロイメントのリストが表示されます。
    • アプリが公開されている場合は、IBM Cloud® Kubernetes Service ダッシュボードのクラスター概要ページにナビゲートします。 クラスター概要セクションにあるサブドメインをコピーし、ブラウザーに貼り付けてアプリを表示します。

CLI でアプリをデプロイする方法

クラスターを作成したら、Kubernetes CLI を使用してそのクラスターにアプリをデプロイできます。

開始前に

アプリをデプロイするには、以下のようにします。

  1. Kubernetes、ベストプラクティスに基づいてコンフィギュレーションファイルを作成する。 基本的に、構成ファイルには、Kubernetes で作成する各リソースの構成の詳細情報が格納されます。 スクリプトに以下のセクションを 1 つ以上追加できます。

    • デプロイメント :ポッドとレプリカセットの作成を定義する。 1 つのポッドにコンテナー化アプリを 1 つ組み込み、レプリカ・セットによってポッドの複数インスタンスを制御します。

    • サービス :ワーカーノードまたはロードバランサーのパブリックIPアドレス、またはパブリックIngressルートを使用して、Podへのフロントエンドアクセスを提供します。

    • Ingress :ロードバランサーの種類を指定します。

    Kubernetes リソースを処理する際の個人情報の保護の詳細を確認してください。

  2. クラスターのコンテキストで構成ファイルを実行します。

    kubectl apply -f config.yaml
    
  3. ノード・ポート・サービス、ロード・バランサー・サービス、または Ingress を使用して、アプリをだれでも利用できるようにした場合は、アプリにアクセスできることを確認します。

ラベルを使用した特定のワーカー・ノードへのアプリのデプロイ

アプリをデプロイすると、アプリ・ポッドが、クラスター内のさまざまなワーカー・ノードに無差別にデプロイされます。 場合によっては、アプリ・ポッドのデプロイ先のワーカー・ノードを制限する必要があります。 例えば、特定のワーカー・プールのワーカー・ノードがベアメタル・マシン上にあるため、これらのワーカー・ノードにのみアプリ・ポッドがデプロイされるようにしたいとします。 アプリ・ポッドをデプロイするワーカー・ノードを指定するには、アプリのデプロイメントにアフィニティー・ルールを追加します。

開始前に

特定のワーカー・ノードにアプリをデプロイするには、以下のようにします。

  1. アプリ・ポッドをデプロイするワーカー・プールの ID を取得します。

    ibmcloud ks worker-pool ls --cluster <cluster_name_or_ID>
    
  2. ワーカー・プールにあるワーカー・ノードをリストし、プライベート IP アドレスの 1 つをメモします。

    ibmcloud ks worker ls --cluster <cluster_name_or_ID> --worker-pool <worker_pool_name_or_ID>
    
  3. ワーカー・ノードの説明を表示します。 Labels 出力で、ワーカー・プール ID ラベル ibm-cloud.kubernetes.io/worker-pool-id をメモします。

    このトピックで示す手順では、ワーカー・プール ID を使用して、そのワーカー・プール内のワーカー・ノードにのみアプリ・ポッドをデプロイします。 別のラベルを使用して特定のワーカー・ノードにアプリ・ポッドをデプロイするには、代わりにそのラベルをメモしてください。 例えば、特定のプライベート VLAN 上にあるワーカー・ノードにのみアプリ・ポッドをデプロイするには、privateVLAN= ラベルを使用します。

    kubectl describe node <worker_node_private_IP>
    

    出力例

    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.32_1534
                        kubernetes.io/hostname=10.xxx.xx.xxx
                        privateVLAN=1234567
                        publicVLAN=7654321
    Annotations:        node.alpha.kubernetes.io/ttl=0
    ...
    
  4. ワーカー プール ID ラベルの アフィニティ ルールをアプリのデプロイメントに追加します

    YAML の例

    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>
    ...
    

    YAML の例のアフィニティー (affinity) セクションでは、ibm-cloud.kubernetes.io/worker-pool-idkey<worker_pool_ID>value です。

  5. 更新したデプロイメント構成ファイルを適用します。

    kubectl apply -f with-node-affinity.yaml
    
  6. アプリ・ポッドが、正しいワーカー・ノードにデプロイされたことを確認します。

    1. クラスター内のポッドをリストします。

      kubectl get pods -o wide
      

      出力例

      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. 出力で、アプリのポッドを確認します。 ポッドがあるワーカー・ノードの NODE プライベート IP アドレスをメモします。

      前述の出力例で、アプリ・ポッド cf-py-d7b7d94db-vp8pq は、IP アドレス 10.xxx.xx.xxx のワーカー・ノード上にあります。

    3. アプリのデプロイメントに指定したワーカー・プール内にあるワーカー・ノードをリストします。

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

      出力例

      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
      

      別の要因に基づいてアプリのアフィニティー・ルールを作成した場合は、代わりにその値を取得してください。 例えば、アプリ・ポッドが特定の VLAN 上のワーカー・ノードにデプロイされたことを確認するには、ibmcloud ks worker get --cluster <cluster_name_or_ID> --worker <worker_ID> を実行して、そのワーカー・ノードが存在する VLAN を表示します。

    4. 出力で、前のステップで指定したプライベート IP アドレスを持つワーカー・ノードがこのワーカー・プールにデプロイされていることを確認します。

NVIDIA GPUマシンにアプリをデプロイする

GPU マシン・タイプを使用している場合は、AI、機械学習、推論などの計算主体のワークロードに必要な処理時間を短縮できます。

IBM Cloud Kubernetes Serviceでは、必要な GPU ドライバーが自動的にインストールされます。

以下のステップは、GPU を必要とするワークロードをデプロイする方法を示しています。 しかし、GPUとCPUの両方でワークロードを処理する必要のないアプリをデプロイすることもできます。

また、 この Kubernetes デモを使用して、 TensorFlow 機械学習フレームワークなどの数学的に負荷の高いワークロードを試すこともできます。

前提条件

開始前に

  • GPU フレーバーを使用する クラスター またはワーカー・プールを作成します。 ベアメタル・マシンのセットアップは、完了するまでに 1 営業日以上かかることがあることに留意してください。 使用可能なフレーバーのリストについては、以下のリンクを参照してください。

  • クラスター内の Kubernetes リソースを処理できる適切な Kubernetes RBAC 役割を付与する、サービス・アクセス役割が自分に割り当てられていることを確認します。

ワークロードのデプロイ

  1. YAML ファイルを作成します。 この例では、 Job YAMLは、コマンドが完了し正常に終了するまで実行される短命のポッドを作ることで、バッチ的なワークロードを管理します。

    GPU ワークロードの場合、ジョブ YAML で resources: limits: nvidia.com/gpu フィールドを指定する必要があります。

    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
    
    YAMLコンポーネントを理解する
    コンポーネント 説明
    メタデータとラベルの名前 ジョブの名前とラベルを入力し、ファイルのメタデータと spec template メタデータの両方で同じ名前を使用します。 例えば、nvidia-devicequery です。
    containers.image 実行中インスタンスとなっているコンテナーが属するイメージを指定します。 この例では、 DockerHub CUDA デバイス照会イメージ nvcr.io/nvidia/k8s/cuda-sample:devicequery-cuda11.7.1-ubuntu20.04 を使用するように値が設定されています。
    containers.imagePullPolicy イメージが現在ワーカー・ノード上にない場合にのみ新規イメージをプルする場合は、IfNotPresent を指定します。
    resources.limits

    GPU マシンの場合は、リソース制限を指定する必要があります。 Kubernetes Device Plug-inは、デフォルトのリソース要求を制限に合うように設定する。

    • nvidia.com/gpu のようにキーを指定する必要があります。
    • 2 のように、ご要望のGPU数全体を入力してください。 コンテナー・ポッドは GPU を共有せず、GPU はオーバーコミットできないことに注意してください。 例えば、mg1c.16x128 マシンが 1 台のみの場合、そのマシンには GPU が 2 つしかないため、指定できるのは最大で 2 つです。
  2. YAML ファイルを適用します。 以下に例を示します。

    kubectl apply -f nvidia-devicequery.yaml
    
  3. nvidia-devicequery ラベルでポッドをフィルタリングして、ジョブポッドを確認します。 STATUSCompleted であることを確認します。

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

    出力例

    NAME                  READY     STATUS      RESTARTS   AGE
    nvidia-devicequery-ppkd4      0/1       Completed   0          36s
    
  4. ポッドに describe を実行して、GPU デバイス・プラグインがポッドをどのようにスケジュールしたかを確認します。

    • Limits フィールドと Requests フィールドで、指定したリソース制限とデバイス・プラグインが自動的に設定した要求とが一致していることを確認します。

    • イベントで、ポッドが GPU ワーカー・ノードに割り当てられていることを確認します。

      kubectl describe pod nvidia-devicequery-ppkd4
      

      出力例

      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. ジョブが GPU を使用してそのワークロードの計算を実行したことを検証するには、ログを確認します。

    kubectl logs nvidia-devicequery-ppkd4
    

    出力例

    /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
    

    この例では、GPU がワーカー・ノードでスケジュールされているため、GPU を使用してジョブが実行されました。 制限が 2 に設定されている場合は、2 個の GPU のみが表示されます。

テストGPUワークロードをデプロイしたので、次のようなGPU処理に依存するツールを実行するようにクラスタをセットアップしたくなるかもしれません。 IBM Maximo Visual Inspection.