これは、このセクションの複数ページの印刷可能なビューです。 印刷するには、ここをクリックしてください.

このページの通常のビューに戻る.

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

1 - Deploymentを作成するためにkubectlを使う

目標

  • アプリケーションのデプロイについて学ぶ。
  • kubectlを使って、Kubernetes上にはじめてのアプリケーションをデプロイする。

KubernetesのDeployment

実行中のKubernetesクラスターを入手すると、その上にコンテナ化アプリケーションをデプロイすることができます。 そのためには、KubernetesのDeploymentの設定を作成します。 DeploymentはKubernetesにあなたのアプリケーションのインスタンスを作成し、更新する方法を指示します。 Deploymentを作成すると、KubernetesコントロールプレーンはDeployment内に含まれるアプリケーションインスタンスをクラスター内の個々のノードで実行するようにスケジュールします。

アプリケーションインスタンスが作成されると、Kubernetes Deploymentコントローラーは、それらのインスタンスを継続的に監視します。 インスタンスをホストしているノードが停止、削除された場合、Deploymentコントローラーはそのインスタンスをクラスター内の別のノード上のインスタンスと置き換えます。 これは、マシンの故障やメンテナンスに対処するためのセルフヒーリングの仕組みを提供しています。

オーケストレーションが登場する前の世界では、インストールスクリプトを使用してアプリケーションを起動することはよくありましたが、マシン障害が発生した場合に復旧する事はできませんでした。 アプリケーションのインスタンスを作成し、それらをノード間で実行し続けることで、Kubernetes Deploymentはアプリケーションの管理に根本的に異なるアプローチを提供します。

Kubernetes上にはじめてのアプリケーションをデプロイする

Kubernetesのコマンドラインインターフェースであるkubectlを使用して、Deploymentを作成、管理できます。 kubectlはKubernetes APIを使用してクラスターと対話します。 このモジュールでは、Kubernetesクラスターでアプリケーションを実行するDeploymentを作成するために必要な、最も一般的なkubectlコマンドについて学びます。

Deploymentを作成するときは、アプリケーションのコンテナイメージと実行するレプリカの数を指定する必要があります。 Deploymentを更新することで、あとでその情報を変更できます。 ブートキャンプのModule 5Module 6では、Deploymentをどのようにスケール、更新できるかについて説明します。

最初のDeploymentには、NGINXを使用して全てのリクエストをエコーバックする、Dockerコンテナにパッケージ化されたhello-nodeアプリケーションを使用します。 (まだhello-nodeアプリケーションを作成して、コンテナを使用してデプロイしていない場合、Hello Minikube tutorialの通りにやってみましょう。)

kubectlもインストールされている必要があります。 インストールが必要な場合は、ツールのインストールからインストールしてください。

Deploymentが何であるかがわかったので、最初のアプリケーションをデプロイしましょう!

kubectlの基本

kubectlコマンドの一般的な書式はkubectl action resourceです。

これは指定された resource(nodedeploymentなど)に対して指定された action(createdescribedeleteなど)を実行します。 指定可能なパラメーターに関する追加情報を取得するために、サブコマンドの後に--helpを使うこともできます(例:kubectl get nodes --help)。

kubectl versionコマンドを実行して、kubectlがクラスターと通信できるように設定されていることを確認してください。

kubectlがインストールされていて、クライアントとサーバーの両方のバージョンを確認できることを確認してください。

クラスター内のノードを表示するには、kubectl get nodesコマンドを実行します。

利用可能なノードが表示されます。 後で、KubernetesはNodeの利用可能なリソースに基づいてアプリケーションをデプロイする場所を選択します。

アプリケーションをデプロイする

最初のアプリケーションをkubectl create deploymentコマンドでKubernetesにデプロイしてみましょう。 デプロイ名とアプリケーションイメージの場所を指定する必要があります(Docker Hub外でホストされているイメージはリポジトリの完全なURLを含める必要があります)。

kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1

素晴らしい!Deploymentを作成して、最初のアプリケーションをデプロイしました。 これによっていくつかのことが実行されました。

  • アプリケーションのインスタンスを実行可能な適切なノードを探しました(利用可能なノードは1つしかない)。
  • アプリケーションをそのノードで実行するためのスケジュールを行いました。
  • 必要な場合にインスタンスを新しいノードで再スケジュールするような設定を行いました。

Deploymentの一覧を得るにはkubectl get deploymentsコマンドを使います。

kubectl get deployments

アプリケーションの単一のインスタンスを実行しているDeploymentが1つあることが分かります。 インスタンスはノード上のコンテナ内で実行されています。

アプリケーションを見る

Kubernetes内部で動作しているPodは、プライベートに隔離されたネットワーク上で動作しています。 デフォルトでは、同じKubernetesクラスター内の他のPodやServiceからは見えますが、そのネットワークの外からは見えません。 kubectlを使用する場合、アプリケーションと通信するためにAPIエンドポイントを通じてやりとりしています。

アプリケーションをKubernetesクラスターの外部に公開するための他のオプションについては、後ほどModule 4で説明します。 また、これは基本的なチュートリアルであるため、ここではPodとは何かについては詳しく説明しません。

kubectl proxyコマンドによって、通信をクラスター全体のプライベートネットワークに転送するプロキシを作成することができます。 プロキシはcontrol-Cキーを押すことで終了させることができ、実行中は何も出力されません。

プロキシを実行するにはもう一つターミナルウィンドウを開く必要があります。

kubectl proxy

ホスト(端末)とKubernetesクラスター間の接続ができました。 プロキシによって端末からAPIへの直接アクセスが可能となります。

プロキシエンドポイントを通してホストされている全てのAPIを確認することができます。 例えば、curlコマンドを使って、APIを通じて直接バージョンを調べることができます。

curl http://localhost:8001/version

APIサーバーはPod名に基づいて各Pod用のエンドポイントを自動的に作成し、プロキシからもアクセスできるようにします。

まずPod名を取得する必要があるので、環境変数POD_NAMEに格納しておきます。

export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
echo Name of the Pod: $POD_NAME

以下を実行することで、プロキシされたAPIを通してPodにアクセスすることができます。

curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME:8080/proxy/

プロキシを使わずに新しいDeploymentにアクセスするには、Module 4で説明するServiceが必要です。

次の項目