初心者の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 のソースコードも使いながら学んで行きたいと思います。
***この章の勉強は本当に書籍の写経が主になるかもしれません・・・***


# 勉強開始

- ### マニュフェスト作成するところまで

  - [https://github.com/kubernetes-practical-guide/examples/tree/master/ch3.4.1.1/manifests/mattermost](https://github.com/kubernetes-practical-guide/examples/tree/master/ch3.4.1.1/manifests/mattermost)

- ### マニュフェストに環境変数を設定するところまで
  - [https://github.com/kubernetes-practical-guide/examples/tree/master/ch3.4.1.2/manifests/mattermost](https://github.com/kubernetes-practical-guide/examples/tree/master/ch3.4.1.2/manifests/mattermost)

## Deployment の YAML ファイルを書く

- 最初からサラで記述するのは大変
- 大変だから一旦 `dry-run` でひな形を作成していく形で進める。
- だんだん覚えたら、サラで書くように自分に言い聞かせる

### 早速 Deployment のマニュフェストファイルの雛形作成してみます

```text:Deploymentマニュフェストの雛形を作成
$ kubectl create deployment mattermost --image k8xpracticalguide/mattermost:4.10.2 -o yaml --dry-run > mattermost-deploy.yaml

$ vi mattermost-deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: mattermost
  name: mattermost
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mattermost
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: mattermost
    spec:
      containers:
      - image: k8xpracticalguide/mattermost:4.10.2
        name: mattermost
        resources: {}
status: {}
```

### MySQL 用の雛形作成

```text:DBのDeploymentマニュフェストの雛形を作成

$ kubectl create deployment db --image=k8spracticalguide/mysql:5.7.22 -o yaml --dry-run > db-deploy.yaml

$ vi db-deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: db
  name: db
spec:
  replicas: 1
  selector:
    matchLabels:
      app: db
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: db
    spec:
      containers:
      - image: k8spracticalguide/mysql:5.7.22
        name: mysql
        resources: {}
status: {}
```

## アプリケーションコードやコンテナイメージから設定を分離する

- デプロイする環境や構成によって変わりやすい値はコンテナイメージの中に埋め込むのはよろしくない
- 値が変更されたとしたらビルドし直す必要がある
- よってポータビリティが低下してしまう

### Deployment マニュフェストの Pod テンプレートに環境変数を追加する

```yaml:mattermost-deploy.yamlの環境変数設定（抜粋）
    spec:
      containers:
      - image: k8xpracticalguide/mattermost:4.10.2
        name: mattermost
        env:                  #追加
        - name: MM_USERNAME   #追加
          value: myuser       #追加
        - name: MM_PASSWORD   #追加
          value: mypassword   #追加
        - name: DB_NAME       #追加
          value: mattermost   #追加
        - name: DB_HOST       #追加
          value: ""           #追加
```

```yaml:db-deploy.yamlの環境変数設定（抜粋）
    spec:
      containers:
      - image: k8spracticalguide/mysql:5.7.22
        name: mysql
        env:                        #追加
        - name: MYSQL_ROOT_PASSWORD #追加
          value: rootpassword       #追加
        - name: MYSQL_USER          #追加
          value: myuser             #追加
        - name: MYSQL_PASSWORD      #追加
          value: mypassword         #追加
        - name: MYSQL_DATABASE      #追加
          value: mattermost         #追加
```

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

- ConfigMap を使って今回設定した設定値を管理する方法を学びます

# 最後に

設定値を今回は YAML マニュフェストで設定しましたが環境によって値が変わる場合にはどうしてもファイルを修正したりと色々あると思う。
だからこそ次の章の ConfigMap を使って値を管理する方法を学ぶんだなぁ〜と思うと次の章のイメージも付き学びにつながるのではと思いました。