初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）体感編

# 背景
個人的にインフラの知識以上にこれからのアプリケーションが動く環境を作ってデプロイしたりしてこれからの知識を身に着けたい。そしてより一層、自分の知識のアップデートをしたいと思いました。

その中でこの本に出会い、これから少しずつやったことを残し、未来の自分への手紙としてもあり、見つめ直せればと思いました。

# 引用や参考と今回の自分の勉強用の書籍の紹介
[技術評論社『Kubernetes実践入門』のサンプルコード](https://github.com/kubernetes-practical-guide/examples)
[Kubernetes実践入門 プロダクションレディなコンテナ＆アプリケーションの作り方](https://gihyo.jp/book/2019/978-4-297-10438-2)
![](http://image.gihyo.co.jp/assets/images/cover/2019/9784297104382.jpg)


## 実際の学びについて

書籍を読みながら、章ごとに少しずつ進めていきたいと思います。
GitHub のソースコードも使いながら学んで行きたいと思います。
***この章の勉強は本当に書籍の写経が主になるかもしれません・・・***


# 勉強開始

## 流れを理解する

### kubentetes の動きを知るのに便利な Event オブジェクト

***失敗したコマンド***

```
$ kubectl get event -w -o custom-columns=KIND:.involvedObject.kind, NAME:.metadata.name, SOURCE:.source.component, REASON:.reason, MESSAGE:.message
Error from server (NotFound): events "NAME:.metadata.name," not found
```

***成功したコマンド***

```
$ kubectl get event -w -o custom-columns=KIND:.involvedObject.kind,NAME:.metadata.name,SOURCE:.source.component,REASON:.reason,MESSAGE:.message
```

`KIND / NAME / SOURCE / REASON / MESSAGE` の前の `,` にスペースを入れてコマンドが失敗していたんのでした。

|オプション|意味|
|---|---|
|--watch(-w)|リアルタイムにオブジェクトの変更内容を取得したいとき|
|--output(-o)|出力形式を指定するとき|
今回は`custom-columns` になります

### ログレベルを上げて kubectl と Kubernetes API の関係を把握する

```
$ kubectl create deployment dive-mattermost-preview --image k8spracticalguide/mattermost-preview:4.10.2 --v=8
I0415 20:55:18.394770    9011 request.go:947] Request Body: {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"creationTimestamp":null,"labels":{"app":"dive-mattermost-preview"},"name":"dive-mattermost-preview"},"spec":{"replicas":1,"selector":{"matchLabels":{"app":"dive-mattermost-preview"}},"strategy":{},"template":{"metadata":{"creationTimestamp":null,"labels":{"app":"dive-mattermost-preview"}},"spec":{"containers":[{"image":"k8spracticalguide/mattermost-preview:4.10.2","name":"mattermost-preview","resources":{}}]}}},"status":{}}
I0415 20:55:18.394831    9011 round_trippers.go:416] POST https://kubernetes.docker.internal:6443/apis/apps/v1/namespaces/default/deployments
I0415 20:55:18.394840    9011 round_trippers.go:423] Request Headers:
I0415 20:55:18.394845    9011 round_trippers.go:426]     Accept: application/json
I0415 20:55:18.394849    9011 round_trippers.go:426]     User-Agent: kubectl/v1.15.5 (darwin/amd64) kubernetes/20c265f
I0415 20:55:18.493824    9011 round_trippers.go:441] Response Status: 201 Created in 98 milliseconds
I0415 20:55:18.493877    9011 round_trippers.go:444] Response Headers:
I0415 20:55:18.493888    9011 round_trippers.go:447]     Content-Type: application/json
I0415 20:55:18.493895    9011 round_trippers.go:447]     Content-Length: 1088
I0415 20:55:18.493900    9011 round_trippers.go:447]     Date: Wed, 15 Apr 2020 11:55:18 GMT
I0415 20:55:18.497646    9011 request.go:947] Response Body: {"kind":"Deployment","apiVersion":"apps/v1","metadata":{"name":"dive-mattermost-preview","namespace":"default","selfLink":"/apis/apps/v1/namespaces/default/deployments/dive-mattermost-preview","uid":"8fee822b-7de3-4f37-8e3d-75a96745c475","resourceVersion":"79757","generation":1,"creationTimestamp":"2020-04-15T11:55:18Z","labels":{"app":"dive-mattermost-preview"}},"spec":{"replicas":1,"selector":{"matchLabels":{"app":"dive-mattermost-preview"}},"template":{"metadata":{"creationTimestamp":null,"labels":{"app":"dive-mattermost-preview"}},"spec":{"containers":[{"name":"mattermost-preview","image":"k8spracticalguide/mattermost-preview:4.10.2","resources":{},"terminationMessagePath":"/dev/termination-log","terminationMessagePolicy":"File","imagePullPolicy":"IfNotPresent"}],"restartPolicy":"Always","terminationGracePeriodSeconds":30,"dnsPolicy":"ClusterFirst","securityContext":{},"schedulerName":"default-scheduler"}},"strategy":{"type":"RollingUpdate","rollingUpdate":{"maxUnavailable":"25%","maxSurge":"25%"}},"revis [truncated 64 chars]
deployment.apps/dive-mattermost-preview created
```
> 書籍の通り、コマンドを叩くと API を叩くことを確認できました

`コマンドから API 起動` / `API からコマンド起動` って `kubernetes` では前者ですが・・・
このような発想が自分に初めての感覚で少し興奮しています。
なにか、意図がありそうですが・・・

### Deployment が作成されてから ReplicaSet が作成されるまでの動きの確認

```
$ kubectl get deploy,rs,pod -v=6 2>&1 |grep -e dive-mattermost -e https
I0415 21:08:01.685789    9061 round_trippers.go:438] GET https://kubernetes.docker.internal:6443/apis/extensions/v1beta1/namespaces/default/deployments?limit=500 200 OK in 31 milliseconds
I0415 21:08:01.702544    9061 round_trippers.go:438] GET https://kubernetes.docker.internal:6443/apis/extensions/v1beta1/namespaces/default/replicasets?limit=500 200 OK in 15 milliseconds
I0415 21:08:01.723399    9061 round_trippers.go:438] GET https://kubernetes.docker.internal:6443/api/v1/namespaces/default/pods?limit=500 200 OK in 16 milliseconds
deployment.extensions/dive-mattermost-preview   1/1     1            1           12m
replicaset.extensions/dive-mattermost-preview-6b76f7944   1         1         1       12m
pod/dive-mattermost-preview-6b76f7944-zbv99   1/1     Running     0          12m
```

> 書籍通り、ここでも、get コマンドを実行すると API が叩かれることを確認できました

### Pod オブジェクトの作成からコンテナの起動までの動き

```
$ kubectl get event -w -o custom-columns=KIND:.involvedObject.kind,NAME:.metadata.name,SOURCE:.source.component,REASON:.reason,MESSAGE:.message
KIND         NAME                                       SOURCE                  REASON              MESSAGE
Deployment   dive-mattermost-preview.1605fc2e13813018   deployment-controller   ScalingReplicaSet   Scaled up replica set dive-mattermost-preview-6b76f7944 to 1
ReplicaSet   dive-mattermost-preview-6b76f7944.1605fc2e1a59be64   replicaset-controller   SuccessfulCreate    Created pod: dive-mattermost-preview-6b76f7944-zbv99
Pod          dive-mattermost-preview-6b76f7944-zbv99.1605fc2e1eaaf8ac   default-scheduler       Scheduled           Successfully assigned default/dive-mattermost-preview-6b76f7944-zbv99 to docker-desktop
Pod          dive-mattermost-preview-6b76f7944-zbv99.1605fc2e98dd569c   kubelet                 Pulled              Container image "k8spracticalguide/mattermost-preview:4.10.2" already present on machine
Pod          dive-mattermost-preview-6b76f7944-zbv99.1605fc2ea433445c   kubelet                 Created             Created container mattermost-preview
Pod          dive-mattermost-preview-6b76f7944-zbv99.1605fc2eb11d2a84   kubelet                 Started             Started container mattermost-preview
```

> ここでも、Deployment / ReplicaSet / Pod という順番にイベントが行われていることが確認できました。

## 次は 3.2.2 章をやっていきます。

「Update / Delete ControllrManager による調整ループとセルフヒーリング」です

# 最後に

今回は、コマンドが API を叩いているところを実感できる内容になりました。
なお、「Kubernetes 実践入門」をやっていますが、本屋さんで色々見てこの本に出会い、なんだか出会ってよかったが感じられています。

# 最後にパート２

## 短縮名だけは表でのこしとこう。
|NAME|SHORTNAMES|APIGROUP|NAMESPACED|KIND|
|---|---|---|---|---|
|componentstatuses|cs||false|ComponentStatus|
|configmaps|cm||true|ConfigMap|
|endpoints|ep||true|Endpoints|
|events|ev||true|Event|
|limitranges|limits||true|LimitRange|
|namespaces|ns||false|Namespace|
|nodes|no||false|Node|
|persistentvolumeclaims|pvc||true|PersistentVolumeClaim|
|persistentvolumes|pv||false|PersistentVolume|
|pods|po||true|Pod|
|replicationcontrollers|rc||true|ReplicationController|
|resourcequotas|quota||true|ResourceQuota|
|serviceaccounts|sa||true|ServiceAccount|
|services|svc||true|Service|
|customresourcedefinitions|crd,crds|apiextensions.k8s.io|false|CustomResourceDefinition|
|daemonsets|ds|apps|true|DaemonSet|
|deployments|deploy|apps|true|Deployment|
|replicasets|rs|apps|true|ReplicaSet|
|statefulsets|sts|apps|true|StatefulSet|
|horizontalpodautoscalers|hpa|autoscaling|true|HorizontalPodAutoscaler|
|cronjobs|cj|batch|true|CronJob|
|certificatesigningrequests|csr|certificates.k8s.io|false|CertificateSigningRequest|
|events|ev|events.k8s.io|true|Event|
|daemonsets|ds|extensions|true|DaemonSet|
|deployments|deploy|extensions|true|Deployment|
|ingresses|ing|extensions|true|Ingress|
|networkpolicies|netpol|extensions|true|NetworkPolicy|
|podsecuritypolicies|psp|extensions|false|PodSecurityPolicy|
|replicasets|rs|extensions|true|ReplicaSet|
|ingresses|ing|networking.k8s.io|true|Ingress|
|networkpolicies|netpol|networking.k8s.io|true|NetworkPolicy|
|poddisruptionbudgets|pdb|policy|true|PodDisruptionBudget|
|podsecuritypolicies|psp|policy|false|PodSecurityPolicy|
|priorityclasses|pc|scheduling.k8s.io|false|PriorityClass|
|storageclasses|sc|storage.k8s.io|false|StorageClass|