IBM Cloud Docs
仮想プライベート・クラウド (VPC) での最初のクラスターのセットアップ

仮想プライベート・クラウド (VPC) での最初のクラスターのセットアップ

仮想プライベート・クラウド (VPC) に IBM Cloud® Kubernetes Service クラスターを作成します。

VPC上の IBM Cloud Kubernetes Service クラスタを使用すると、次世代の IBM Cloud プラットフォームで、お客様の 仮想プライベートクラウド 内にクラスタを作成することができます。 VPC は、プライベート・クラウド環境のセキュリティーとパブリック・クラウドの動的なスケーラビリティーを兼ね備えています。 VPC では、v2 API、CLI、コンソールの一部の機能を介して、この次世代の IBM Cloud Kubernetes Service インフラストラクチャー・プロバイダーを使用します。 VPC では標準クラスターしか作成できません。

対象読者

このチュートリアルは、VPC コンピュートのクラスターを IBM Cloud Kubernetes Service 内に初めて作成する管理者を対象としています。

目標

このチュートリアルのレッスンでは、仮想プライベート・クラウド (VPC) に IBM Cloud Kubernetes Service クラスターを作成します。 その後、アプリをデプロイし、ロード・バランサーを使用してそのアプリをパブリックに公開します。

取得する内容

このチュートリアルでは、以下のリソースを作成します。 チュートリアルの完了後にこれらのリソースを保持しない場合は、これらのリソースを削除するオプションのステップがあります。

  • VPC クラスター
  • クラスターにデプロイされた単純な Hello World アプリ
  • アプリを公開するための VPC ロード・バランサー

前提条件

以下の前提条件ステップを実行して、権限およびコマンド・ライン環境をセットアップします。

権限
アカウントの所有者であれば、クラスターを作成するのに必要な権限はすでに持っているので、次のステップに進むことができます。 その他の場合は、アカウント所有者に、API キーのセットアップと IBM Cloud IAM での最小限のユーザー権限の割り当てを依頼してください。
コマンド行ツール
コマンド・ラインからリソースに素早くアクセスするには、 IBM Cloud Shellを試してください。 そうしない場合は、以下のステップを実行してローカルのコマンド・ライン環境をセットアップしてください。
  1. IBM Cloud CLI (ibmcloud)、Kubernetes Service プラグイン (ibmcloud ks)、および IBM Cloud Container Registry プラグイン (ibmcloud cr) をインストールします
  2. Red Hat OpenShift (oc) CLI および Kubernetes (kubectl) CLI をインストールします
  3. VPC を操作するために、infrastructure-service プラグインをインストールします。 コマンドを実行するための接頭部は、ibmcloud is です。
    ibmcloud plugin install infrastructure-service
    
  4. Kubernetes Service プラグインを最新バージョンに更新します。
    ibmcloud plugin update kubernetes-service
    
  5. kubectl バージョンが、VPC クラスターの Kubernetes バージョンと一致していることを確認します。 このチュートリアルでは、バージョンを実行するクラスタを作成します。 1.32

VPC でのクラスターの作成

