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

[Kubernetesの公式チュートリアルをやってみる その3][topic-3] では Deployment を作成して自動的にアプリが起動するところまでを取り扱いました。
この記事のチュートリアルでは `Pod` と `Node` について取り扱います。

~~Google Cloud Nextに参加したりその他雑用で記事が止まっていたのは見なかったことに。~~

#### 注意 && disclaimer

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

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


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

[Viewing Pods and Nodes][tutorial-3] の内容を扱います。


## Viewing Pods and Nodes

[その3][topic-3] で扱った `Pod` と [その2][topic-2] で扱った `Node` 関連の内容

### Pod

- `Pod` とは、『コンテナ化アプリをホストするための仮想領域』を指す。
- `Pod` 内には複数のコンテナ化アプリを配置することができ、同一 `Pod` 内のコンテナは以下を共有する。
    - ボリューム
    - クラスタ内でのIPアドレス
    - イメージのバージョンや利用ポートなどの起動方法に関する情報
- `Pod` 内の各コンテナは常に同じ `Node` 上に配置され、同じスケジューリングの対象になる。
    - コンテナの開始～破棄まで同時に行われる。
    - WebApp と WebServer のように密関係になるコンテナを同一 `Pod` 内に配置するのが望ましい。

### Node

- `Pod` を実行するためのワーカーマシンを指す。
    - 物理マシン・仮想マシンいずれで構築されてもよい。
- `Node` 上では複数の `Pod` を実行することができる。
- master はクラスタ内にある `Node` のリソース状況を確認して適宜 `Pod` の配置をスケジューリングする。
- `Node` 内では最低限以下のものが実行されている。
    - kubelet : master を通信してPodやコンテナを管理するエージェントプロセス
    - Docker や rkt などのコンテナランタイム

### Troubleshooting with kubectl

- コンテナを運用するにあたって利用できるkubectlでのサブコマンドの説明。
- `kubectl get`
    - Kubernetes上の指定リソース一覧を表示
    - `kubectl get node` : `Node` 一覧を表示
- `kubectl describe`
    - 指定リソースの詳細情報を表示
        - get では1リソース1行だが descdibe では複数行で細かく表示する。
        - `kubectl describe pod` : `Pod` の詳細を表示[^1]
- `kubectl logs` 
    - 指定 `Pod` 内で稼働するコンテナのログを表示する。
- `kubectl exec`
    - 指定 `Pod` 内の指定コンテナ上でコマンドを実行する。

[^1]: 普段はリソース名(例ではPod名)を指定して個別の詳細を表示したほうが便利かも。

### Interactive Tutorial

Estimate Time: 10分

- `kubectl get pod`
    - [その3][topic-3] でも扱った `Pod` をリストするコマンド。

```bash
$ kubectl get pod
NAME                                   READY     STATUS    RESTARTS   AGE
kubernetes-bootcamp-5c69669756-nxf8c   1/1       Running   0          2m
```

- `kubectl describe pod`
    - `Pod` の詳細情報を表示するコマンド。
    - describe は人が目視するために表示を整形しているため、スクリプト解析などには適さない。
        - スクリプトへ渡すのであれば `kubectl get` に `-o json` や `-o yaml` を渡すと詳細情報を指定フォーマットで表示してくれる。[^2]

[^2]: ~~`kubectl get` の標準の1行書式は `wide` という書式で、`-o wide` と指定した場合と等価になる。~~ 訂正、`wide` の方がデフォルトより情報多いです。

```bash
$ kubectl describe pod
Name:           kubernetes-bootcamp-5c69669756-nxf8c
Namespace:      default
Node:           minikube/172.17.0.38
Start Time:     Tue, 25 Sep 2018 16:48:29 +0000
Labels:         pod-template-hash=1725225312
                run=kubernetes-bootcamp
Annotations:    <none>
Status:         Running
IP:             172.18.0.2
Controlled By:  ReplicaSet/kubernetes-bootcamp-5c69669756
Containers:
  kubernetes-bootcamp:
    Container ID:   docker://a22ae83236c0ee74b041bf895de6174a5fadc46146006e48af78959cffae8c6b
    Image:          gcr.io/google-samples/kubernetes-bootcamp:v1
    Image ID:       docker-pullable://gcr.io/google-samples/kubernetes-bootcamp@sha256:0d6b8ee63bb57c5f5b6156f446b3bc3b3c143d233037f3a2f00e279c8fcc64af
    Port:           8080/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Tue, 25 Sep 2018 16:48:30 +0000
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-pnchw (ro)
Conditions:
  Type           Status
  Initialized    True
  Ready          True
  PodScheduled   True
Volumes:
  default-token-pnchw:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-pnchw
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type     Reason                 Age              From               Message
  ----     ------                 ----             ----               -------
  Warning  FailedScheduling       3m (x4 over 3m)  default-scheduler  0/1 nodes are available: 1 node(s) were not ready.
  Normal   Scheduled              3m               default-scheduler  Successfully assigned kubernetes-bootcamp-5c69669756-nxf8c to minikube
  Normal   SuccessfulMountVolume  3m               kubelet, minikube  MountVolume.SetUp succeeded for volume "default-token-pnchw"
  Normal   Pulled                 3m               kubelet, minikube  Container image "gcr.io/google-samples/kubernetes-bootcamp:v1" already present on machine
  Normal   Created                3m               kubelet, minikube  Created container
  Normal   Started                3m               kubelet, minikube  Started container
```

- `kubectl logs [pod name]` [^3]
    - `Pod` 内でstdoutに出力されたログを表示する。

[^3]: Pod 内でコンテナが複数ある場合は `-c [container name]` を指定する必要がある。

```bash
# Pod名を kubectl get pod から取得している、出力フォーマットを go-template で指定
$ export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
$ kubectl logs $POD_NAME
Kubernetes Bootcamp App Started At: 2018-09-25T16:48:30.778Z | Running On:  kubernetes-bootcamp-5c69669756-nxf8c

Running On: kubernetes-bootcamp-5c69669756-nxf8c | Total Requests: 1 | App Uptime: 481.762 seconds | Log Time: 2018-09-25T16:56:32.541Z
Running On: kubernetes-bootcamp-5c69669756-nxf8c | Total Requests: 2 | App Uptime: 1265.705 seconds | Log Time: 2018-09-25T17:09:36.483Z
```

- `kubectl [pod name] [cmd]` [^3]
    - `Pod` 内のコンテナでコマンドを実行する。
    - bash を指定するとインタラクティブシェルへアクセスすることができる。
        - `exit` or Ctrl+D で抜ける。

```bash
$ kubectl exec $POD_NAME env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=kubernetes-bootcamp-5c69669756-nxf8c
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PROTO=tcp
NPM_CONFIG_LOGLEVEL=info
NODE_VERSION=6.3.1
HOME=/root
```

```bash
$ kubectl exec -ti $POD_NAME bash
root@kubernetes-bootcamp-5c69669756-nxf8c:/# ls
bin   core  etc   lib    media  opt   root  sbin       srv  tmp  var
boot  dev   home  lib64  mnt    proc  run   server.js  sys  usr
```

----

## 参考リンク

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

[kubernetes]:https://kubernetes.io/
[tutorials]:https://kubernetes.io/docs/tutorials/kubernetes-basics/
[tutorial-3]:https://kubernetes.io/docs/tutorials/kubernetes-basics/explore/explore-intro/

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