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 リソースを処理できる適切な Kubernetes RBAC 役割を付与する、サービス・アクセス役割が自分に割り当てられていることを確認します。
- コンソールから Kubernetes ダッシュボードを起動するには、プラットフォーム・アクセス役割が割り当てられている必要があります。 サービス・アクセス役割のみが割り当てられていて、プラットフォーム・アクセス役割が割り当てられていない場合は、CLI から Kubernetes ダッシュボードを起動してください。
- アカウントにログインします。 該当する場合は、適切なリソース・グループをターゲットにします。 クラスターのコンテキストを設定します。
クラスターの Kubernetes ダッシュボードを起動するために、デフォルトのポートを使用するか、独自のポートを設定できます。
IBM Cloud コンソールからの Kubernetes ダッシュボードの起動
- IBM Cloud コンソール にログインします。
- メニュー・バーから、使用するアカウントを選択します。
- メニューから
をクリックし 、Containers(コンテナ) > Clusters(クラスタ) の順にクリックします。
- **「クラスター」**ページで、アクセスするクラスターをクリックします。
- クラスターの詳細ページで、**「Kubernetes Dashboard」**ボタンをクリックします。
CLI からの Kubernetes ダッシュボードの起動
始めに、CLI をインストールします。
-
Kubernetes の資格情報を取得します。
kubectl config view -o jsonpath='{.users[0].user.auth-provider.config.id-token}'
-
出力に示された id-token 値をコピーします。
-
デフォルトのポート番号でプロキシーを設定します。
kubectl proxy
出力例
Starting to serve on 127.0.0.1:8001
-
ダッシュボードにサインインします。
-
ブラウザーで、次の URL に移動します。
http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
-
サインオン・ページで、トークン認証方式を選択します。
-
次に、先ほどコピーした 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
デプロイメントをスケーリングできます。
開始前に
- 必要な CLI をインストールします。
- アカウントにログインします。 該当する場合は、適切なリソース・グループをターゲットにします。 クラスターのコンテキストを設定します。
- Kubernetes リソースを処理できる適切な Kubernetes RBAC 役割を付与する、サービス・アクセス役割が自分に割り当てられていることを確認します。
- コンソールから Kubernetes ダッシュボードを起動するには、プラットフォーム・アクセス役割が割り当てられている必要があります。 サービス・アクセス役割のみが割り当てられていて、プラットフォーム・アクセス役割が割り当てられていない場合は、CLI から Kubernetes ダッシュボードを起動してください。
アプリをデプロイするには、以下のようにします。
-
Kubernetes ダッシュボードを開き、**「+ 作成」**をクリックします。
-
2 つの方法のいずれかでアプリの詳細を入力します。
- アプリの詳細を指定 」を選択し、詳細を入力します。
- Upload a YAML or JSON fileを選択して、アプリ 設定ファイルをアップロードします。
構成ファイルのヘルプが必要な場合は、 この YAML ファイルの例を確認してください。 この例では、コンテナーは米国南部リージョンの ibmliberty イメージからデプロイされます。 Kubernetes リソースを処理する際の個人情報の保護の詳細を確認してください。
-
以下のいずれかの方法でアプリを正常にデプロイしたことを確認します。
- Kubernetes ダッシュボードで、**「デプロイメント」**をクリックします。 正常なデプロイメントのリストが表示されます。
- アプリが公開されている場合は、IBM Cloud® Kubernetes Service ダッシュボードのクラスター概要ページにナビゲートします。 クラスター概要セクションにあるサブドメインをコピーし、ブラウザーに貼り付けてアプリを表示します。
CLI でアプリをデプロイする方法
クラスターを作成したら、Kubernetes CLI を使用してそのクラスターにアプリをデプロイできます。
開始前に
- 必要な CLI をインストールします。
- アカウントにログインします。 該当する場合は、適切なリソース・グループをターゲットにします。 クラスターのコンテキストを設定します。
- 名前空間内の Kubernetes リソースを処理できる適切な Kubernetes RBAC 役割を付与する、サービス・アクセス役割が自分に割り当てられていることを確認します。
アプリをデプロイするには、以下のようにします。
-
Kubernetes、ベストプラクティスに基づいてコンフィギュレーションファイルを作成する。 基本的に、構成ファイルには、Kubernetes で作成する各リソースの構成の詳細情報が格納されます。 スクリプトに以下のセクションを 1 つ以上追加できます。
-
デプロイメント :ポッドとレプリカセットの作成を定義する。 1 つのポッドにコンテナー化アプリを 1 つ組み込み、レプリカ・セットによってポッドの複数インスタンスを制御します。
-
サービス :ワーカーノードまたはロードバランサーのパブリックIPアドレス、またはパブリックIngressルートを使用して、Podへのフロントエンドアクセスを提供します。
-
Ingress :ロードバランサーの種類を指定します。
Kubernetes リソースを処理する際の個人情報の保護の詳細を確認してください。
-
-
クラスターのコンテキストで構成ファイルを実行します。
kubectl apply -f config.yaml
-
ノード・ポート・サービス、ロード・バランサー・サービス、または Ingress を使用して、アプリをだれでも利用できるようにした場合は、アプリにアクセスできることを確認します。
ラベルを使用した特定のワーカー・ノードへのアプリのデプロイ
アプリをデプロイすると、アプリ・ポッドが、クラスター内のさまざまなワーカー・ノードに無差別にデプロイされます。 場合によっては、アプリ・ポッドのデプロイ先のワーカー・ノードを制限する必要があります。 例えば、特定のワーカー・プールのワーカー・ノードがベアメタル・マシン上にあるため、これらのワーカー・ノードにのみアプリ・ポッドがデプロイされるようにしたいとします。 アプリ・ポッドをデプロイするワーカー・ノードを指定するには、アプリのデプロイメントにアフィニティー・ルールを追加します。
開始前に
- アカウントにログインします。 該当する場合は、適切なリソース・グループをターゲットにします。 クラスターのコンテキストを設定します。
- オプション: アプリを実行するワーカー・プールのラベルを設定します。
特定のワーカー・ノードにアプリをデプロイするには、以下のようにします。
-
アプリ・ポッドをデプロイするワーカー・プールの ID を取得します。
ibmcloud ks worker-pool ls --cluster <cluster_name_or_ID>
-
ワーカー・プールにあるワーカー・ノードをリストし、プライベート IP アドレスの 1 つをメモします。
ibmcloud ks worker ls --cluster <cluster_name_or_ID> --worker-pool <worker_pool_name_or_ID>
-
ワーカー・ノードの説明を表示します。 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 ...
-
ワーカー プール 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-id
はkey
、<worker_pool_ID>
はvalue
です。 -
更新したデプロイメント構成ファイルを適用します。
kubectl apply -f with-node-affinity.yaml
-
アプリ・ポッドが、正しいワーカー・ノードにデプロイされたことを確認します。
-
クラスター内のポッドをリストします。
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
-
出力で、アプリのポッドを確認します。 ポッドがあるワーカー・ノードの NODE プライベート IP アドレスをメモします。
前述の出力例で、アプリ・ポッド
cf-py-d7b7d94db-vp8pq
は、IP アドレス10.xxx.xx.xxx
のワーカー・ノード上にあります。 -
アプリのデプロイメントに指定したワーカー・プール内にあるワーカー・ノードをリストします。
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 を表示します。 -
出力で、前のステップで指定したプライベート IP アドレスを持つワーカー・ノードがこのワーカー・プールにデプロイされていることを確認します。
-
NVIDIA GPUマシンにアプリをデプロイする
GPU マシン・タイプを使用している場合は、AI、機械学習、推論などの計算主体のワークロードに必要な処理時間を短縮できます。
IBM Cloud Kubernetes Serviceでは、必要な GPU ドライバーが自動的にインストールされます。
以下のステップは、GPU を必要とするワークロードをデプロイする方法を示しています。 しかし、GPUとCPUの両方でワークロードを処理する必要のないアプリをデプロイすることもできます。
また、 この Kubernetes デモを使用して、 TensorFlow 機械学習フレームワークなどの数学的に負荷の高いワークロードを試すこともできます。
前提条件
開始前に
-
GPU フレーバーを使用する クラスター またはワーカー・プールを作成します。 ベアメタル・マシンのセットアップは、完了するまでに 1 営業日以上かかることがあることに留意してください。 使用可能なフレーバーのリストについては、以下のリンクを参照してください。
-
クラスター内の Kubernetes リソースを処理できる適切な Kubernetes RBAC 役割を付与する、サービス・アクセス役割が自分に割り当てられていることを確認します。
ワークロードのデプロイ
-
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
つです。
-
YAML ファイルを適用します。 以下に例を示します。
kubectl apply -f nvidia-devicequery.yaml
-
nvidia-devicequery
ラベルでポッドをフィルタリングして、ジョブポッドを確認します。 STATUS が Completed であることを確認します。kubectl get pod -A -l 'name in (nvidia-devicequery)'
出力例
NAME READY STATUS RESTARTS AGE nvidia-devicequery-ppkd4 0/1 Completed 0 36s
-
ポッドに 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 ...
-
-
ジョブが 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.