前書き

最新のステートレスアプリケーションを構築する場合、https://www.digitalocean.com/community/tutorials/architecting-applications-for-kubernetes#containerizing-application-components [アプリケーションのコンポーネントのコンテナ化]は、分散型アプリケーションのデプロイとスケーリングの最初のステップですプラットフォーム。 開発でhttps://docs.docker.com/compose/[Docker Compose]を使用している場合、次の方法でアプリケーションを近代化およびコンテナ化できます。

  • コードから必要な構成情報を抽出します。

  • アプリケーションの状態をオフロードします。

  • 繰り返し使用するためにアプリケーションをパッケージ化します。

また、コンテナイメージの実行方法を指定するサービス定義を作成します。

Kubernetesなどの分散プラットフォームでサービスを実行するには、Composeサービス定義をKubernetesオブジェクトに変換する必要があります。 これにより、http://assets.digitalocean.com/white-papers/running-digitalocean-kubernetes.pdf [弾力性を備えたアプリケーションのスケーリング]が可能になります。 Kubernetesへの翻訳プロセスを高速化できるツールの1つにhttp://kompose.io/[kompose]があります。これは、開発者がComposeワークフローをKubernetesやhttps://www.openshift.com/ [ OpenShift]。

このチュートリアルでは、komposeを使用してComposeサービスをKubernetes objectsに変換します。 komposeが提供するオブジェクト定義を開始点として使用し、セットアップでhttps://kubernetes.io/docs/concepts/configuration/secret/[Secrets]、https://kubernetes.ioを使用するように調整します。 / docs / concepts / services-networking / service / [Services]、およびhttps://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims[PersistentVolumeClaims] Kubernetesが期待する方法で。 チュートリアルの終わりまでに、Kubernetesクラスターで実行されているhttps://www.mongodb.com/[MongoDB]データベースを使用した、単一インスタンスのhttps://nodejs.org/[Node.js]アプリケーションが作成されます。 このセットアップは、https://www.digitalocean.com/community/tutorials/containerizing-a-node-js-application-for-development-with-docker-compose [Containerizing a Node.jsで説明されているコードの機能をミラーリングしますDocker Composeを使用したアプリケーション]。これは、ニーズに合わせて拡張できる実稼働対応ソリューションを構築するための出発点として適しています。

前提条件

  • 役割ベースのアクセス制御(RBAC)が有効になっているKubernetes 1.10+クラスター。 このセットアップではhttps://www.digitalocean.com/products/kubernetes/[DigitalOcean Kubernetes cluster]を使用しますが、https://www.digitalocean.com/community/tutorials/how-to-create-を自由に使用できます。 a-kubernetes-1-11-cluster-using-kubeadm-on-ubuntu-18-04 [別の方法を使用してクラスターを作成]。

  • ローカルマシンまたは開発サーバーにインストールされ、クラスターに接続するように設定されたコマンドラインツール「+ kubectl 」。 ` kubectl +`のインストールの詳細については、https://kubernetes.io/docs/tasks/tools/install-kubectl/ [公式ドキュメント]をご覧ください。

  • ローカルマシンまたは開発サーバーにインストールされているhttps://www.docker.com/[Docker]。 Ubuntu 18.04を使用している場合は、https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-18-04 [How To]のステップ1および2に従ってください。 Ubuntu 18.04にDockerをインストールして使用する];それ以外の場合は、https://docs.docker.com/install/ [公式ドキュメント]に従って他のオペレーティングシステムへのインストールに関する情報を確認してください。 リンクされたチュートリアルのステップ2で説明されているように、必ず非ルートユーザーを `+ docker +`グループに追加してください。

  • Docker Hubアカウント。 この設定方法の概要については、Docker Hubのhttps://docs.docker.com/docker-hub/ [この概要]を参照してください。

ステップ1-komposeのインストール

komposeの使用を開始するには、https://github.com/kubernetes/kompose/releases [プロジェクトのGitHub * Releases *ページ]に移動し、リンクを現在のリリース(この執筆時点のバージョン)にコピーします。 このリンクを次の `+ curl +`コマンドに貼り付けて、komposeの最新バージョンをダウンロードします。

curl -L https://github.com/kubernetes/kompose/releases/download/v/kompose-linux-amd64 -o kompose

非Linuxシステムへのインストールの詳細については、https://github.com/kubernetes/kompose/blob/master/README.md#installation [インストール手順]を参照してください。

バイナリを実行可能にします:

chmod +x kompose

`+ PATH`に移動します:

sudo mv ./kompose /usr/local/bin/kompose

正しくインストールされたことを確認するには、バージョンチェックを実行できます。

kompose version

インストールが成功した場合、次のような出力が表示されます。

Output

`+ kompose +`がインストールされ、使用する準備ができたら、Kubernetesに変換するNode.jsプロジェクトコードを複製できます。

手順2-アプリケーションの複製とパッケージ化

