4 Kubernetesの使用
この章では、コンテナ化されたアプリケーションのデプロイ、メンテナンスおよびスケーリングにKubernetesの使用を開始する方法について説明します。 この章では、kubectl
コマンドの基本的な使用方法について説明し、環境内のコンテナとサービスの作成および管理を開始します。
kubectl
ユーティリティの詳細は、アップストリームの「Kubernetesドキュメント」を参照してください。
ランタイム・エンジンについて
runc
は、コンテナ作成時のデフォルトのランタイム・エンジンです。 Kataコンテナを作成するために、kata-runtime
ランタイム・エンジンを使用することもできます。 Kataコンテナの詳細と作成方法は、コンテナ・ランタイムを参照してください。
ノードに関する情報の取得
クラスタ内のすべてのノードのリストおよび各ノードのステータスを取得するには、kubectl get
コマンドを使用します。 このコマンドは、任意の種類のKubernetesリソースのリストを取得するために使用できます。 この場合、nodes
リソースは次のようになります:
kubectl get nodes
出力は次のようになります:
NAME STATUS ROLES AGE VERSION
control.example.com Ready control-plane 1h version
worker1.example.com Ready <none> 1h version
worker2.example.com Ready <none> 1h version
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
...
ポッドでのアプリケーションの実行
単一の実行中のコンテナを使用してポッドを作成するには、kubectl create
コマンドを使用できます。 たとえば:
kubectl create deployment --image nginx hello-world
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: <date> 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:
....
ポッド・デプロイメントのスケーリング
実行している同じポッドのインスタンス数を変更するには、kubectl scale deployment
コマンドを使用します。 たとえば:
kubectl scale deployment --replicas=3 hello-world
ポッドのインスタンス数が適切にスケーリングされていることを確認できます。
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
アプリケーションのサービス・オブジェクトの公開
通常、多くのアプリケーションはポッド内またはポッド間でのみ内部的に通信する必要がありますが、Kubernetesクラスタ外のクライアントがアプリケーションとインタフェースできるように、アプリケーションを外部に公開する必要がある場合があります。 これは、そのデプロイメントに対応するサービス定義を作成することで実現できます。
ノート:
Oracle Cloud Infrastructure Cloud Controller Managerモジュールは、Kubernetesアプリケーションの「Oracle Cloud Infrastructureロード・バランサ」を作成および管理するために使用されます。 次の例では、「Oracle Cloud Infrastructure Cloud Controller Managerモジュール」の説明に従ってこのモジュールをインストールしたと想定しています。
サービス・オブジェクトを使用してデプロイメントを公開するには、使用するサービス・タイプを定義する必要があります。 次の例は、kubectl expose deployment
コマンドを使用して、LoadBalancer
サービスを使用してアプリケーションを公開する方法を示しています:
kubectl expose deployment hello-world --port 80 --type=LoadBalancer
次の例に示すように、kubectl get services
を使用して、クラスタが実行されている様々なサービスをリストします。 LoadBalancer
サービスのEXTERNAL-IP
フィールドは、サービスの設定が進行中の間は、最初は<pending>
と表示されます:
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
ロード・バランサは、Oracle Cloud Infrastructureコンソールで確認できます。 最初は、コンソールでの状態は「作成中」と表示されます。
サービスの設定が完了するまで数分待ちます。 kubectl get services
コマンドを再度実行し、EXTERNAL-IP
フィールドにLoadBalancer
サービスに割り当てられたIPアドレスが移入されたことを確認します:
kubectl get services
出力は次のようになります:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-world LoadBalancer 10.102.42.160 192.0.2.250 80:31847/TCP 85s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5h15m
PORT(s)
フィールドには次のポートが含まれています:
-
ポート
80
:LoadBalancer
サービスにアクセスできるポート。 この例では、次のURLでサービスにアクセスします:http://192.0.2.250
-
ポート
31847
:NodePort
サービスに割り当てられたポート。NodePort
サービスを使用すると、次のようにURL形式worker_node:
NodePortを使用してアプリケーションにアクセスできます:http://worker1.example.com:31847/
ノート:
Kubernetesは、LoadBalancer
設定の一部としてNodePort
サービスを作成します。
curl
コマンドを実行して、サービスが正常に設定されていることを確認できます:
-
LoadBalancer
サービスの場合:curl http://192.0.2.250
出力は次のようになります:
<html> <head> <title>Welcome to this servicer</title> </head> <body> <h1>Welcome to this service</h1> ... </body> </html>
-
ワーカー・ノードごとに、
curl
コマンドを実行してNodePort
サービスを確認します:curl http://worker1.example.com:31847/
出力は次のようになります:
<html> <head> <title>Welcome to this servicer</title> ... </head> <body> <h1>Welcome to this service</h1> ... </body> </html>
サービスまたはデプロイメントの削除
オブジェクトはKubernetes内で簡単に削除できるため、環境をクリーンアップできます。 kubectl delete
コマンドを使用して、オブジェクトを削除します。
サービスを削除するには、サービス・オブジェクトと削除するサービスの名前を指定します。 たとえば:
kubectl delete services hello-world
デプロイメント全体と、そのデプロイメントに対して実行中のすべてのポッド・レプリカを削除するには、次のコマンドを実行します:
kubectl delete deployment hello-world
ネームスペースによる操作
ネームスペースは、リソースの使用を細かく分離することと、特定のユース・ケースに限定された環境を提供することを目的として使用できます。 Kubernetesでは、デフォルトでKubernetesのシステム・コンポーネントに対応するネームスペースと、それ以外のネームスペースが定義されていないデプロイメントに使用する標準ネームスペースが構成されます。
既存のネームスペースを表示するには、kubectl get namespaces
およびkubectl describe namespaces
コマンドを使用します。
kubectl
コマンドは、リクエストのネームスペースを設定しないかぎり、default
ネームスペース内のリソースのみを表示します。 したがって、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
デプロイメント・ファイルの使用
ポッドとポッドに関連する要件の作成を簡単にするために、デプロイメントで構成されているすべての要素を定義するデプロイメント・ファイルを作成できます。 このデプロイメントでは、ポッド内のコンテナの生成に使用されるイメージと、ランタイム要件、Kubernetesネットワーキング、および構成するサービスの形式のストレージ要件、およびマウントする必要があるボリュームを定義します。
デプロイメントについては、アップストリームの「Kubernetesドキュメント」で詳しく説明します。