IBM Cloud Kubernetes Service 仮想プライベート・クラウド (VPC) 環境に IBM Cloud クラスターを作成します。 VPC について詳しくは、Virtual Private Cloud の概説を参照してください。

  1. VPC 環境を作成するアカウント、リソース・グループ、および IBM Cloud リージョンにログインします。 VPCは、クラスタを作成したいのと同じマルチゾーンのメトロリージョン内に設定する必要があります。 このチュートリアルでは、us-south に VPC を作成します。 サポートされるその他のリージョンについては、VPC クラスターに対応しているマルチゾーンの大都市を参照してください。 フェデレーテッドIDをお持ちの場合は、 --sso オプションを含めてください。
    ibmcloud login -r us-south [-g <resource_group>] [--sso]
    
  2. クラスター用の VPC を作成します。 詳しくは、コンソールまたは CLI で VPC を作成する方法に関する資料を参照してください。
    1. myvpc という VPC を作成し、出力の ID をメモします。 VPC によって、パブリック・クラウド内にワークロードを実行するための分離された環境が提供されます。 複数のクラスターに同じ VPC を使用できます。例えば、相互に通信する必要がある別々のマイクロサービスを別々のクラスターでホストする場合などです。 例えば、部門別にクラスターを分ける場合は、クラスターごとに VPC を作成します。

      ibmcloud is vpc-create myvpc
      
    2. VPC 用のサブネットを作成し、その ID をメモします。 VPC サブネットを作成する際は、以下の情報を考慮してください。

      • ゾーン: クラスター内のゾーンごとに VPC サブネットを 1 つ用意する必要があります。 利用可能なゾーンは、VPCを作成したメトロリージョンによって異なります。 リージョン内の使用可能なゾーンをリストするには、ibmcloud is zones を実行します。
      • IP アドレス: クラスターのワーカー・ノードおよびロード・バランサー・サービスのプライベート IP アドレスは VPC サブネットから取得されるので、256 個などの十分な数の IP アドレスが含まれるサブネットを作成してください。 後で VPC サブネットの IP アドレスの数を変更することはできません。
      • パブリック・ゲートウェイ: このチュートリアルを完了するためにパブリック・ゲートウェイを接続する必要はありません。 代わりに、VPC ロード・バランサーを使用してワークロードを安全に公開し、ワーカー・ノードをパブリック・アクセスから分離された状態に維持できます。 ワーカー・ノードがパブリック URL にアクセスする必要がある場合は、パブリック・ゲートウェイを接続することができます。
      ibmcloud is subnet-create mysubnet1 <vpc_ID> --zone us-south-1 --ipv4-address-count 256
      
  3. VPC のサブネットと同じゾーンにクラスターを作成します。 デフォルトでは、クラスターはパブリックとプライベートのクラウド・サービス・エンドポイントを備えた状態で作成されます。 お客様はパブリック・クラウド・サービス・エンドポイントを使用して Kubernetes マスターにアクセスできます。例えば、ローカル・マシンから kubectl コマンドを実行したりできます。 ワーカー・ノードはプライベート・クラウド・サービス・エンドポイントを使用してマスターと通信できます。 コマンドのオプションについて詳しくは、cluster create vpc-gen2 CLI リファレンス資料を参照してください。
    ibmcloud ks cluster create vpc-gen2 --name myvpc-cluster --zone us-south-1 --version 1.32 --flavor bx2.2x8 --workers 1 --vpc-id <vpc_ID> --subnet-id <vpc_subnet_ID>
    
  4. クラスターの状態を確認します。 クラスターのプロビジョンには数分かかることがあります。
    1. クラスターの状態normal であることを確認します。
      ibmcloud ks cluster ls --provider vpc-gen2
      
    2. Kubernetes 構成ファイルをダウンロードします。
      ibmcloud ks cluster config --cluster myvpc-cluster
      
    3. Kubernetes CLI サーバーのバージョンを調べて、クラスターで kubectl コマンドが正常に実行されることを確認します。
      kubectl version  --short
      
      出力例
      Client Version: 1.32
      Server Version: 1.32+IKS
      

プライベートに提供するアプリをデプロイする

