Kubernetes にデプロイ

動作条件

  • 概要説明とセットアップ に記述された Docker Desktop のダウンロードとインストール

  • Part 2 でアプリケーションのコンテナ化を一通り行う

  • Docker Desktop 上で Kubernetes 機能が有効化されていることを確認

    • Mac :メニューバー内の Docker アイコンをクリックし、 Preferences に移動し、「Kubernetes」の横に緑のライトが点等していること
    • Mac :システムトレイ内の Docker アイコンをクリックし、 Settings に移動し、「Kubernetes」の横に緑のライトが点等していること

もし Kubernetes が起動していなければ、 オーケストレーション の手順を確認し、セットアップを完了してから以下の手順に進みます。

はじめに

ここからは、私たちのアプリケーションの個々のコンポーネントを、スタンドアロン・コンテナ(stand-alone container)として実行してみましょう。Kubernetes のようなオーケストレータによって管理できるように、調整する機会です。Kubernetes はコンテナ化アプリケーションのをスケール、ネットワーク機能、安全性、管理するための多くのツールを提供し、コンテナ自身に前述および後述の能力を与えます。

私たちのコンテナ化アプリケーションが Kubernetes 上でも同様に動作するのを確認します。プロダクションの完全な Kubernetes クラスタにアプリケーションを持ち出す前に、開発マシン上にある Docker Desktop の Kubernetes 環境を使い、アプリケーションをデプロイします。Docker Desktop によって作成される Kubernetes 環境は、全ての機能を持ちます。つまり、アプリケーションが Kubernetes 環境で全て動作するのであれば、実際のクラスタ上でも動作しますので、開発マシン上からも簡単に利用できるのを意味します。

Kubernetes YAML でアプリケーションを記述

Kubernetes 内の全てのコンテナは pod (ポッド)としてスケジュールされます。pod とは同じリソースを共有する、同じ場所に配置されるコンテナのグループです。さらに、実際のアプリケーションでは、ほとんど単体の pod を作りません。そのかわりに、多く音ワークロードは デプロイメント(deployment) としてスケジュールされます。これはスケーラブルな(拡張性を備えた)pod のグループであり、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: bulletinboard:1.0
---
apiVersion: v1
kind: Service
metadata:
  name: bb-entrypoint
  namespace: default
spec:
  type: NodePort
  selector:
    bb: web
  ports:
  - port: 8080
    targetPort: 8080
    nodePort: 30001

この Kubernetes YAML ファイルには、 --- によって区切られる2つのオブジェクトがあります。

  • Deployment で、完全に等しい pod のスケーラブルなグループを記述します。この例では、1つの replica (レプリカ)を入手するか、 pod のコピーを入手できるようにし、その pod ( template 以下に記述 )内で1つのコンテナを持ちます。このコンテナは、このチュートリアル以前のステップで用いた bulletinboard:1.0 イメージをベースとするものです。
  • NodePort サービスは、ホスト上のポート 30001 からのトラフィックを、 pod 内の 8080 に転送します。これにより、ネットワークから掲示板に到達可能になります。

また、kubernetes YAML を初めて見ると、長く複雑に見えてしまいますが、ほとんどが以下のように同じパターンです。

  • apiVersion が示すのは、Kubernetes API で対象オブジェクトをパースする指定
  • kind が示すのは、これがどのような種類のオブジェクトか
  • いくつかの metadata は、オブジェクトに対して名前のようなものを適用
  • spec で指定するのは、オブジェクトに対するパラメータと設定の全て

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

  1. ターミナル上で、 bb.yaml を作成した場所に移動し、 Kubernetes にアプリケーションをデプロイします。
kubectl apply -f bb.yaml

すると、以下のような出力が現れ、Kubernetes オブジェクトの作成に成功したことが分かります。

deployment.apps/bb-demo created
service/bb-entrypoint created
  1. デプロイメントのリストを表示し、全てが正常動作しているのを確認します。
kubectl get deployments

全てが正常であれば、デプロイメントは一覧に次のように表示されます。

NAME      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
bb-demo   1         1         1            1           48s

これが示すのは、YAML で命令した全ての pod が起動して実行中であることがわかります。サービスに対しても同様に確認します。

kubectl get services

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

デフォルトの kubernetes サービスに加え、私たちの bb-entrypoint サービスが見え、ポート 30001/TCP のトラフィックを受け入れるのが分かります。

  1. ブラウザで localhost:30001 を開き、掲示板を訪ねましょう。そうすると、クイックスタート・チュートリアルの Part 2 で実行したスタンドアロン・コンテナと同じ掲示板が表示されます。
  1. 満足したら、アプリケーションを解体します。
kubectl delete -f bb.yaml

まとめ

これまで、 Docker Desktop を使い、私たちの開発マシン上で全機能が揃った Kubernetes 環境に、私たちのアプリケーションをデプロイすることに成功しました。まだ Kubernetes をほとんど触っていませんが、新しいドアが開かれました。つまり、アプリケーションに他のコンポーネントを追加できますし、まさにあなたのマシン上で、Kubernetes の全ての機能とパワーを活用できるのです。

Kubenetes へのデプロイに付け加えると、アプリケーションを Kubernetes YAML ファイルとして記述しました。これはシンプルなテキストファイルで、アプリケーションを実行状態として生成するために全てを含むものです。同僚とバージョンコントロールでチェックおよび共有できるようにすると、他のクラスタ(開発環境の後に続く、テストやプロダクションに対応したクラスタ)に対するアプリケーションの配布が簡単になります。

Kubernetes リファレンス

この記事で使われた新しい Kubernetes オブジェクトに関する詳しい情報は、こちらをご覧ください。