初心者のKubernetes入門（書籍 Kubernetes 実践入門の写経から学ぶ）体感編パート3（OwnerReference 操作）

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

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

# 引用や参考と今回の自分の勉強用の書籍の紹介
[技術評論社『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 のソースコードも使いながら学んで行きたいと思います。
***この章の勉強は本当に書籍の写経が主になるかもしれません・・・***


# 勉強開始

## 流れを理解する

### OwnerRefference によるオブジェクトのガベージコレクションの仕組み

- 親オブジェクトは子オブジェクトを管理している
- 親が削除されたら子オブジェクトも削除される
- 紐付けは「OwerRefference」によって行われている
    - `.meta.owerRefferences` の値から仕組みを提供している
    - `.meta.owerRefferences` が空の場合はガベージコレクションの対象にならない

```text:metadata.ownerReferencesを取得してみる（失敗）
$ kubectl get rs dive-mattermost-preview-6b76f7944 -o template --template='{{.metadata.owerRefferences}}'
<no value>
```

```text:metadata.ownerReferencesを取得してみる（成功）
$ kubectl get rs dive-mattermost-preview-6b76f7944 -o template --template='{{.metadata.ownerReferences}}'
[map[apiVersion:apps/v1 blockOwnerDeletion:true controller:true kind:Deployment name:dive-mattermost-preview uid:2f365e99-83d3-46d0-8233-8b1d7d25dd9d]]
```

### 写経あるある（個人的）

typo でした。 「owner」の「n」に目が行かなかった・・・

```diff
- .metadata.owerRefferences
+ .metadata.ownerRefferences
```

### deployment のみを削除する

```
$ kubectl delete deploy dive-mattermost-preview --cascade=false -v=8

0418 13:46:19.992556   13154 request.go:947] Request Body: {"propagationPolicy":"Orphan"}
I0418 13:46:19.992653   13154 round_trippers.go:416] DELETE https://kubernetes.docker.internal:6443/apis/extensions/v1beta1/namespaces/default/deployments/dive-mattermost-preview
deployment.extensions "dive-mattermost-preview" deleted
```

```text:ownerReferenceが削除されていることを確認
$ kubectl get rs dive-mattermost-preview-6b76f7944 -o template --template='{{.metadata.ownerReferences}}'
<no value>
```

```text:Deploymentのみ削除されていることを確認
$ kubectl get deploy,rs,po
NAME                                                      DESIRED   CURRENT   READY   AGE
replicaset.extensions/dive-mattermost-preview-6b76f7944   1         1         1       16m

NAME                                          READY   STATUS    RESTARTS   AGE
pod/dive-mattermost-preview-6b76f7944-v62jk   1/1     Running   0          16m
```

```text:PodのownerReferencesを確認
$ kubectl get po dive-mattermost-preview-6b76f7944-v62jk -o template --template='{{.metadata.ownerReferences}}'
[map[apiVersion:apps/v1 blockOwnerDeletion:true controller:true kind:ReplicaSet name:dive-mattermost-preview-6b76f7944 uid:48d4232f-ac4e-4452-80b8-d3d8d0a80007]]
```

### ReplicaSet を通常通りに削除して Pod も一緒に削除されることを確認

```
$ kubectl delete rs dive-mattermost-preview-6b76f7944 -v=8

I0418 13:58:58.635110   13360 request.go:947] Request Body: {"propagationPolicy":"Background"}
I0418 13:58:58.635317   13360 round_trippers.go:416] DELETE https://kubernetes.docker.internal:6443/apis/extensions/v1beta1/namespaces/default/replicasets/dive-mattermost-preview-6b76f7944
replicaset.extensions "dive-mattermost-preview-6b76f7944" deleted
```

```text:すべて削除されていることを確認
$ kubectl get deploy,rs,po


No resources found.
```

### curl で kubernetes API を叩いてみる

```text:実行前
$ kubectl get deploy,rs,pod
NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.extensions/mattermost-preview   1/1     1            1           12s

NAME                                                  DESIRED   CURRENT   READY   AGE
replicaset.extensions/mattermost-preview-78bc8686ff   1         1         1       12s

NAME                                      READY   STATUS    RESTARTS   AGE
pod/mattermost-preview-78bc8686ff-tt7wk   1/1     Running   0          12s
```

```text:コマンド実行
$ curl -X DELETE http://localhost:8001/apis/apps/v1/namespaces/default/deployments/mattermost-preview
{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {

  },
  "status": "Success",
  "details": {
    "name": "mattermost-preview",
    "group": "apps",
    "kind": "deployments",
    "uid": "17ac54a2-dd4e-4c07-ac37-4c4070db551d"
  }
```

```text:実行後
$kubectl get deploy,rs,pod
NAME                                      READY   STATUS        RESTARTS   AGE
pod/mattermost-preview-78bc8686ff-tt7wk   1/1     Terminating   0          5m5s

$ kubectl get deploy,rs,pod


No resources found.
```
> ここは多分削除中の場合にコマンドを実行したら上の結果で、しばらくしてからコマンドを叩いたら下の結果となりました



# 確認補足（DashBoard）

## Deploy 削除したときのダッシュボード

### 削除前

<img width="1132" alt="スクリーンショット 2020-04-18 13.45.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174596/196c1859-c561-b369-d915-0bf7cf068f37.png">

### 削除後

<img width="1132" alt="スクリーンショット 2020-04-18 13.50.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174596/d49aa70c-24f2-3764-7401-6efe6b42c799.png">

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

- アプリケーションのマニュフェストを書く の章から始めたいと思います

> 3.3章は Dockerfile 関連の話になっていて、そこは別な***写経シリーズ***で勉強していきたいと思います。

- softwareDesign で連載記事があったのを思い出しました。
- 定期購読したいけどできないので、お小遣いで毎月書店で購入（何回か抜けてるかも）があるかもしれませんが第１回〜やっていきたいと思います。


# 最後に

今回は OwnerReference の仕組みを体感してみました。

書籍にも書いてあるとおり、Label で紐付けられていてちゃんと書籍を読んで、自分でコマンドを叩いて、現象としての結果が現れて、改めて結果を見返して納得しながらやれたと思います。