Kubernetes へのデプロイ

読む時間の目安: 2 分

前提条件

  • 概要 にて説明している Docker Desktop をダウンロードしインストールしていること。
  • クイックスタート 2 部 においてアプリケーションのコンテナー化を一通り学んでいること。
  • Docker Desktop 上において Kubernetes が有効になっていること。
    • Mac: メニューバーの Docker アイコンをクリック、Preferences を実行し ‘Kubernetes’ の横がグリーンに点灯していること。
    • Windows: システムトレイの Docker アイコンをクリック、Settings を実行し ‘Kubernetes’ の横がグリーンに点灯していること。

    Kubernetes が起動していない場合は、本チュートリアルの 概要 に示す手順に従って設定を行ってください。

はじめに

ここまでにアプリケーションの個々のコンポーネントが、スタンドアロンなコンテナーとして実行される様子を見てきました。 ここからはそれらを整理して、Kubernetes のようなオーケストレーターによって管理してくことにします。 Kubernetes はコンテナー化されたアプリケーションに対して、そのコンテナーの能力を超えて、スケール、ネットワーク、セキュリティ、保守を行うツールを数多く提供します。

Kubernetes 上においてコンテナー化アプリケーションが適正に動作していることを確認するために、まずは開発マシン上にて Kubernetes 環境化の Docker Desktop を用いてアプリケーションデプロイを行います。 完全な Kubernetes クラスターによる本番環境での稼動は、その次に扱っていくことにします。 Docker Desktop によって構築されている Kubernetes 環境は 完全な機能 を有しています。 つまりそこには Kubernetes の全機能が含まれていて、実際のクラスター上でアプリを動作させることができ、開発マシンから容易にアクセスすることができます。

Kubernetes YAML を用いたアプリ記述

Kubernetes 内の全コンテナーは ポッド(pod)としてスケジューリングされます。 このポッドとは、リソースを共有する複数コンテナーのグループのことです。 なお現実のアプリケーションにおいては、ポッドを1つずつ生成するようなことはしません。 たいていのアプリケーション開発では deployments としてスケジューリングされます。 これは Kubernetes によって自動的に管理される、スケール変更可能なポッドのグループのことです。 そして Kubernetes によるオブジェクトは、すべて Kubernetes YAML ファイルと呼ばれるファイル内に記述されます。 この YAML ファイルに Kubernetes アプリのコンポーネントや設定をすべて記述します。 こうして Kubernetes 環境内でのアプリケーションの生成と削除が容易にできるようになります。

  1. 本チュートリアルのオーケストレーション概要の部において、すでに基本的な Kubernetes YAML ファイルを作り出しました。 そこでこの YAML ファイルをもう少し洗練されたものにして、掲示板アプリの実行と管理を行っていきます。 bb.yamlというファイルに以下の内容を記述してください。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: bb-demo
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          bb: web
      template:
        metadata:
          labels:
            bb: web
        spec:
          containers:
          - name: bb-site
            image: getting-started
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: bb-entrypoint
      namespace: default
    spec:
      type: NodePort
      selector:
        bb: web
      ports:
      - port: 3000
        targetPort: 3000
        nodePort: 30001
    

    この Kubernetes YAML ファイルには二つのオブジェクトを定義しています。 それらは --- で区切られています。

    • Deploymentは、スケール変更可能な同一ポッドのグループを表わします。 この例ではreplicaすなわちポッドのコピーを1つだけ用意します。 そしてこのポッドは、その中に1つだけコンテナーを持ちます(このことはtemplate:キー配下により示されます)。 ベースとするイメージは、本チュートリアルの以前の手順にて利用したbulletinboard:1.0です。
    • NodePortサービスは、ホストのポート 30001 からのトラフィックを処理して、ポッド内の 3000 ポートへ接続します。 こうしてネットワーク上から掲示板アプリへアクセスできるようになります。

    また Kubernetes YAML は、はじめのうちは長く複雑に見えがちですが、たいていは同一パターンを持っています。

    • apiVersion、オブジェクトを扱うための Kubernetes API を表わします。
    • kindは、このオブジェクトがどういう種類のものかを表わします。
    • metadataは、たとえば name などの情報をオブジェクトに適用します。
    • specは、オブジェクトに対するパラメーターや設定項目を指定します。

アプリケーションのデプロイと確認

  1. 端末にて bb.yaml を生成したディレクトリに移動し、Kubernetes にアプリケーションをデプロイします。

    $ kubectl apply -f bb.yaml
    

    以下のような出力が得られます。 これは Kubernetes オブジェクトが正常に生成されたことを示しています。

    deployment.apps/bb-demo created
    service/bb-entrypoint created
    
  2. デプロイ結果の一覧を表示して、正常にすべてが動作していることを確認します。

    $ kubectl get deployments
    

    すべて正常であれば、以下のようにデプロイ結果が一覧表示されます。

    NAME      READY   UP-TO-DATE   AVAILABLE   AGE
    bb-demo   1/1     1            1           40s
    

    YAML ファイル内に指定したポッドの個々が、すべて起動していることがわかります。 同様にサービスに対しても確認します。

    $ kubectl get services
    
    NAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
    bb-entrypoint   NodePort    10.106.145.116   <none>        3000:30001/TCP   53s
    kubernetes      ClusterIP   10.96.0.1        <none>        443/TCP          138d
    

    デフォルトのkubernetesサービスに加えてbb-entrypointサービスが表示されます。 このサービスはトラフィックをポート 30001/TCP から受け付けます。

  3. ブラウザーを開いてlocalhost:30001にアクセスし掲示板アプリを開きます。 ここでも掲示板アプリを見ることができます。 これはクイックスタートチュートリアルの 2 部 において、スタンドアロンなコンテナー上に起動させたアプリと同一のものです。

  4. 結果を確認できたらアプリケーションを削除します。

    $ kubectl delete -f bb.yaml
    

まとめ

開発マシン上にて Kubernetes の全機能を実現した環境に、Docker Desktop を用いてアプリケーションをデプロイすることに成功しました。 Kubernetes を使った作業には、まだまだ多くのことがあります。 これは入り口に入ったばかりということです。 アプリケーションに別のコンポーネントを加えてみれば、Kubernetes の優れた機能や性能が見えてきます。 それをまさに開発マシン上で確認できます。

Kubernetes へのデプロイに加えて、アプリケーションを Kubernetes YAML ファイルとして記述しました。 この単純なテキストファイルが、アプリケーションを生成して実行するために必要なものをすべて含んでいるわけです。 このファイルをバージョン管理システムにアップして、仲間と共有してみましょう。 そうすればこのアプリケーションを別の担当者(おそらく開発担当者から受け渡す先として、テスト環境担当者や本番環境担当者)に容易に配布できることになります。

Kubernetes リファレンス

本文において新たに用いた Kubernetes オブジェクトについての詳細は、以下を参照してください。

kubernetes, pods, deployments, kubernetes services