Kubernetesでアプリケーションを使用するには、プロジェクトコードを複製し、アプリケーションをパッケージ化して、 `+ kubelet +`サービスがイメージをプルできるようにする必要があります。

最初のステップは、https://github.com/doからhttps://github.com/do-community/node-mongo-docker-dev.git[node-mongo-docker-dev repository]を複製することです。 -community [DigitalOcean Community GitHubアカウント]。 このリポジトリには、https://www.digitalocean.com/community/tutorials/containerizing-a-node-js-application-for-development-with-docker-compose [Node.jsアプリケーションのコンテナ化]で説明されているセットアップのコードが含まれています。開発用Docker Compose]。デモNode.jsアプリケーションを使用して、Docker Composeを使用して開発環境をセットアップする方法を示します。 アプリケーション自体の詳細については、https://www.digitalocean.com/community/tutorial_series/from-containers-to-kubernetes-with-node-js [Node.jsを使用したコンテナからKubernetesへのシリーズ]を参照してください。

リポジトリを `++`というディレクトリにクローンします:

git clone https://github.com/do-community/node-mongo-docker-dev.git

`++`ディレクトリに移動します:

cd

`++`ディレクトリには、ユーザー入力で動作するサメ情報アプリケーションのファイルとディレクトリが含まれます。 コンテナを操作するために近代化されました。機密性の高い特定の構成情報がアプリケーションコードから削除され、実行時にリファクタリングされ、アプリケーションの状態がMongoDBデータベースにオフロードされました。

最新のステートレスアプリケーションの設計の詳細については、https://www.digitalocean.com/community/tutorials/architecting-applications-for-kubernetes [Kubernetesのアーキテクティングアプリケーション]およびhttps://www.digitalocean.com/を参照してください。 community / tutorials / modernizing-applications-for-kubernetes [Kubernetesの近代化アプリケーション]。

プロジェクトディレクトリには、アプリケーションイメージをビルドするための手順を含む `+ Dockerfile +`が含まれています。 ここでイメージを作成して、Docker HubアカウントにプッシュしてKubernetesセットアップで使用できるようにします。

+docker build + `コマンドを使用して、 + -t + `フラグを使用してイメージをビルドします。これにより、覚えやすいタグを付けることができます名前。 この場合、Docker Hubのユーザー名で画像にタグを付けて、「++」または独自に選択した名前を付けます。

docker build -t / .

コマンドの「。」は、ビルドコンテキストが現在のディレクトリであることを指定します。

イメージの構築には1〜2分かかります。 完了したら、画像を確認します。

docker images

次の出力が表示されます。

OutputREPOSITORY                                TAG                 IMAGE ID            CREATED             SIZE
/node-kubernetes   latest              9c6f897e1fbc        3 seconds ago       90MB
node                                      10-alpine           94f3c8956482        12 days ago         71MB

次に、前提条件で作成したDocker Hubアカウントにログインします。

docker login -u

プロンプトが表示されたら、Docker Hubアカウントのパスワードを入力します。 この方法でログインすると、Docker Hubの資格情報を使用してユーザーのホームディレクトリに `+〜/ .docker / config.json`ファイルが作成されます。

https://docs.docker.com/engine/reference/commandline/push/[`docker push + `command]を使用して、アプリケーションイメージをDocker Hubにプッシュします。 `+`を自分のDocker Hubユーザー名に置き換えることを忘れないでください:

docker push /

これで、Kubernetesでアプリケーションを実行するためにプルできるアプリケーションイメージが作成されました。 次のステップは、アプリケーションサービス定義をKubernetesオブジェクトに変換することです。

ステップ3-komposeを使用してComposeサービスをKubernetesオブジェクトに変換する

ここで「+ docker-compose.yaml 」と呼ばれるDocker Composeファイルは、Composeでサービスを実行する定義をレイアウトします。 Composeの_service_は実行中のコンテナであり、_service definition_には各コンテナイメージの実行方法に関する情報が含まれています。 このステップでは、komposeを使用して ` yaml +`ファイルを作成することにより、これらの定義をKubernetesオブジェクトに変換します。 これらのファイルには、その_望ましい状態_を記述するKubernetesオブジェクトの_specs_が含まれます。

これらのファイルを使用して、さまざまなタイプのオブジェクトを作成します:https://kubernetes.io/docs/concepts/services-networking/service/[Services]。これにより、https://kubernetes.io/docs/conceptsコンテナを実行している/ workloads / pods / pod / [Pods]は引き続きアクセス可能です。 Deployments。Podの望ましい状態に関する情報が含まれます。 PersistentVolumeClaimを使用して、データベースデータのストレージをプロビジョニングします。実行時に注入される環境変数用のhttps://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/[ConfigMap]。アプリケーションのデータベースユーザーとパスワード用のhttps://kubernetes.io/docs/concepts/configuration/secret/[Secret] これらの定義の一部は、komposeが作成するファイルに含まれますが、他の定義は自分で作成する必要があります。

