このドキュメントで説明されているソフトウェアは、サポートされなくなったか、拡張サポートされています。
Oracleでは、現在サポートされているリリースにアップグレードすることをお勧めします。

機械翻訳について

第4章 Kubernetesの使用

この章では、Kubernetesを使用してコンテナ化されたアプリケーションを初めてデプロイ、管理およびスケーリングする方法について説明します。 この章では、環境内でコンテナおよびサービスの作成と管理を開始するためのkubectlコマンドの基本的な使用方法について説明します。

kubectlユーティリティについては、次の場所にあるアップストリームのドキュメントですべて説明されています。

https://kubernetes.io/docs/reference/kubectl/overview/

4.1 ランタイム・エンジンについて

runcは、コンテナ作成時のデフォルトのランタイム・エンジンです。 Kataコンテナを作成するために、kata-runtimeランタイム・エンジンを使用することもできます。 Kataコンテナの詳細と作成方法は、コンテナ・ランタイムを参照してください。

4.2 ノードに関する情報の取得

クラスタ内のすべてのノードおよび各ノードのステータスのリストを取得するには、kubectl getコマンドを使用します。 このコマンドは、Kubernetesでサポートされるあらゆる種類のリソースのリストを取得するために使用できます。 この例では、nodesリソースは次のように示されます。

kubectl get nodes
NAME STATUS ROLES AGE VERSION control.example.com Ready master 1h v1.20.x+x.x.x.el8 worker1.example.com Ready <none> 1h v1.20.x+x.x.x.el8 worker2.example.com Ready <none> 1h v1.20.x+x.x.x.el8

いずれかのリソースに関する詳細情報を取得するには、kubectl describeコマンドを使用します。 リソースの名前を指定した場合、出力は、そのリソースのみに関する情報に制限されます。それ以外の場合は、すべてのリソースの完全な詳細も画面に出力されます。 次に例を示します。

kubectl describe nodes worker1.example.com
Name: worker1.example.com Roles: <none> Labels: beta.kubernetes.io/arch=amd64 beta.kubernetes.io/os=linux kubernetes.io/arch=amd64 kubernetes.io/hostname=worker1.example.com kubernetes.io/os=linux Annotations: flannel.alpha.coreos.com/backend-data: {"VtepMAC":"fe:78:5f:ea:7c:c0"} flannel.alpha.coreos.com/backend-type: vxlan flannel.alpha.coreos.com/kube-subnet-manager: true flannel.alpha.coreos.com/public-ip: 192.0.2.11 kubeadm.alpha.kubernetes.io/cri-socket: /var/run/crio/crio.sock node.alpha.kubernetes.io/ttl: 0 volumes.kubernetes.io/controller-managed-attach-detach: true ...

4.3 ポッドでのアプリケーションの実行

単一の実行コンテナでポッドを作成する場合は、kubectl createコマンドを使用できます。 次に例を示します。

kubectl create deployment --image nginx hello-world
deployment.apps/hello-world created

nginxは、コンテナ・イメージに置き換えてください。 hello-worldは、目的のデプロイメントの名前に置き換えてください。 ポッドには、接頭辞としてデプロイメント名を使用した名前が付けられています。

ヒント

デプロイメント、ポッドおよびサービスの名前は、DNS-1123ラベルと一致する要件に従います。 それらは、英数文字(小文字)または-で構成されていて、先頭と末尾が英数文字になっていることが必要です。 正規表現で名前を検証する場合は、'[a-z0-9]([-a-z0-9]*[a-z0-9])?'を使用します。 デプロイメントに無効な名前を使用すると、エラーが返されます。

Kubernetes内で新しいアプリケーションを実行する際に使用できる追加のオプション・パラメータは多数あります。 たとえば、起動する必要のあるレプリカ・ポッドの数を実行時に指定することも、ポッドのコンポーネントを簡単に識別できるようにするためにデプロイメントにラベルを適用することもできます。 使用可能なオプションの完全なリストは、kubectl run --helpを実行することで確認できます。

新しいアプリケーション・デプロイメントによって1つ以上のポッドが作成されたことを確認するには、次のようにkubectl get podsコマンドを使用します。

kubectl get pods
NAME READY STATUS RESTARTS AGE hello-world-5f55779987-wd857 1/1 Running 0 1m

kubectl describeコマンドは、ポッドの詳細を表示するために使用します。この詳細では、実行中のコンテナ、基になったイメージ、現在ポッドをホストしているノードなどが示されます。

kubectl describe pods
Name: hello-world-5f55779987-wd857 Namespace: default Priority: 0 PriorityClassName: <none> Node: worker1.example.com/192.0.2.11 Start Time: Fri, 16 Aug 2019 08:48:33 +0100 Labels: app=hello-world pod-template-hash=5f55779987 Annotations: <none> Status: Running IP: 10.244.1.3 Controlled By: ReplicaSet/hello-world-5f55779987 Containers: nginx: Container ID: cri-o://417b4b59f7005eb4b1754a1627e01f957e931c0cf24f1780cd94fa9949be1d31 Image: nginx Image ID: docker-pullable://nginx@sha256:5d32f60db294b5deb55d078cd4feb410ad88e6fe7... Port: <none> Host Port: <none> State: Running Started: Mon, 10 Dec 2018 08:25:25 -0800 Ready: True Restart Count: 0 Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-s8wj4 (ro) Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True Volumes: default-token-s8wj4: Type: Secret (a volume populated by a Secret) SecretName: default-token-s8wj4 Optional: false QoS Class: BestEffort Node-Selectors: <none> Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s node.kubernetes.io/unreachable:NoExecute for 300s Events: ....