Kubernetes デプロイメントを作成して、単一のアプリ・インスタンスをポッドとして VPC クラスター内のワーカー・ノードにデプロイします。

  1. Hello worldアプリのソースコードをユーザーホームディレクトリにコピーします。 このリポジトリーには、同じアプリのさまざまなバージョンが、Lab で始まる各フォルダーに入っています。 各バージョンに以下のファイルがあります。

    • Dockerfile: イメージのビルド定義。
    • app.js: Hello World アプリ。
    • package.json: アプリに関するメタデータ。
    git clone https://github.com/IBM/container-service-getting-started-wt.git
    
  2. Lab 1 ディレクトリーに移動します。

    cd 'container-service-getting-started-wt/Lab 1'
    
  3. 既存のレジストリー名前空間を使用するか、vpc-gen2 などの名前空間を作成します。

    ibmcloud cr namespace-list
    
    ibmcloud cr namespace-add vpc-gen2
    
  4. Lab 1 ディレクトリーのアプリ・ファイルを含む Docker イメージをビルドします。

    イメージ名には小文字の英数字または下線 (_) のみを使用してください。 コマンドの末尾にピリオド (.) をつけることを忘れないようにしてください。 このピリオドは、イメージをビルドするための Dockerfile とビルド成果物を、現行ディレクトリー内で探すよう Docker に指示するものです。

    docker build -t us.icr.io/<namespace>/hello-world:1 .
    

    ビルドが完了したら、次の正常終了のメッセージを確認してください。

    => exporting to image                                                                           0.0s
    => => exporting layers                                                                          0.0s
    => => writing image sha256:3ca1eb1d0998f738b552d4c435329edf731fe59e427555b78ba2fb54f2017906     0.0s
    => => naming to <region>.icr.io/<namespace>/hello-world:1                                       0.0s
    
  5. IBM Cloud Container Registry にログインします。

    ibmcloud cr login
    
  6. 作成した IBM Cloud Container Registry 名前空間にイメージをプッシュします。 今後、アプリの変更が必要になった場合には、この手順を繰り返して別バージョンのイメージを作成します。 : コンテナー・イメージを使用する際の個人情報の保護の詳細を確認してください。

    docker push us.icr.io/<namespace>/hello-world:1
    
  7. アプリ用のデプロイメントを作成します。 ポッドはデプロイメントを使用して管理され、コンテナー化されたアプリ・インスタンスを格納するために使用されます。 以下のコマンドでは、アプリを 1 つのポッドにデプロイします。 このチュートリアルのためにデプロイメントの名前は hello-world-deployment になっていますが、任意の名前を付けることができます。

    kubectl create deployment hello-world-deployment --image=us.icr.io/vpc-gen2/hello-world:1
    

    出力例

    deployment.apps/hello-world-deployment created
    

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

  8. デプロイメントを NodePort サービスとして公開して、アプリにアクセスできるようにします。 この VPC ワーカー・ノードはプライベート・サブネットにしか接続していないので、NodePort にはプライベート IP アドレスだけが割り当てられ、パブリック・ネットワークには公開されません。 そのプライベート・ネットワーク上で実行される他のサービスは、NodePort サービスのプライベート IP アドレスを使用してアプリにアクセスできます。

    kubectl expose deployment/hello-world-deployment --type=NodePort --name=hello-world-service --port=8080 --target-port=8080
    

    出力例

    service/hello-world-service exposed
    
    コマンド・オプションに関する情報。
    パラメーター 説明
    expose デプロイメントなどの Kubernetes リソースを Kubernetes サービスとして公開して、ユーザーが Kubernetes サービスの IP アドレスを使用してそのリソースにアクセスできるようにします。
    deployment/*<hello-world-deployment>* このサービスを使用して公開するリソース・タイプとリソースの名前。
    --name=*<hello-world-service>* サービスの名前。
    --type=NodePort 作成するサービス・タイプ。 このレッスンでは、NodePort サービスを作成します。 次のレッスンでは、LoadBalancer サービスを作成します。
    --port=*<8080>* サービスが外部ネットワーク・トラフィックを listen するポート。
    --target-port=*<8080>* アプリが listen し、サービスが着信ネットワーク・トラフィックを送信するポート。 この例では target-portport と同じですが、作成する他のアプリでは別のポートを使用することもできます。
  9. デプロイメントの作業がすべて完了したので、クラスター内からアプリをテストできます。 アプリへのアクセスに使用できるプライベート IP アドレスを形成するための詳細情報を取得します。

    1. サービスに関する情報を取得して、割り当てられた NodePort を確認します。 expose コマンドで NodePort を生成すると、30000 から 32767 の範囲でランダムに値が割り当てられます。 この例では、NodePort は 30872 です。

      kubectl describe service hello-world-service
      

      出力例

      NAME:                   hello-world-service
      Namespace:              default
      Labels:                 run=hello-world-deployment
      Selector:               run=hello-world-deployment
      Type:                   NodePort
      IP:                     10.xxx.xx.xxx
      Port:                   <unset> 8080/TCP
      NodePort:               <unset> 30872/TCP
      Endpoints:              172.30.xxx.xxx:8080
      Session Affinity:       None
      No events.
      
    2. アプリを実行するポッドをリストし、ポッド名をメモします。

      kubectl get pods
      

      出力例

      NAME                                     READY     STATUS        RESTARTS   AGE
      hello-world-deployment-d99cddb45-lmj2v   1/1       Running       0          2d
      
    3. ポッドの詳細を表示して、ポッドが実行されているワーカー・ノードを確認します。 この出力例では、ポッドを実行しているワーカー・ノードは 10.xxx.xx.xxx です。

      kubectl describe pod hello-world-deployment-d99cddb45-lmj2v
      

      出力例

      NAME:               hello-world-deployment-d99cddb45-lmj2v
      Namespace:          default
      Priority:           0
      PriorityClassName:  <none>
      Node:               10.xxx.xx.xxx/10.xxx.xx.xxx
      Start Time:         Mon, 22 Apr 20122 12:40:48 -0400
      Labels:             pod-template-hash=d99cddb45
                          run=hello-world-deployment
      Annotations:        kubernetes.io/psp=ibm-privileged-psp
      Status:             Running
      IP:                 172.30.xxx.xxx
      ...
      
  10. クラスター内からアプリに要求を行えるようにポッドにログインします。

    kubectl exec -it hello-world-deployment-d99cddb45-lmj2v /bin/sh
    
  11. 先ほど取得したワーカー・ノードのプライベート IP アドレスとノード・ポートを使用して NodePort サービスに要求を行います。

    wget -O - 10.xxx.xx.xxx:30872
    

    出力例

    Connecting to 10.xxx.xx.xxx:30872 (10.xxx.xx.xxx:30872)
    Hello world from hello-world-deployment-d99cddb45-lmj2v! Your app is up and running in a cluster!
    -                    100% |*****************************************************************************************|    88   0:00:00 ETA
    

    ポッド・セッションを閉じるには、exit と入力します。

アプリをパブリックに公開するように VPC ロード・バランサーをセットアップする

パブリック・ネットワーク上でアプリを公開するように VPC ロード・バランサーをセットアップします。

クラスター内に Kubernetes LoadBalancer サービスを作成すると、VPC のクラスター外部に VPC ロード・バランサーが自動的に作成されます。 このロード・バランサーはマルチゾーン対応であり、ワーカー・ノードで自動的に開かれるプライベート NodePort を介して、アプリに対する要求を転送します。 以下の図は、ワーカー・ノードをプライベート・サブネットにしか接続していない場合でも、ユーザーがロード・バランサーを介してアプリのサービスにアクセスできる仕組みを示しています。

クラスタのVPCロードバランシング。
VPC load balancing for a cluster

  1. クラスターに Kubernetes LoadBalancer サービスを作成して、hello world アプリをパブリックに公開します。

    kubectl expose deployment/hello-world-deployment --type=LoadBalancer --name=hw-lb-svc  --port=8080 --target-port=8080
    

    出力例

    service "hw-lb-svc" exposed
    
    コマンド・オプションに関する情報。
    パラメーター 説明
    expose デプロイメントなどの Kubernetes リソースを Kubernetes サービスとして公開して、ユーザーが Kubernetes サービスの IP アドレスを使用してそのリソースにアクセスできるようにします。
    deployment/*<hello-world-deployment>* このサービスを使用して公開するリソース・タイプとリソースの名前。
    --name=*<hello-world-service>* サービスの名前。
    --type=LoadBalancer 作成する Kubernetes サービス・タイプ。 このレッスンでは、LoadBalancer サービスを作成します。
    --port=*<8080>* サービスが外部ネットワーク・トラフィックを listen するポート。
    --target-port=*<8080>* アプリが listen し、サービスが着信ネットワーク・トラフィックを送信するポート。 この例では target-portport と同じですが、作成する他のアプリでは別のポートを使用することもできます。
  2. クラスターに Kubernetes LoadBalancer サービスが正常に作成されたことを確認します。 Kubernetes LoadBalancer サービスを作成すると、VPC ロード・バランサーが自動的に作成されます。 VPC ロード・バランサーは、CLI 出力の LoadBalancer Ingress フィールドに表示できるホスト名を、Kubernetes LoadBalancer サービスに割り当てます。 VPC ロード・バランサーが VPC にプロビジョンされるまで数分かかります。 VPCロードバランサーが準備できるまでは、ホスト名から Kubernetes LoadBalancer サービスにアクセスすることはできません。

    kubectl describe service hw-lb-svc
    

    CLI 出力の例

    NAME:                     hw-lb-svc
    Namespace:                default
    Labels:                   app=hello-world-deployment
    Annotations:              <none>
    Selector:                 app=hello-world-deployment
    Type:                     LoadBalancer
    IP:                       172.21.xxx.xxx
    LoadBalancer Ingress:     1234abcd-us-south.lb.appdomain.cloud
    Port:                     <unset> 8080/TCP
    TargetPort:               8080/TCP
    NodePort:                 <unset> 32040/TCP
    Endpoints:
    Session Affinity:         None
    External Traffic Policy:  Cluster
    Events:
        Type    Reason                Age   From                Message
        ----    ------                ----  ----                -------
        Normal  EnsuringLoadBalancer  1m    service-controller  Ensuring load balancer
        Normal  EnsuredLoadBalancer   1m    service-controller  Ensured load balancer
    
  3. VPC ロード・バランサーが VPC に正常に作成されたことを確認します。 出力で、VPC ロード・バランサーの**「Provision status」active「Operating status」**が online であることを確認します。

    VPC ロード・バランサーの名前の形式は、kube-<cluster_ID>-<kubernetes_lb_service_UID> です。 クラスター ID を確認するには、ibmcloud ks cluster get --cluster <cluster_name> を実行します。 Kubernetes LoadBalancer サービスの UID を調べるには、kubectl get svc hw-lb-svc -o yaml を実行して出力中の metadata.uid フィールドを確認します。

    ibmcloud is load-balancers
    

    以下の CLI 出力例では、kube-bsaucubd07dhl66e4tgg-1f4f408ce6d2485499bcbdec0fa2d306 という名前の VPC ロード・バランサーが Kubernetes LoadBalancer サービス用に作成されています。

    ID                                          Name                                                         Family        Subnets               Is public   Provision status   Operating status   Resource group
    r006-d044af9b-92bf-4047-8f77-a7b86efcb923   kube-bsaucubd07dhl66e4tgg-1f4f408ce6d2485499bcbdec0fa2d306   Application   mysubnet-us-south-3   true        active             online             default
    
  4. 手順 2 で確認した、VPC ロード・バランサーから割り当てられた Kubernetes LoadBalancer サービスのホスト名とポートに対して curl を実行して、アプリに要求を送信します。

    curl 1234abcd-us-south.lb.appdomain.cloud:8080
    

    出力例

    Hello world from hello-world-deployment-5fd7787c79-sl9hn! Your app is up and running in a cluster!
    

次のステップ

VPC クラスターの作成が完了したので、実行できる内容について詳しく学習します。

VPC クラスターに関する支援を求めたり、質問をしたり、フィードバックを提供したりするには、 Slack チャネルに投稿してみてください。