まず、 `+ docker-compose.yaml `ファイルの定義の一部をKubernetesで動作するように変更する必要があります。 ` nodejs +`サービス定義に新しく構築されたアプリケーションイメージへの参照を含め、https://docs.docker.com/storage/bind-mounts/ [bind mounts]、https:// docsを削除します。 docker.com/storage/volumes/[volumes]、および追加のhttps://docs.docker.com/compose/compose-file/#command[commands]を使用して、Composeで開発中のアプリケーションコンテナーを実行しました。 さらに、両方のコンテナの再起動ポリシーをhttps://github.com/kubernetes/kompose/blob/master/docs/user-guide.md#restart[Kubernetesが期待する動作]に合わせて再定義します。

`+ nano +`またはお気に入りのエディターでファイルを開きます:

nano docker-compose.yaml

`+ nodejs +`アプリケーションサービスの現在の定義は次のようになります。

〜/ node project / docker-compose.yml

...
services:
 nodejs:
   build:
     context: .
     dockerfile: Dockerfile
   image: nodejs
   container_name: nodejs
   restart: unless-stopped
   env_file: .env
   environment:
     - MONGO_USERNAME=$MONGO_USERNAME
     - MONGO_PASSWORD=$MONGO_PASSWORD
     - MONGO_HOSTNAME=db
     - MONGO_PORT=$MONGO_PORT
     - MONGO_DB=$MONGO_DB
   ports:
     - "80:8080"
   volumes:
     - .:/home/node/app
     - node_modules:/home/node/app/node_modules
   networks:
     - app-network
   command: ./wait-for.sh db:27017 -- /home/node/app/node_modules/.bin/nodemon app.js
...

サービス定義を次のように編集します。

  • ローカルの `+ Dockerfile `の代わりに `+`イメージを使用します。

  • コンテナの「+ restart」ポリシーを「+ unless-stopped」から「+ always +」に変更します。

  • `+ volumes `リストと ` command +`命令を削除します。

完成したサービス定義は次のようになります。

〜/ node project / docker-compose.yml

...
services:
 nodejs:
   image:
   container_name: nodejs
   restart:
   env_file: .env
   environment:
     - MONGO_USERNAME=$MONGO_USERNAME
     - MONGO_PASSWORD=$MONGO_PASSWORD
     - MONGO_HOSTNAME=db
     - MONGO_PORT=$MONGO_PORT
     - MONGO_DB=$MONGO_DB
   ports:
     - "80:8080"
   networks:
     - app-network
...

次に、「+ db +」サービス定義までスクロールダウンします。 ここで、次の編集を行います。

  • サービスの「+ restart 」ポリシーを「 always +」に変更します。

  • `+ .env `ファイルを削除します。 ` .env `ファイルの値を使用する代わりに、 ` MONGO_INITDB_ROOT_USERNAME `と ` MONGO_INITDB_ROOT_PASSWORD +`の値を、https://www.digitalocean.com/で作成するシークレットを使用してデータベースコンテナーに渡します。 community / tutorials / how-to-migrate-a-docker-compose-workflow-to-kubernetes#step-4-%E2%80%94-creating-kubernetes-secrets [ステップ4]。

`+ db +`サービスの定義は次のようになります。

〜/ node project / docker-compose.yml

...
 db:
   image: mongo:4.1.8-xenial
   container_name: db
   restart:
   environment:
     - MONGO_INITDB_ROOT_USERNAME=$MONGO_USERNAME
     - MONGO_INITDB_ROOT_PASSWORD=$MONGO_PASSWORD
   volumes:
     - dbdata:/data/db
   networks:
     - app-network
...

最後に、ファイルの下部で、トップレベルの「+ volumes 」キーから「 node_modules +」ボリュームを削除します。 キーは次のようになります。

〜/ node project / docker-compose.yml

...
volumes:
 dbdata:

編集が終了したら、ファイルを保存して閉じます。

サービス定義を翻訳する前に、komposeが非機密情報を使用してConfigMapを作成するために使用する `+ .env +`ファイルを記述する必要があります。 https://www.digitalocean.com/community/tutorials/containerizing-a-node-js-application-for-development-with-docker-compose#step-2-%E2%80%94-configuring-yourをご覧ください-application-to-work-with-containers [ステップ2]のhttps://www.digitalocean.com/community/tutorials/containerizing-a-node-js-application-for-development-with-docker-compose[Containerizingこのファイルの詳細については、Docker Composeを使用した開発用のNode.jsアプリケーション]を参照してください。

このチュートリアルでは、 + .env`を + .gitignore`ファイルに追加して、バージョン管理にコピーされないようにします。 これは、https:// wwwでhttps://github.com/do-community/node-mongo-docker-dev.git[node-mongo-docker-devリポジトリ]を複製したときにコピーオーバーしなかったことを意味します。 digitalocean.com/community/tutorials/how-to-migrate-a-docker-compose-workflow-to-kubernetes#step-2-%E2%80%94-cloning-and-packaging-the-application [ステップ2のこのチュートリアル]。 したがって、今すぐ再作成する必要があります。