4.4 ポッド・デプロイメントのスケーリング

実行中の同一ポッドのインスタンス数を変更する場合は、kubectl scale deploymentコマンドを使用できます。 次に例を示します。

kubectl scale deployment --replicas=3 hello-world
deployment.apps/hello-world scaled

ポッドのインスタンス数が適切にスケーリングされていることを確認できます。

kubectl get pods
NAME READY STATUS RESTARTS AGE hello-world-5f55779987-tswmg 1/1 Running 0 18s hello-world-5f55779987-v8w5h 1/1 Running 0 26m hello-world-5f55779987-wd857 1/1 Running 0 18s

4.5 アプリケーションのサービス・オブジェクトの公開

通常、多くのアプリケーションはポッドの範囲内(その範囲を超えたとしてもポッド間)の内部的な通信のみが必要になりますが、アプリケーションを外部に公開してKubernetesクラスタの外側にあるクライアントがアプリケーションとインタフェース接続できるようにすることが必要になる場合もあります。 これは、そのデプロイメントに対応するサービス定義を作成することで実現できます。

サービス・オブジェクトを使用してデプロイメントを公開するには、使用するサービス・タイプを定義する必要があります。 クラウドベースのロード・バランシング・サービスを使用していない場合は、サービス・タイプをNodePortに設定できます。 NodePortサービスは、クラスタ内のすべてのノードに対するパブリックIPアドレス上の専用ポートで、クラスタ内で実行しているアプリケーションを公開します。 kubectl expose deploymentコマンドを使用して、新しいサービスを作成します。 次に例を示します。

kubectl expose deployment hello-world --port 80 --type=LoadBalancer
service/hello-world exposed

次のようにkubectl get servicesを使用して、クラスタで実行中の各種サービスをリストし、そのサービスにアクセスするために必要なポート情報を取得します。

kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-world LoadBalancer 10.102.42.160 <pending> 80:31847/TCP 3s kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5h13m

この例の出力では、クラスタ内部のポート80へのトラフィックがNodePort 31847にマップされていることがわかります。 サービスにアクセスするために使用できる外部IPは、<pending>としてリストされています。これは、ポート31847でクラスタ内のいずれかのノードの外部IPアドレスに接続することで、そのサービスにアクセスできることを意味します。

このガイドの例では、クラスタ内のいずれかのノード(たとえば、http://worker1.example.com:31847/)を指すようにしてWebブラウザを開くと、NGINXデモ・アプリケーションが表示されます。

4.6 サービスまたはデプロイメントの削除

オブジェクトはKubernetes内で簡単に削除できるため、環境をクリーンな状態に保てます。 kubectl deleteコマンドは、オブジェクトを削除する場合に使用します。

サービスを削除するには、サービス・オブジェクトと削除するサービスの名前を指定します。 次に例を示します。

kubectl delete services hello-world
service "hello-world" deleted

デプロイメント全体と、そのデプロイメントに対して実行中のすべてのポッド・レプリカを削除するには、次のようにデプロイメント・オブジェクトとデプロイメントの作成に使用した名前を指定します。

kubectl delete deployment hello-world
deployment.extensions "hello-world" deleted

4.7 ネームスペースによる操作

ネームスペースは、リソースの使用を細かく分離することと、特定のユース・ケースに限定された環境を提供することを目的として使用できます。 Kubernetesでは、デフォルトでKubernetesのシステム・コンポーネントに対応するネームスペースと、それ以外のネームスペースが定義されていないデプロイメントに使用する標準ネームスペースが構成されます。

既存のネームスペースを表示するには、kubectl get namespacesコマンドとkubectl describe namespacesコマンドを使用します。

kubectlコマンドは、リクエストで具体的なネームスペースを指定していないと、デフォルト・ネームスペースのリソースのみを表示します。 そのため、Kubernetesシステムに固有のポッドを表示する必要がある場合は、リクエストに--namespaceオプションを使用してネームスペースをkube-systemに設定します。 たとえば、単一のコントロール・プレーン・ノードのクラスタでは、次のようになります。

kubectl get pods --namespace=kube-system
NAME READY STATUS RESTARTS AGE coredns-5bc65d7f4b-qzfcc 1/1 Running 0 23h coredns-5bc65d7f4b-z64f2 1/1 Running 0 23h etcd-control1.example.com 1/1 Running 0 23h kube-apiserver-control1.example.com 1/1 Running 0 23h kube-controller-control1.example.com 1/1 Running 0 23h kube-flannel-ds-2sjbx 1/1 Running 0 23h kube-flannel-ds-njg9r 1/1 Running 0 23h kube-proxy-m2rt2 1/1 Running 0 23h kube-proxy-tbkxd 1/1 Running 0 23h kube-scheduler-control1.example.com 1/1 Running 0 23h kubernetes-dashboard-7646bf6898-d6x2m 1/1 Running 0 23h

4.8 デプロイメント・ファイルの使用

ポッドとポッドに関連する要件の作成を簡単にするために、デプロイメントを構成する要素のすべてを定義するデプロイメント・ファイルを作成できます。 このデプロイメントでは、ポッド内にコンテナを生成するために使用するイメージおよびランタイムの要件と、構成が必要になるサービス形式のKubernetesネットワークとストレージの要件およびマウントする必要性があるボリュームを定義します。

デプロイメントの詳細は、次の場所を参照してください。

https://kubernetes.io/docs/concepts/workloads/controllers/deployment/