仮想プライベート・クラウド (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を試してください。 そうしない場合は、以下のステップを実行してローカルのコマンド・ライン環境をセットアップしてください。
- IBM Cloud CLI (
ibmcloud
)、Kubernetes Service プラグイン (ibmcloud ks
)、および IBM Cloud Container Registry プラグイン (ibmcloud cr
) をインストールします。 - Red Hat OpenShift (
oc
) CLI および Kubernetes (kubectl
) CLI をインストールします。 - VPC を操作するために、
infrastructure-service
プラグインをインストールします。 コマンドを実行するための接頭部は、ibmcloud is
です。ibmcloud plugin install infrastructure-service
- Kubernetes Service プラグインを最新バージョンに更新します。
ibmcloud plugin update kubernetes-service
kubectl
バージョンが、VPC クラスターの Kubernetes バージョンと一致していることを確認します。 このチュートリアルでは、バージョンを実行するクラスタを作成します。 1.32。
VPC でのクラスターの作成
IBM Cloud Kubernetes Service 仮想プライベート・クラウド (VPC) 環境に IBM Cloud クラスターを作成します。 VPC について詳しくは、Virtual Private Cloud の概説を参照してください。
- VPC 環境を作成するアカウント、リソース・グループ、および IBM Cloud リージョンにログインします。 VPCは、クラスタを作成したいのと同じマルチゾーンのメトロリージョン内に設定する必要があります。 このチュートリアルでは、
us-south
に VPC を作成します。 サポートされるその他のリージョンについては、VPC クラスターに対応しているマルチゾーンの大都市を参照してください。 フェデレーテッドIDをお持ちの場合は、--sso
オプションを含めてください。ibmcloud login -r us-south [-g <resource_group>] [--sso]
- クラスター用の VPC を作成します。 詳しくは、コンソールまたは CLI で VPC を作成する方法に関する資料を参照してください。
-
myvpc
という VPC を作成し、出力の ID をメモします。 VPC によって、パブリック・クラウド内にワークロードを実行するための分離された環境が提供されます。 複数のクラスターに同じ VPC を使用できます。例えば、相互に通信する必要がある別々のマイクロサービスを別々のクラスターでホストする場合などです。 例えば、部門別にクラスターを分ける場合は、クラスターごとに VPC を作成します。ibmcloud is vpc-create myvpc
-
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
- ゾーン: クラスター内のゾーンごとに VPC サブネットを 1 つ用意する必要があります。 利用可能なゾーンは、VPCを作成したメトロリージョンによって異なります。 リージョン内の使用可能なゾーンをリストするには、
-
- 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>
- クラスターの状態を確認します。 クラスターのプロビジョンには数分かかることがあります。
- クラスターの状態 が normal であることを確認します。
ibmcloud ks cluster ls --provider vpc-gen2
- Kubernetes 構成ファイルをダウンロードします。
ibmcloud ks cluster config --cluster myvpc-cluster
- Kubernetes CLI サーバーのバージョンを調べて、クラスターで
kubectl
コマンドが正常に実行されることを確認します。
出力例kubectl version --short
Client Version: 1.32 Server Version: 1.32+IKS
- クラスターの状態 が normal であることを確認します。
プライベートに提供するアプリをデプロイする
Kubernetes デプロイメントを作成して、単一のアプリ・インスタンスをポッドとして VPC クラスター内のワーカー・ノードにデプロイします。
-
Hello worldアプリのソースコードをユーザーホームディレクトリにコピーします。 このリポジトリーには、同じアプリのさまざまなバージョンが、
Lab
で始まる各フォルダーに入っています。 各バージョンに以下のファイルがあります。Dockerfile
: イメージのビルド定義。app.js
: Hello World アプリ。package.json
: アプリに関するメタデータ。
git clone https://github.com/IBM/container-service-getting-started-wt.git
-
Lab 1
ディレクトリーに移動します。cd 'container-service-getting-started-wt/Lab 1'
-
既存のレジストリー名前空間を使用するか、
vpc-gen2
などの名前空間を作成します。ibmcloud cr namespace-list
ibmcloud cr namespace-add vpc-gen2
-
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
-
IBM Cloud Container Registry にログインします。
ibmcloud cr login
-
作成した IBM Cloud Container Registry 名前空間にイメージをプッシュします。 今後、アプリの変更が必要になった場合には、この手順を繰り返して別バージョンのイメージを作成します。 注: コンテナー・イメージを使用する際の個人情報の保護の詳細を確認してください。
docker push us.icr.io/<namespace>/hello-world:1
-
アプリ用のデプロイメントを作成します。 ポッドはデプロイメントを使用して管理され、コンテナー化されたアプリ・インスタンスを格納するために使用されます。 以下のコマンドでは、アプリを 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 リソースを処理する際の個人情報の保護の詳細を確認してください。
-
デプロイメントを 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-port
がport
と同じですが、作成する他のアプリでは別のポートを使用することもできます。 -
デプロイメントの作業がすべて完了したので、クラスター内からアプリをテストできます。 アプリへのアクセスに使用できるプライベート IP アドレスを形成するための詳細情報を取得します。
-
サービスに関する情報を取得して、割り当てられた 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.
-
アプリを実行するポッドをリストし、ポッド名をメモします。
kubectl get pods
出力例
NAME READY STATUS RESTARTS AGE hello-world-deployment-d99cddb45-lmj2v 1/1 Running 0 2d
-
ポッドの詳細を表示して、ポッドが実行されているワーカー・ノードを確認します。 この出力例では、ポッドを実行しているワーカー・ノードは 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 ...
-
-
クラスター内からアプリに要求を行えるようにポッドにログインします。
kubectl exec -it hello-world-deployment-d99cddb45-lmj2v /bin/sh
-
先ほど取得したワーカー・ノードのプライベート 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 を介して、アプリに対する要求を転送します。 以下の図は、ワーカー・ノードをプライベート・サブネットにしか接続していない場合でも、ユーザーがロード・バランサーを介してアプリのサービスにアクセスできる仕組みを示しています。
-
クラスターに 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-port
がport
と同じですが、作成する他のアプリでは別のポートを使用することもできます。 -
クラスターに Kubernetes
LoadBalancer
サービスが正常に作成されたことを確認します。 KubernetesLoadBalancer
サービスを作成すると、VPC ロード・バランサーが自動的に作成されます。 VPC ロード・バランサーは、CLI 出力の LoadBalancer Ingress フィールドに表示できるホスト名を、Kubernetes LoadBalancer サービスに割り当てます。 VPC ロード・バランサーが VPC にプロビジョンされるまで数分かかります。 VPCロードバランサーが準備できるまでは、ホスト名から KubernetesLoadBalancer
サービスにアクセスすることはできません。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
-
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>
を実行します。 KubernetesLoadBalancer
サービスの UID を調べるには、kubectl get svc hw-lb-svc -o yaml
を実行して出力中の metadata.uid フィールドを確認します。ibmcloud is load-balancers
以下の CLI 出力例では、
kube-bsaucubd07dhl66e4tgg-1f4f408ce6d2485499bcbdec0fa2d306
という名前の VPC ロード・バランサーが KubernetesLoadBalancer
サービス用に作成されています。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
-
手順 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 チャネルに投稿してみてください。