ファイルを作成します。

nano .env

komposeはこのファイルを使用して、アプリケーションのConfigMapを作成します。 ただし、Composeファイルのすべての変数を `+ nodejs `サービス定義から割り当てる代わりに、 ` MONGO_DB `データベース名と ` MONGO_PORT +`のみを追加します。 https://www.digitalocean.com/community/tutorials/how-to-migrate-a-docker-compose-workflow-to-kubernetes#stepでシークレットオブジェクトを手動で作成するときに、データベースのユーザー名とパスワードを個別に割り当てます。 -4-%E2%80%94-creating-kubernetes-secrets [ステップ4]。

次のポートとデータベース名の情報を `+ .env +`ファイルに追加します。 必要に応じて、データベースの名前を自由に変更してください。

〜/ node_project / .env

MONGO_PORT=27017
MONGO_DB=

編集が終了したら、ファイルを保存して閉じます。

これで、オブジェクト仕様でファイルを作成する準備ができました。 komposeは、リソースを翻訳するためのhttps://github.com/kubernetes/kompose/blob/master/docs/user-guide.md [複数のオプション]を提供しています。 あなたはできる:

  • `+ kompose convert `を使用して、 ` docker-compose.yaml `ファイルのサービス定義に基づいて ` yaml +`ファイルを作成します。

  • `+ kompose up +`でKubernetesオブジェクトを直接作成します。

  • `+ kompose convert -c +`を使用してhttps://helm.sh/[Helm]チャートを作成します。

ここでは、サービス定義を `+ yaml +`ファイルに変換し、komposeが作成するファイルに追加して修正します。

次のコマンドを使用して、サービス定義を `+ yaml +`ファイルに変換します。

kompose convert

`+ -f +`フラグを使用して、特定のまたは複数のComposeファイルに名前を付けることもできます。

このコマンドを実行すると、komposeは作成したファイルに関する情報を出力します。

OutputINFO Kubernetes file "nodejs-service.yaml" created
INFO Kubernetes file "db-deployment.yaml" created
INFO Kubernetes file "dbdata-persistentvolumeclaim.yaml" created
INFO Kubernetes file "nodejs-deployment.yaml" created
INFO Kubernetes file "nodejs-env-configmap.yaml" created

これらには、Node Application Service、Deployment、およびConfigMapの仕様とともに、 + dbdata + PersistentVolumeClaimおよびMongoDBデータベースのデプロイメントの仕様を持つ `+ yaml +`ファイルが含まれます。

これらのファイルは良い出発点ですが、アプリケーションの機能がhttps://www.digitalocean.com/community/tutorials/containerizing-a-node-js-application-for-development-withで説明されているセットアップと一致するようにするため-docker-compose [Docker Composeによる開発用のNode.jsアプリケーションのコンテナ化] komposeが生成したファイルにいくつかの追加と変更を加える必要があります。

ステップ4-Kubernetesシークレットの作成

アプリケーションが期待どおりに機能するためには、komposeが作成したファイルにいくつかの変更を加える必要があります。 これらの変更の最初は、データベースユーザーとパスワードのシークレットを生成し、それをアプリケーションとデータベースのデプロイメントに追加することです。 Kubernetesは、環境変数を操作する2つの方法、ConfigMapsとSecretsを提供します。 komposeは、 `+ .env +`ファイルに含めた非機密情報を使用してConfigMapをすでに作成しているため、データベースのユーザー名とパスワードという機密情報を使用してSecretを作成します。

シークレットを手動で作成する最初の手順は、ユーザー名とパスワードをhttps://en.wikipedia.org/wiki/Base64[base64]に変換することです。これは、バイナリデータを含むデータを均一に送信できるようにするエンコードスキームです。

データベースのユーザー名を変換します。

echo -n '' | base64

出力に表示される値を書き留めます。

次に、パスワードを変換します。

echo -n '' | base64

ここの出力の値にも注意してください。

シークレットのファイルを開きます。

nano secret.yaml

次のコードをファイルに追加して、作成したエンコード値を使用して `+ MONGO_USERNAME `と ` MONGO_PASSWORD +`を定義するシークレットを作成します。 ここでダミーの値を*エンコードされた*ユーザー名とパスワードに置き換えてください:

〜/ node_project / secret.yaml

apiVersion: v1
kind: Secret
metadata:
 name:
data:
 MONGO_USERNAME:
 MONGO_PASSWORD:

Secretオブジェクトに「++」という名前を付けましたが、好きな名前を自由に付けることができます。

編集が終了したら、このファイルを保存して閉じます。 `+ .env `ファイルで行ったように、 ` .gitignore `ファイルに ` secret.yaml +`を追加して、バージョン管理から外してください。

`+ secret.yaml +`を記述したら、次のステップは、アプリケーションポッドとデータベースポッドの両方がファイルに追加した値を使用するようにすることです。 まず、アプリケーションの展開にシークレットへの参照を追加します。

`+ nodejs-deployment.yaml +`というファイルを開きます:

