Kubernetes入門 その２

##前回

[Kubernetes入門 その１](https://qiita.com/tomotomo3/items/bb1788d5ef22c3ec97d9)

Kubernetesのチュートリアルをまとめていきました。

##概要
今回は、[kubectlを使ったDeploymentの作成](https://kubernetes.io/ja/docs/tutorials/kubernetes-basics/deploy-app/deploy-intro/)をすすめていきます。

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

##Kubernetes Deploymentsとは？

>実行中のKubernetesクラスターを入手すると、その上にコンテナ化アプリケーションをデプロイすることができます。そのためには、KubernetesのDeployment の設定を作成します。

クラスターにアプリケーションコンテナをデプロイしていきますよね。
そのためには、KubernetesのDeploymentの設定が必要だと・・・・
ふむふむ。

>DeploymentはKubernetesにあなたのアプリケーションのインスタンスを作成し、更新する方法を指示します。

つまり、アプリケーションコンテナのインスタンスを作成・更新してくれることだと理解します。

>Deploymentを作成すると、Kubernetesマスターは指定されたアプリケーションインスタンスをクラスター内の個々のノードにスケジュールします。

Deploymentを作成すると、Kubernetesマスターが指定したアプリケーションコンテナインスタンスをクラスター内のノードに組み込んでくれるというイメージだと認識しました。

>アプリケーションインスタンスが作成されると、Kubernetes Deploymentコントローラーは、それらのインスタンスを継続的に監視します。

アプリケーションコンテナのインスタンスを作成・更新してくれるだけでなく、
監視までしてくれると！
ありがたい！！

>インスタンスをホストしているノードが停止、削除された場合、Deploymentコントローラーはそのインスタンスをクラスター内の別のノード上のインスタンスと置き換えます。

インスタンスしているノードが停止・削除された場合、Deploymentがクラスター内の別ノードにインスタンスするイメージを受けました。

>これは、マシンの故障やメンテナンスに対処するためのセルフヒーリングの仕組みを提供しています。

ありがとうございます。

>オーケストレーションが入る前の世界では、インストールスクリプトを使用してアプリケーションを起動することはよくありましたが、マシン障害が発生した場合に復旧する事はできませんでした。

VMwareのvMotionだと、別ホストに移行することで、復旧すると思いますが、
通常マシン障害で、自動復旧はしませんよね。

>アプリケーションのインスタンスを作成し、それらをノード間で実行し続けることで、Kubernetes Deploymentsはアプリケーションの管理に根本的に異なるアプローチを提供します。

ありがとうございます！

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

※以下URLから抜粋させていただきました。
https://kubernetes.io/ja/docs/tutorials/kubernetes-basics/deploy-app/deploy-intro/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114409/3b780f18-c145-ea0e-2b37-f2e82eed59a8.png)

>Kubernetesのコマンドラインインターフェイスであるkubectlを使用して、Deploymentを作成、管理できます。

なるほど。
kubectlでは、Deploymentを作成、管理ができるということか。

>kubectlはKubernetes APIを使用してクラスターと対話します。

余談ですが、、[対話と聞くとガンダム00を思い出すのは私だけでしょうか。。](http://www.gundam00.net/movie/story/index.html)

>このモジュールでは、Kubernetesクラスターでアプリケーションを実行するDeploymentを作成するために必要な、最も一般的なkubectlコマンドについて学びます。

よろしくお願いいたします。

>Deploymentを作成するときは、アプリケーションのコンテナイメージと実行するレプリカの数を指定する必要があります。Deploymentを更新することで、あとでその情報を変更できます。

ふむふむ。

>チュートリアルのモジュール5と6では、Deploymentをどのようにスケール、更新できるかについて説明します。

よろしくお願いいたします。

>最初のDeploymentには、DockerコンテナにパッケージされたNode.jsアプリケーションを使用します。(まだNode.jsアプリケーションを作成してデプロイしていない場合、Hello Minikubeチュートリアルの通りにやってみましょう。)

Node.jsアプリケーションをデプロイしておりませんでしたので、
[Hello Minikubeチュートリアル](https://kubernetes.io/ja/docs/tutorials/hello-minikube/)に戻ります。。

##Node.jsアプリケーションのデプロイ

デプロイ用のDockerfileを作成します。

```bash:ターミナル

#任意のフォルダに移動
cd <任意のフォルダ>
vim Dockerfile

#以下をコピペ

FROM node:6.14.2
EXPOSE 8080
COPY server.js .
CMD node server.js
```

Dockerfileにて使用するserver.jsの作成

```bash:ターミナル

#Dockerfileと同じフォルダへ移動
cd <Dockerfileと同じフォルダ>
vim server.js

#以下をコピペ

var http = require('http');

var handleRequest = function(request, response) {
  console.log('Received request for URL: ' + request.url);
  response.writeHead(200);
  response.end('Hello World!');
};
var www = http.createServer(handleRequest);
www.listen(8080);
```

Dokcerイメージの作成

```bash:ターミナル

cd <Dockerfileと同じフォルダ>
ls -ltr

→Dockerfileとserver.jsが存在していること

docker build -t k8s/nodejs:1.0 .

#Dockerイメージ作成確認
docker images |grep node

→作成した「k8s/nodejs」が存在すること
```
準備ができたので、戻ります。

##対話型チュートリアル - アプリケーションのデプロイ
※ローカルにコマンド実行環境があるため、私はローカルでコマンド実行していきます。
※そのまま、チュートリアルを行っていただいても問題ありません。

```bash:ターミナル

#minikube起動
#すでに実行しているようであれば不要
minikube start

ps -ef|grep minikube
→プロセスが起動していること

#ノード確認
kubectl get nodes

→ローカルホスト以外のノードが表示されないこと

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

→「deployment.apps/kubernetes-bootcamp created」と表示されること

#deployments追加確認
kubectl get deployments

→以下のように表示されること
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   0/1     1            0           40s

#kubectlコマンドはクラスター全体のプライベートネットワークに通信を転送するプロキシを作成できます。 
#プロキシはcontrol-Cを押すことで終了でき、実行中は出力を表示しません。
#別のターミナルウィンドウを開いてからプロキシを実行します。
kubectl proxy

#これで、ホスト（オンラインターミナル）とKubernetesクラスターが接続されました。 
#プロキシを使用すると、これらの端末からAPIに直接アクセスできます。
#プロキシエンドポイントを介してホストされているすべてのAPIを確認できます。 
#たとえば、curlコマンドを使用して、APIから直接バージョンをクエリできます。
curl http://localhost:8001/version

→バージョン情報が表示されていること

#APIサーバーは、ポッド名に基づいて、各ポッドのエンドポイントを自動的に作成します。
#これは、プロキシからもアクセスできます。
#最初にポッド名を取得する必要があり、環境変数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
→Pod名が表示されること
```

##まとめ

Deploymentの作成ができましたので、
次回は、[Podとノードについて](https://kubernetes.io/ja/docs/tutorials/kubernetes-basics/explore/explore-intro/)見ていきたいと思います。