機械翻訳について

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ドキュメント」で詳しく説明します。