nano nodejs-deployment.yaml

ファイルのコンテナ仕様には、 `+ env +`キーの下で定義された次の環境変数が含まれます。

〜/ node_project / nodejs-deployment.yaml

apiVersion: extensions/v1beta1
kind: Deployment
...
   spec:
     containers:
     - env:
       - name: MONGO_DB
         valueFrom:
           configMapKeyRef:
             key: MONGO_DB
             name: nodejs-env
       - name: MONGO_HOSTNAME
         value: db
       - name: MONGO_PASSWORD
       - name: MONGO_PORT
         valueFrom:
           configMapKeyRef:
             key: MONGO_PORT
             name: nodejs-env
       - name: MONGO_USERNAME

ここにリストされている変数「+ MONGO_USERNAME 」および「 MONGO_PASSWORD 」にシークレットへの参照を追加して、アプリケーションがそれらの値にアクセスできるようにする必要があります。 ` MONGO_DB `と ` MONGO_PORT `の値の場合のように ` nodejs-env ` ConfigMapを指す ` configMapKeyRef `キーを含める代わりに、 ` secretKeyRef `キーを含めて「+」シークレットの値を指します。

`+ MONGO_USERNAME `および ` MONGO_PASSWORD +`変数に次のシークレット参照を追加します。

〜/ node_project / nodejs-deployment.yaml

apiVersion: extensions/v1beta1
kind: Deployment
...
   spec:
     containers:
     - env:
       - name: MONGO_DB
         valueFrom:
           configMapKeyRef:
             key: MONGO_DB
             name: nodejs-env
       - name: MONGO_HOSTNAME
         value: db
       - name: MONGO_PASSWORD




       - name: MONGO_PORT
         valueFrom:
           configMapKeyRef:
             key: MONGO_PORT
             name: nodejs-env
       - name: MONGO_USERNAME

編集が終了したら、ファイルを保存して閉じます。

次に、同じ値を `+ db-deployment.yaml +`ファイルに追加します。

ファイルを編集用に開きます。

nano db-deployment.yaml

このファイルでは、次の変数キーのシークレットへの参照を追加します: + MONGO_INITDB_ROOT_USERNAME +`および `+ MONGO_INITDB_ROOT_PASSWORD +。 `+ mongo `イメージは、これらの変数を使用可能にして、データベースインスタンスの初期化を変更できるようにします。 ` MONGO_INITDB_ROOT_USERNAME `と ` MONGO_INITDB_ROOT_PASSWORD `は一緒に ` admin `認証データベースに ` root +`ユーザーを作成し、データベースコンテナーの起動時に認証が有効になるようにします。

シークレットに設定した値を使用すると、データベースインスタンスでhttps://docs.mongodb.com/manual/reference/built-in-roles/#root [`+ root +`権限]を持つアプリケーションユーザーが確実に保持されます。 、そのロールのすべての管理特権および操作特権にアクセスできます。 本番環境で作業する場合は、適切なスコープの特権を持つ専用のアプリケーションユーザーを作成する必要があります。

`+ MONGO_INITDB_ROOT_USERNAME `および ` MONGO_INITDB_ROOT_PASSWORD +`変数の下に、Secret値への参照を追加します。

〜/ node_project / db-deployment.yaml

apiVersion: extensions/v1beta1
kind: Deployment
...
   spec:
     containers:
     - env:
       - name: MONGO_INITDB_ROOT_PASSWORD




       - name: MONGO_INITDB_ROOT_USERNAME




       image: mongo:4.1.8-xenial
...

編集が終了したら、ファイルを保存して閉じます。

シークレットを設定したら、データベースサービスの作成に進み、アプリケーションコンテナが完全にセットアップされて初期化された後にのみデータベースへの接続を試行するようにします。

手順5-データベースサービスとアプリケーション初期化コンテナの作成

シークレットを取得したので、データベースサービスとhttps://kubernetes.io/docs/concepts/workloads/pods/init-containers/[Init Container]の作成に進み、このサービスをポーリングしてアプリケーションは、 `+ MONGO_INITDB +`ユーザーとパスワードの作成を含むデータベースの起動タスクが完了すると、データベースへの接続のみを試みます。

Composeでこの機能を実装する方法については、https://www.digitalocean.com/community/tutorials/containerizing-a-node-js-application-for-development-with-docker-compose#step-をご覧ください。 4-%E2%80%94-defining-services-with-docker-compose [Step 4] of https://www.digitalocean.com/community/tutorials/containerizing-a-node-js-application-for-development -with-docker-compose [Docker Composeを使用した開発用Node.jsアプリケーションのコンテナ化]。

ファイルを開いて、データベースサービスの仕様を定義します。

nano db-service.yaml

次のコードをファイルに追加して、サービスを定義します。

〜/ node_project / db-service.yaml

apiVersion: v1
kind: Service
metadata:
 annotations:
   kompose.cmd: kompose convert
   kompose.version: 1.18.0 (06a2e56)
 creationTimestamp: null
 labels:
   io.kompose.service: db
 name: db
