仮想プライベート・クラウド (VPC) での最初のクラスターのセットアップ
仮想プライベート・クラウド (VPC) に IBM Cloud® Kubernetes Service クラスターを作成します。
IBM Cloud Kubernetes Service VPC上のクラスター を使用すると、次世代の 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.35 のクラスタを作成します。
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 ``` 2. VPC 用のサブネットを作成し、その **ID** をメモします。 VPC サブネットを作成する際は、以下の情報を考慮してください。 - **ゾーン**: クラスター内のゾーンごとに VPC サブネットを 1 つ用意する必要があります。 利用可能なゾーンは、VPCを作成したメトロエリアによって異なります。 リージョン内の使用可能なゾーンをリストするには、`ibmcloud is zones` を実行します。 - **IP アドレス**: クラスターのワーカー・ノードおよびロード・バランサー・サービスのプライベート IP アドレスは VPC サブネットから取得されるので、256 個などの[十分な数の IP アドレスが含まれるサブネットを作成](/docs/containers?topic=containers-vpc-subnets#vpc_basics_subnets)してください。 後で VPC サブネットの IP アドレスの数を変更することはできません。 - **パブリック・ゲートウェイ**: このチュートリアルを完了するためにパブリック・ゲートウェイを接続する必要はありません。 代わりに、VPC ロード・バランサーを使用してワークロードを安全に公開し、ワーカー・ノードをパブリック・アクセスから分離された状態に維持できます。 ワーカー・ノードがパブリック URL にアクセスする必要がある場合は、パブリック・ゲートウェイを接続することができます。 ```sh {: pre} ibmcloud is subnet-create mysubnet1 VPC_ID --zone us-south-1 --ipv4-address-count 256 ``` - VPC のサブネットと同じゾーンにクラスターを作成します。 デフォルトでは、クラスターはパブリックとプライベートのクラウド・サービス・エンドポイントを備えた状態で作成されます。 お客様はパブリック・クラウド・サービス・エンドポイントを使用して Kubernetes マスターにアクセスできます。例えば、ローカル・マシンから
kubectlコマンドを実行したりできます。 ワーカー・ノードはプライベート・クラウド・サービス・エンドポイントを使用してマスターと通信できます。 コマンドのオプションについて詳しくは、cluster create vpc-gen2CLI リファレンス資料を参照してください。ibmcloud ks cluster create vpc-gen2 --name myvpc-cluster --zone us-south-1 --version 1.35 --flavor bx2.2x8 --workers 1 --vpc-id VPC_ID --subnet-id VPC_SUBNET_ID - クラスターの状態を確認します。 クラスターのプロビジョンには数分かかることがあります。
- クラスターの状態 が normal であることを確認します。
ibmcloud ks cluster ls --provider vpc-gen2 ``` 2. Kubernetes 構成ファイルをダウンロードします。 ```sh {: pre} ibmcloud ks cluster config --cluster myvpc-cluster ``` 3. Kubernetes CLI サーバーのバージョンを調べて、クラスターで `kubectl` コマンドが正常に実行されることを確認します。 ```sh {: pre} kubectl version --short ``` 出力例 ```sh {: screen} Client Version: 1.35 Server Version: 1.35+IKS ```
プライベートに提供するアプリをデプロイする
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-listibmcloud 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 createdKubernetes リソースを処理する際の個人情報の保護の詳細を確認してください。
-
デプロイメントを 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 ``` 出力例 ```sh {: screen} 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. アプリを実行するポッドをリストし、ポッド名をメモします。 ```sh {: pre} kubectl get pods ``` 出力例 ```sh {: screen} NAME READY STATUS RESTARTS AGE hello-world-deployment-d99cddb45-lmj2v 1/1 Running 0 2d ``` 3. ポッドの詳細を表示して、ポッドが実行されているワーカー・ノードを確認します。 この出力例では、ポッドを実行しているワーカー・ノードは **10.xxx.xx.xxx** です。 ```sh {: pre} kubectl describe pod hello-world-deployment-d99cddb45-lmj2v ``` 出力例 ```sh {: screen} 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 ... ``` - サービスに関する情報を取得して、割り当てられた NodePort を確認します。
-
クラスター内からアプリに要求を行えるようにポッドにログインします。
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-svcCLI 出力の例
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 チャネルに投稿してみてください。