Kubernetesの公式チュートリアルをやってみる その3

[Kubernetesの公式チュートリアルをやってみる その2][topic-2] ではKubernetesの環境構築を行いました。
この記事のチュートリアルではデプロイルールの構築とアプリの起動を行います。

#### 注意 && disclaimer

翻訳・意訳が主目的ではないのでいろいろ端折ったりすることがあります。
明らかな間違いはしないつもりですが、何かあれば優しくツッコんであげてください。

→記事のまとめは [Kubernetesの公式チュートリアルをやってみる その1][topic-1] にあります。

## 本記事の取り扱う範囲

[Using kubectl to Create a Deployment][tutorial-2] の内容を扱います。


## Using kubectl to Create a Deployment

`Deployment` とは何か、`Deployment` は何をやってくれるか辺りの内容

### Deployment

- `Deployment` とは、『コンテナ化アプリを配置、更新するためのルール情報』を指す。
    - 作成の際にコンテナアプリを作成するベースとなるコンテナイメージを指定する。(必須)
    - 環境変数やアプリのレプリカ数等、稼働に必要な情報を指定することができる。(オプション)
- master にある `Deployment Controller` は `Deployment` の内容に従ってコンテナ化アプリをノードにデプロイする。
    - デプロイ後はアプリをモニタリングし、ダウン・削除したアプリを新しいものに置き換えることで自動復旧させる。

### kubectl

- Kubernetes API を通じてクラスタを操作するためのコマンドラインツール
    - Kubernetes上のクラスタは `kubectl` を用いて操作する。


### Interactive Tutorial

Estimate Time: 10分

※最初さらっと触っただけだったけど、あとで周辺をヘルプとか見ながら掘ってった内容も含みます。

- サンプルで node.js のアプリを立ち上げる `Deployment` を構築する。
    - 構成の都合上 Pod も出てくるが、Pod については次の章で説明

- `kubectl get nodes`
    - node 一覧を表示するコマンド。
    - `kubectl get ～～` でヒューマンリーダブルな一覧を表示する。
    - `kubectl ～～ --help` で表示されるヘルプで各コマンドの用途や引数などが確認できる。
        - デフォルトではページャーがつかないので、ページングする場合は `kubectl ～～ --help | less` で。
    - ここのチュートリアルでは開始後に node が1つ起動している。
    - ※(明記はないが) `kubectl get [名詞]s` は `kubectl get [名詞]` でも動作する。
        - チュートリアル上はs付きだがコマンド補完はsなしで候補が上がる。
        - ヘルプを見るとgetの対象は複数形、ただしそれぞれ省略形があるらしい。
        - コマンド補完効くので省略形あまり書くことないような。。。

```bash
$ kubectl get node
NAME       STATUS    ROLES     AGE       VERSION
minikube   Ready     <none>    28m       v1.10.0
```

- `kubectl run --image=[container image name]`
    - コンテナレジストリに登録されたイメージ名を指定して Deployment を作成
        - チュートリアルでは gcr.io(Google Container Registry)を使用している
    - `--port=nnn` でサービス作成時に公開するポートを指定することができる。
    - run を実行後に `kubectl get deployments` で作成内容を確認できる。
        - この時点で Pod も作成されている(`kubectl get pods`)

```bash
# Deploymentの作成 + Pod起動
$ kubectl run kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 --port=8080
deployment.apps "kubernetes-bootcamp" created

# Deploymentの確認
$ kubectl get deployment
NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   1         1         1            1           11s

# Podの確認
$ kubectl get pod
NAME                                   READY     STATUS        RESTARTS   AGE
kubernetes-bootcamp-5c69669756-974m6   1/1       Running       0          22s
```

- `kubectl proxy`
    - ターミナルからアプリへのプロキシを作成する。
    - 起動中はコントロールが戻らないので別ターミナルで起動するか `kubectl proxy &` で裏にぶん投げておくとよい。

```bash
# proxyを起動(+ バックグラウンド化)、既定では8001でコンテナ内のサービスポート(8080)にアクセスする
$ kubectl proxy &
[1] 3250
$ Starting to serve on 127.0.0.1:8001

# proxyのポート経由でアプリへアクセスできる
$ curl http://localhost:8001/version
{
  "major": "1",
  "minor": "10",
  "gitVersion": "v1.10.0",
  "gitCommit": "fc32d2f3698e36b93322a3465f63a14e9f0eaead",
  "gitTreeState": "clean",
  "buildDate": "2018-04-10T12:46:31Z",
  "goVersion": "go1.9.4",
  "compiler": "gc",
  "platform": "linux/amd64"
}$
```

#### ハマったところ

- Pod の起動が失敗している
    - imageの指定を間違えると Pod の STATUS が `Running` にならない。
        - よくよく見ると `Deployment` の AVALIABLE も `0` になっていたが最初気づかなかった。
        - スペルミスに注意すること(´・ω・`)

```bash
$ kubectl run kubernetes-bootcamp --image=gcr.io/google-samples/kubenetes-bootcamp:v1 --port=8080
deployment.apps "kubernetes-bootcamp" created
$ kubectl get deployment
NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   1         1         1            0           9s
$ kubectl get pod
NAME                                   READY     STATUS         RESTARTS   AGE
kubernetes-bootcamp-f48c9b644-mmzbm    0/1       ErrImagePull   0          17s
```

- 【チュートリアル環境の注意】環境の期限切れ
    - チュートリアル進めてる間は大丈夫だったが記事書きながら操作しているとKatacodaのターミナルがタイムアウトした。
        - 大体30分ぐらい？どこかに記載あるかも。
        - その場合ページ自体をリフレッシュして最初からやり直すこと。
    - ターミナルのメインプロセスで `exit` しても同様に何もできなくなるので注意。

```
The Katacoda environment has expired. Please refresh to start a fresh environment.



We encountered a problem with the connection.
This may have been due to the internet connection dropping.

Please refresh and try again.
```

----

## 参考リンク

- [Kubernetes公式][kubernetes]
- [Kubernetes公式チュートリアル][tutorials]

[kubernetes]:https://kubernetes.io/
[tutorials]:https://kubernetes.io/docs/tutorials/kubernetes-basics/
[tutorial-2]:https://kubernetes.io/docs/tutorials/kubernetes-basics/deploy-app/deploy-intro/

[topic-1]:https://qiita.com/kitamin/items/f50fe470a04e38023f7a
[topic-2]:https://qiita.com/kitamin/items/c4902edba777f4bf4826