spec:
 ports:
 - port: 27017
   targetPort: 27017
 selector:
   io.kompose.service: db
status:
 loadBalancer: {}

ここに含まれる「+ selector 」は、このサービスオブジェクトをデータベースポッドと一致させます。データベースポッドは、「 db-deployment.yaml 」ファイルでkomposeによってラベル「 io.kompose.service:db 」で定義されています。 このサービスには「 db +」という名前を付けました。

編集が終了したら、ファイルを保存して閉じます。

次に、Init Containerフィールドを、 `+ nodejs-deployment.yaml `の ` containers `配列に追加しましょう。 これにより、 ` db +`サービスが到達可能なPodで作成されるまで、アプリケーションコンテナの起動を遅らせるために使用できる初期化コンテナが作成されます。 これは、Init Containersの可能な用途の1つです。他のユースケースの詳細については、https://kubernetes.io/docs/concepts/workloads/pods/init-containers/#what-c​​an-init-containers-be-used-for [公式ドキュメント]をご覧ください。

`+ nodejs-deployment.yaml +`ファイルを開きます:

nano nodejs-deployment.yaml

Pod仕様内で、 `+ containers `配列とともに、 ` db `サービスをポーリングするコンテナーを含む ` initContainers +`フィールドを追加します。

+ ports +`および `+ resources +`フィールドの下、および `+ nodejs + `+ containers `配列の ` restartPolicy +`の上に次のコードを追加します。

〜/ node_project / nodejs-deployment.yaml

apiVersion: extensions/v1beta1
kind: Deployment
...
   spec:
     containers:
     ...
       name: nodejs
       ports:
       - containerPort: 8080
       resources: {}




     restartPolicy: Always
...

このInit Containerは、多くのUNIXユーティリティを含む軽量イメージであるhttps://hub.docker.com/_/busybox[BusyBox image]を使用します。 この場合、https://www.digitalocean.com/community/tutorials/how-to-use-netcat-to-establish-and-test-tcp-and-udp-connections-on-aを使用します-vps [+ netcat +]ユーティリティは、 `+ db `サービスに関連付けられたポッドがポート ` 27017 +`でTCP接続を受け入れているかどうかをポーリングします。

このコンテナ + command +`は、httpsの `+ docker-compose.yaml +`ファイルから削除したhttps://github.com/Eficode/wait-for [+ wait-for `]スクリプトの機能を複製します。 //www.digitalocean.com/community/tutorials/how-to-migrate-a-docker-compose-workflow-to-kubernetes#step-3-%E2%80%94-translating-compose-services-to-kubernetes -objects-with-kompose [ステップ3]。 Composeで作業するときにアプリケーションが「 wait-for +」スクリプトを使用した方法と理由の詳細については、https://www.digitalocean.com/community/tutorials/containerizing-a-node-js-application-を参照してくださいfor-development-with-docker-compose#step-4-%E2%80%94-defining-services-with-docker-compose [Step 4] of https://www.digitalocean.com/community/tutorials/containerizing -a-node-js-application-for-development-with-docker-compose [Docker Composeを使用した開発用のNode.jsアプリケーションのコンテナ化]。

Init Containersは完了するまで実行されます。私たちの場合、これは、データベースコンテナが実行され、ポート「27017」で接続を受け入れるまで、Nodeアプリケーションコンテナが起動しないことを意味します。 `+ db +`サービスの定義により、データベースコンテナーの正確な場所に関係なく、この機能を保証できます。これは可変です。

編集が終了したら、ファイルを保存して閉じます。

データベースサービスを作成し、コンテナの起動順序を制御するためにInit Containerを配置したら、PersistentVolumeClaimのストレージ要件の確認に進み、https://kubernetes.io/docs/conceptsを使用してアプリケーションサービスを公開します。 / services-networking / service /#loadbalancer [LoadBalancer]。

手順6-PersistentVolumeClaimの変更とアプリケーションフロントエンドの公開

アプリケーションを実行する前に、データベースストレージが適切にプロビジョニングされ、LoadBalancerを使用してアプリケーションフロントエンドを公開できるようにするために、2つの最終変更を行います。

まず、komposeが作成したPersistentVolumeClaimで定義されている + storage + https://kubernetes.io/docs/concepts/storage/persistent-volumes/#resources [+ resource +]を変更します。 この申し立てにより、https://kubernetes.io/docs/concepts/storage/persistent-volumes/#resources [動的にプロビジョニング]ストレージを使用して、アプリケーションの状態を管理できます。

PersistentVolumeClaimsを使用するには、https://kubernetes.io/docs/concepts/storage/storage-classes/ [StorageClass]を作成して構成し、ストレージリソースをプロビジョニングする必要があります。 この場合、https://www.digitalocean.com/products/kubernetes/ [DigitalOcean Kubernetes]で作業しているため、デフォルトのStorageClass `+ provisioner `は ` dobs.csi.digitalocean.com +`に設定されます-https ://www.digitalocean.com/products/block-storage/ [DigitalOceanブロックストレージ]。

