|
| 1 | +--- |
| 2 | +title: Deploymentを作成するためにkubectlを使う |
| 3 | +weight: 10 |
| 4 | +--- |
| 5 | + |
| 6 | +## {{% heading "objectives" %}} |
| 7 | + |
| 8 | +* アプリケーションのデプロイについて学ぶ。 |
| 9 | +* kubectlを使って、Kubernetes上にはじめてのアプリケーションをデプロイする。 |
| 10 | + |
| 11 | +## KubernetesのDeployment |
| 12 | + |
| 13 | +{{% alert %}} |
| 14 | +_Deploymentは、アプリケーションのインスタンスを作成および更新する責務があります。_ |
| 15 | +{{% /alert %}} |
| 16 | + |
| 17 | +{{< note >}} |
| 18 | +このチュートリアルでは、AMD64アーキテクチャを必要とするコンテナを使用します。 |
| 19 | +異なるCPUアーキテクチャのコンピューターでminikubeを使用する場合は、AMD64をエミュレートできるドライバーでminikubeを使用してみてください。 |
| 20 | +例えば、Docker Desktopドライバーはこれが可能です。 |
| 21 | +{{< /note >}} |
| 22 | + |
| 23 | +[実行中のKubernetesクラスター](/docs/tutorials/kubernetes-basics/create-cluster/cluster-intro/)を入手すると、その上にコンテナ化アプリケーションをデプロイすることができます。 |
| 24 | +そのためには、Kubernetesの**Deployment**の設定を作成します。 |
| 25 | +DeploymentはKubernetesにあなたのアプリケーションのインスタンスを作成し、更新する方法を指示します。 |
| 26 | +Deploymentを作成すると、KubernetesコントロールプレーンはDeployment内に含まれるアプリケーションインスタンスをクラスター内の個々のノードで実行するようにスケジュールします。 |
| 27 | + |
| 28 | +アプリケーションインスタンスが作成されると、Kubernetes Deploymentコントローラーは、それらのインスタンスを継続的に監視します。 |
| 29 | +インスタンスをホストしているノードが停止、削除された場合、Deploymentコントローラーはそのインスタンスをクラスター内の別のノード上のインスタンスと置き換えます。 |
| 30 | +**これは、マシンの故障やメンテナンスに対処するためのセルフヒーリングの仕組みを提供しています。** |
| 31 | + |
| 32 | +オーケストレーションが登場する前の世界では、インストールスクリプトを使用してアプリケーションを起動することはよくありましたが、マシン障害が発生した場合に復旧する事はできませんでした。 |
| 33 | +アプリケーションのインスタンスを作成し、それらをノード間で実行し続けることで、Kubernetes Deploymentはアプリケーションの管理に根本的に異なるアプローチを提供します。 |
| 34 | + |
| 35 | +## Kubernetes上にはじめてのアプリケーションをデプロイする |
| 36 | + |
| 37 | +{{% alert %}} |
| 38 | +_Kubernetesにデプロイするには、アプリケーションをサポートされているコンテナ形式のいずれかにパッケージ化する必要があります。_ |
| 39 | +{{% /alert %}} |
| 40 | + |
| 41 | +{{< figure src="/docs/tutorials/kubernetes-basics/public/images/module_02_first_app.svg" class="diagram-medium" >}} |
| 42 | + |
| 43 | +Kubernetesのコマンドラインインターフェースである[kubectl](/docs/reference/kubectl/)を使用して、Deploymentを作成、管理できます。 |
| 44 | +`kubectl`はKubernetes APIを使用してクラスターと対話します。 |
| 45 | +このモジュールでは、Kubernetesクラスターでアプリケーションを実行するDeploymentを作成するために必要な、最も一般的な`kubectl`コマンドについて学びます。 |
| 46 | + |
| 47 | +Deploymentを作成するときは、アプリケーションのコンテナイメージと実行するレプリカの数を指定する必要があります。 |
| 48 | +Deploymentを更新することで、あとでその情報を変更できます。 |
| 49 | +ブートキャンプの[Module 5](/docs/tutorials/kubernetes-basics/scale/scale-intro/)と[Module 6](/docs/tutorials/kubernetes-basics/update/update-intro/)では、Deploymentをどのようにスケール、更新できるかについて説明します。 |
| 50 | + |
| 51 | +最初のDeploymentには、NGINXを使用して全てのリクエストをエコーバックする、Dockerコンテナにパッケージ化されたhello-nodeアプリケーションを使用します。 |
| 52 | +(まだhello-nodeアプリケーションを作成して、コンテナを使用してデプロイしていない場合、[Hello Minikube tutorial](/ja/docs/tutorials/hello-minikube/)の通りにやってみましょう。) |
| 53 | + |
| 54 | +kubectlもインストールされている必要があります。 |
| 55 | +インストールが必要な場合は、[ツールのインストール](/docs/tasks/tools/#kubectl)からインストールしてください。 |
| 56 | + |
| 57 | +Deploymentが何であるかがわかったので、最初のアプリケーションをデプロイしましょう! |
| 58 | + |
| 59 | +### kubectlの基本 |
| 60 | + |
| 61 | +kubectlコマンドの一般的な書式は`kubectl action resource`です。 |
| 62 | + |
| 63 | +これは指定された _resource_(`node`、`deployment`など)に対して指定された _action_(`create`、`describe`、`delete`など)を実行します。 |
| 64 | +指定可能なパラメーターに関する追加情報を取得するために、サブコマンドの後に`--help`を使うこともできます(例:`kubectl get nodes --help`)。 |
| 65 | + |
| 66 | +`kubectl version`コマンドを実行して、kubectlがクラスターと通信できるように設定されていることを確認してください。 |
| 67 | + |
| 68 | +kubectlがインストールされていて、クライアントとサーバーの両方のバージョンを確認できることを確認してください。 |
| 69 | + |
| 70 | +クラスター内のノードを表示するには、`kubectl get nodes`コマンドを実行します。 |
| 71 | + |
| 72 | +利用可能なノードが表示されます。 |
| 73 | +後で、KubernetesはNodeの利用可能なリソースに基づいてアプリケーションをデプロイする場所を選択します。 |
| 74 | + |
| 75 | +### アプリケーションをデプロイする |
| 76 | + |
| 77 | +最初のアプリケーションを`kubectl create deployment`コマンドでKubernetesにデプロイしてみましょう。 |
| 78 | +デプロイ名とアプリケーションイメージの場所を指定する必要があります(Docker Hub外でホストされているイメージはリポジトリの完全なURLを含める必要があります)。 |
| 79 | + |
| 80 | +```shell |
| 81 | +kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 |
| 82 | +``` |
| 83 | + |
| 84 | +素晴らしい!Deploymentを作成して、最初のアプリケーションをデプロイしました。 |
| 85 | +これによっていくつかのことが実行されました。 |
| 86 | + |
| 87 | +* アプリケーションのインスタンスを実行可能な適切なノードを探しました(利用可能なノードは1つしかない)。 |
| 88 | +* アプリケーションをそのノードで実行するためのスケジュールを行いました。 |
| 89 | +* 必要な場合にインスタンスを新しいノードで再スケジュールするような設定を行いました。 |
| 90 | + |
| 91 | +Deploymentの一覧を得るには`kubectl get deployments`コマンドを使います。 |
| 92 | + |
| 93 | +```shell |
| 94 | +kubectl get deployments |
| 95 | +``` |
| 96 | + |
| 97 | +アプリケーションの単一のインスタンスを実行しているDeploymentが1つあることが分かります。 |
| 98 | +インスタンスはノード上のコンテナ内で実行されています。 |
| 99 | + |
| 100 | +### アプリケーションを見る |
| 101 | + |
| 102 | +Kubernetes内部で動作している[Pod](/docs/concepts/workloads/pods/)は、プライベートに隔離されたネットワーク上で動作しています。 |
| 103 | +デフォルトでは、同じKubernetesクラスター内の他のPodやServiceからは見えますが、そのネットワークの外からは見えません。 |
| 104 | +`kubectl`を使用する場合、アプリケーションと通信するためにAPIエンドポイントを通じてやりとりしています。 |
| 105 | + |
| 106 | +アプリケーションをKubernetesクラスターの外部に公開するための他のオプションについては、後ほど[Module 4](/docs/tutorials/kubernetes-basics/expose/)で説明します。 |
| 107 | +また、これは基本的なチュートリアルであるため、ここでは`Pod`とは何かについては詳しく説明しません。 |
| 108 | + |
| 109 | +`kubectl proxy`コマンドによって、通信をクラスター全体のプライベートネットワークに転送するプロキシを作成することができます。 |
| 110 | +プロキシはcontrol-Cキーを押すことで終了させることができ、実行中は何も出力されません。 |
| 111 | + |
| 112 | +**プロキシを実行するにはもう一つターミナルウィンドウを開く必要があります。** |
| 113 | + |
| 114 | +```shell |
| 115 | +kubectl proxy |
| 116 | +``` |
| 117 | + |
| 118 | +ホスト(端末)とKubernetesクラスター間の接続ができました。 |
| 119 | +プロキシによって端末からAPIへの直接アクセスが可能となります。 |
| 120 | + |
| 121 | +プロキシエンドポイントを通してホストされている全てのAPIを確認することができます。 |
| 122 | +例えば、`curl`コマンドを使って、APIを通じて直接バージョンを調べることができます。 |
| 123 | + |
| 124 | +```shell |
| 125 | +curl http://localhost:8001/version |
| 126 | +``` |
| 127 | + |
| 128 | +{{< note >}} |
| 129 | +ポート8001にアクセスできない場合は、上で起動した`kube proxy`がもう一つのターミナルで実行されていることを確認してください。 |
| 130 | +{{< /note >}} |
| 131 | + |
| 132 | +APIサーバーはPod名に基づいて各Pod用のエンドポイントを自動的に作成し、プロキシからもアクセスできるようにします。 |
| 133 | + |
| 134 | +まずPod名を取得する必要があるので、環境変数`POD_NAME`に格納しておきます。 |
| 135 | + |
| 136 | +```shell |
| 137 | +export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}') |
| 138 | +echo Name of the Pod: $POD_NAME |
| 139 | +``` |
| 140 | + |
| 141 | +以下を実行することで、プロキシされたAPIを通してPodにアクセスすることができます。 |
| 142 | + |
| 143 | +```shell |
| 144 | +curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME:8080/proxy/ |
| 145 | +``` |
| 146 | + |
| 147 | +プロキシを使わずに新しいDeploymentにアクセスするには、[Module 4](/docs/tutorials/kubernetes-basics/expose/)で説明するServiceが必要です。 |
| 148 | + |
| 149 | +## {{% heading "whatsnext" %}} |
| 150 | + |
| 151 | +* チュートリアル [Podとノードについて](/docs/tutorials/kubernetes-basics/explore/explore-intro/) |
| 152 | +* [Deployment](/docs/concepts/workloads/controllers/deployment/)について詳しく学ぶ |
0 commit comments