これを確認するには、次のように入力します。

kubectl get storageclass

DigitalOceanクラスターを使用している場合、次の出力が表示されます。

OutputNAME                         PROVISIONER                 AGE
do-block-storage (default)   dobs.csi.digitalocean.com   76m

DigitalOceanクラスターを使用していない場合は、StorageClassを作成し、選択した「+ provisioner +」を設定する必要があります。 これを行う方法の詳細については、https://kubernetes.io/docs/concepts/storage/storage-classes/ [公式ドキュメント]を参照してください。

komposeが + dbdata-persistentvolumeclaim.yaml +`を作成したとき、 `+ provisioner`の最小サイズ要件を満たさないサイズに + storage` `+ resource`を設定します。 したがって、PersistentVolumeClaimを変更して、https://www.digitalocean.com/docs/volumes/overview/ [最小の実行可能なDigitalOceanブロックストレージユニット]:1GBを使用する必要があります。 ストレージ要件に合わせてこれを自由に変更してください。

`+ dbdata-persistentvolumeclaim.yaml +`を開きます:

nano dbdata-persistentvolumeclaim.yaml

`+ storage `の値を `+`に置き換えます:

〜/ node_project / dbdata-persistentvolumeclaim.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 creationTimestamp: null
 labels:
   io.kompose.service: dbdata
 name: dbdata
spec:
 accessModes:
 - ReadWriteOnce
 resources:
   requests:
     storage:
status: {}

また、「+ accessMode 」に注意してください。「 ReadWriteOnce +」は、このクレームの結果としてプロビジョニングされたボリュームが単一のノードによってのみ読み取り/書き込みされることを意味します。 さまざまなアクセスモードの詳細については、https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes [ドキュメント]をご覧ください。

完了したら、ファイルを保存して閉じます。

次に、 `+ nodejs-service.yaml +`を開きます:

nano nodejs-service.yaml

DigitalOcean Load Balancerを使用して、このサービスを外部に公開します。 DigitalOceanクラスターを使用していない場合、クラウドプロバイダーの関連ドキュメントを参照して、ロードバランサーに関する情報を確認してください。 または、https://kubernetes.io/docs/reference/setupを使用して高可用性クラスターをセットアップする際に、公式のhttps://kubernetes.io/docs/setup/independent/high-availability/[Kubernetes documentation]に従うことができます-tools / kubeadm / kubeadm / [+ kubeadm +]。ただし、この場合、PersistentVolumeClaimsを使用してストレージをプロビジョニングすることはできません。

サービス仕様内で、サービス「+ type」として「+ Load Balancer」を指定します。

〜/ node_project / nodejs-service.yaml

apiVersion: v1
kind: Service
...
spec:

 ports:
...

`+ nodejs +`サービスを作成すると、ロードバランサーが自動的に作成され、アプリケーションにアクセスできる外部IPが提供されます。

編集が終了したら、ファイルを保存して閉じます。

すべてのファイルを配置したら、アプリケーションを開始してテストする準備ができました。

ステップ7-アプリケーションの開始とアクセス

Kubernetesオブジェクトを作成し、アプリケーションが期待どおりに動作することをテストします。

定義したオブジェクトを作成するには、https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#create [+ kubectl create +]に `+ -f +`フラグを付けて使用します。これにより、komposeが作成したファイルと、作成したファイルを指定できます。 次のコマンドを実行して、Secret、ConfigMap、およびPersistentVolumeClaimとともにNodeアプリケーションとMongoDBデータベースサービスおよびデプロイメントを作成します。

kubectl create -f nodejs-service.yaml,nodejs-deployment.yaml,nodejs-env-configmap.yaml,db-service.yaml,db-deployment.yaml,dbdata-persistentvolumeclaim.yaml,secret.yaml

オブジェクトが作成されたことを示す次の出力が表示されます。

Outputservice/nodejs created
deployment.extensions/nodejs created
configmap/nodejs-env created
service/db created
deployment.extensions/db created
persistentvolumeclaim/dbdata created
secret/mongo-secret created

ポッドが実行されていることを確認するには、次を入力します。

kubectl get pods

`+ default `名前空間にオブジェクトを作成したため、ここでhttps://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/[Namespace]を指定する必要はありません。 複数のネームスペースを使用している場合は、このコマンドを実行するときに、ネームスペースの名前とともに ` -n +`フラグを必ず含めてください。

`+ db +`コンテナが起動し、アプリケーションのInit Containerが実行されている間、次の出力が表示されます。

OutputNAME                      READY   STATUS              RESTARTS   AGE
db-679d658576-kfpsl       0/1     ContainerCreating   0          10s
nodejs-6b9585dc8b-pnsws   0/1     Init:0/1            0          10s

そのコンテナーが実行され、アプリケーションとデータベースのコンテナーが開始されると、次の出力が表示されます。

OutputNAME                      READY   STATUS    RESTARTS   AGE
db-679d658576-kfpsl       1/1     Running   0          54s
nodejs-6b9585dc8b-pnsws   1/1     Running   0          54s

+ Running` + STATUS`は、ポッドがノードにバインドされており、それらのポッドに関連付けられたコンテナが実行されていることを示します。 `+ READY +`は、Podで実行されているコンテナの数を示します。 詳細については、https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/ [Podライフサイクルに関するドキュメント]を参照してください。

コンテナを実行すると、アプリケーションにアクセスできるようになります。 LoadBalancerのIPを取得するには、次を入力します。

kubectl get svc

次の出力が表示されます。

OutputNAME         TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)        AGE
db           ClusterIP      10.245.189.250   <none>           27017/TCP      93s
kubernetes   ClusterIP      10.245.0.1       <none>           443/TCP        25m12s
nodejs       LoadBalancer   10.245.15.56            80:30729/TCP   93s

`+ nodejs `サービスに関連付けられた ` EXTERNAL_IP `は、アプリケーションにアクセスできるIPアドレスです。 ` EXTERNAL_IP `カラムに ` <pending> +`ステータスが表示される場合、これはロードバランサーがまだ作成されていることを意味します。

その列にIPが表示されたら、ブラウザーでそのアドレスに移動します: + http:// +

次のランディングページが表示されます。

image:https://assets.digitalocean.com/articles/docker_node_image/landing_page.png [アプリケーションのランディングページ]

  • Get Shark Info *ボタンをクリックします。 サメの名前とそのサメの一般的なキャラクターの説明を入力できるエントリフォームのページが表示されます。

image:https://assets.digitalocean.com/articles/node_mongo/shark_form.png [サメ情報フォーム]

フォームに、選択したサメを追加します。 デモンストレーションのため、「Shark Name」フィールドに「」を追加し、「Shark Character」フィールドに「」を追加します。

image:https://assets.digitalocean.com/articles/node_mongo/shark_filled.png [サメの塗りつぶしフォーム]

[送信]ボタンをクリックします。 このサメの情報が表示されたページが表示されます:

image:https://assets.digitalocean.com/articles/node_mongo/shark_added.png [サメ出力]

これで、Kubernetesクラスターで実行されているMongoDBデータベースを使用したNode.jsアプリケーションの単一インスタンスのセットアップができました。

結論

このチュートリアルで作成したファイルは、本番環境に移行する際のビルドの出発点として適しています。 アプリケーションを開発するときに、次の実装に取り​​組むことができます。

  • 集中ログおよび監視https://www.digitalocean.com/community/tutorials/modernizingのhttps://www.digitalocean.com/community/tutorials/modernizing-applications-for-kubernetes#deploying-on-kubernetes [関連するディスカッション]をご覧ください。 -applications-for-kubernetes [Kubernetesのアプリケーションの近代化]一般的な概要。 https://www.digitalocean.com/community/tutorials/how-to-set-up-an-elasticsearch-fluentd-and-kibana-efk-logging-stack-on-kubernetes [設定方法]もご覧ください。 https://www.elastic.co/ [Elasticsearch]、https://www.fluentd.org/ [でロギングスタックを設定する方法を学ぶために、Elasticsearch、FluentdおよびKibana(EFK)ロギングスタックをKubernetesにアップ] Fluentd]、およびhttps://www.elastic.co/products/kibana[Kibana]。 また、https://istio.io/ [Istioのようなサービスメッシュの詳細については、https://www.digitalocean.com/community/tutorials/an-introduction-to-service-meshes [サービスメッシュの概要]も参照してください。 ]この機能を実装します。

  • トラフィックをクラスターにルーティングするためのIngressリソース。 これは、それぞれ独自のLoadBalancerを必要とする複数のサービスを実行している場合、またはアプリケーションレベルのルーティング戦略(A / Bおよびカナリアテストなど)を実装する場合に、LoadBalancerの代替として適しています。 詳細については、https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nginx-ingress-with-cert-manager-on-digitalocean-kubernetes [セットアップ方法]をご覧ください。 DigitalOcean KubernetesのCert-Managerを使用したNginx Ingress]およびhttps://www.digitalocean.com/community/tutorials/an-introduction-to-service-meshes#routing-and-traffic-configuration [関連ディスカッション]ルーティングhttps://www.digitalocean.com/community/tutorials/an-introduction-to-service-meshes [サービスメッシュの概要]のサービスメッシュコンテキストで。

  • * Kubernetesオブジェクトのバックアップ戦略*。 DigitalOceanのKubernetes製品でhttps://github.com/heptio/velero[Velero](以前のHeptio Ark)を使用してバックアップを実装する方法については、https://www.digitalocean.com/community/tutorials/how-to-を参照してください。バックアップおよび復元-a-kubernetes-cluster-on-digitalocean-using-heptio-ark [Heptio Arkを使用してDigitalOceanでKubernetesクラスターをバックアップおよび復元する方法]。