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

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

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

# 引用や参考と今回の自分の勉強用の書籍の紹介
[技術評論社『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/ch1.3.7

```yaml:my-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-cm
data: # キーバリューで設定情報を格納する (1)
  DATABASE_HOST: db.example.com
  nginx.conf: |
    server{
      listen 80 default;
      server_name _;
      access_log /dev/stdout;

      location / {
        root /var/www/html;
        index index.html;
      }
    }
```

- key:value で値を保存して使うことができる
- |(バーティカルバー)を利用すると改行が保持されて設定できる


# コマンド郡

## 実行前

<img width="1138" alt="スクリーンショット 2020-04-12 10.01.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174596/ad5869d5-66bc-9809-509a-29e43c7e1700.png">

## ConfigMap のマニュフェストファイルを適用する
```
$ kubectl create -f my-cm.yaml
configmap/my-cm created
```

## 実行後
<img width="1137" alt="スクリーンショット 2020-04-12 10.03.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174596/77650fc0-2ed3-c90a-b16e-fb4d22547a42.png">
<img width="1144" alt="スクリーンショット 2020-04-12 10.03.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174596/336a668b-4f2f-a623-e57d-a3086167da0a.png">

## 実行後(コマンド実施)
```
$ kubectl describe configmaps my-cm
Name:         my-cm
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
DATABASE_HOST:
----
db.example.com
nginx.conf:
----
server{
  listen 80 default;
  server_name _;
  access_log /dev/stdout;

  location / {
    root /var/www/html;
    index index.html;
  }
}

Events:  <none>
```

## ConfigMap をボリュームとして扱う場合

```yaml:cm-volume.yaml
apiVersion: v1
kind: Pod
metadata:
  name: cm-volume
spec:
  containers:
  - name: nginx
    image: k8spracticalguide/nginx:1.15.5
    ports:
    - containerPort: 80
    volumeMounts: # コンテナ内でマウントするVolumeのリスト (3)
    - name: my-cm # 下記のVolumeの名前と一致しなければならない
      readOnly: true
      mountPath: /var/nginx
  volumes: # コンテナでマウントするVolumeのリスト (2)
  - name: my-cm # Volumeの名前
    configMap:
      name: my-cm # ConfigMap名と一致しなければならない
      items: # 省略するとdataの全てがファイルとして配置される
      - key: nginx.conf # dataのキー名
        path: nginx.conf # 別名として配置することもできる
```

## マニュフェストを適用する

```
$ kubectl create -f cm-volume.yaml
pod/cm-volume created
```

## 実行後

<img width="1140" alt="スクリーンショット 2020-04-12 10.12.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174596/6511bb37-b8c3-fdba-41b3-97f6b2a2d68e.png">

## 実行後（コマンド）
ファイルが作成されていることを確認できる

```
$ kubectl exec cm-volume -- ls /var/nginx
nginx.conf
```

作成されたファイルの中身は ConfigMap の中身になっていることを確認できる

```
$ kubectl exec cm-volume -- cat /var/nginx/nginx.conf
server{
  listen 80 default;
  server_name _;
  access_log /dev/stdout;

  location / {
    root /var/www/html;
    index index.html;
  }
}
```

## ConfigMap を環境変数として扱う場合

```yaml:cm-env.yaml
apiVersion: v1
kind: Pod
metadata:
  name: cm-env
spec:
  containers:
  - name: nginx
    image: k8spracticalguide/nginx:1.15.5
    ports:
    - containerPort: 80
    env: # コンテナで設定される環境変数のリスト (4)
    - name: DATABASE_HOST # 設定する環境変数名
      valueFrom:
        configMapKeyRef:
          name: my-cm # ConfigMap名を指定
          key: DATABASE_HOST # ConfigMapのキー名を指定
```

## マニュフェストを適用する

```
$ kubectl create -f cm-env.yaml
pod/cm-env created
```

## 実行後（コマンド）

環境変数に値が設定されていることを確認できる

```
$ kubectl exec cm-env -- sh -c "env | grep DATABASE"
DATABASE_HOST=db.example.com
```

## ConfigMap のすべてを環境変数として定義する場合

```yaml:cm-env2.yaml
apiVersion: v1
kind: Pod
metadata:
  name: cm-env2
spec:
  containers:
  - name: nginx
    image: k8spracticalguide/nginx:1.15.5
    envFrom: # ConfigMap my-cmの全てのdataが環境変数として定義される (5)
    - configMapRef:
        name: my-cm
```

## マニュフェストを適用する

```
$ kubectl create -f cm-env2.yaml
pod/cm-env2 created
```

環境変数に値が設定されていることを確認できる
ここでは、ConfigMap は DATABASEだけ を確認

## 実行後（コマンド）

```
$ kubectl exec cm-env -- sh -c "env | grep DATABASE"
DATABASE_HOST=db.example.com
```

## ConfigMap をコマンドライン引数として使う場合

```yaml:cm-arg.yaml
apiVersion: v1
kind: Pod
metadata:
  name: cm-arg
spec:
  restartPolicy: Never # 再起動のポリシー
  containers:
  - name: busybox
    image: k8spracticalguide/busybox:1.28
    command: ["/bin/sh", "-c", "echo $(DATABASE_HOST)"] # 環境変数として定義したConfigMapを参照する (6)
    env: # 環境変数として設定
    - name: DATABASE_HOST # 設定する環境変数名
      valueFrom:
        configMapKeyRef:
          name: my-cm # ConfigMap名を指定
          key: DATABASE_HOST # ConfigMapのキー名を指定
```

## マニュフェストを適用する

```
$ kubectl create -f cm-arg.yaml
pod/cm-arg created
```

## 実行後（コマンド）

マニュフェストで echo した内容がログに表示されていることを確認

```
$ kubectl logs cm-arg --timestamps
2020-04-12T01:32:16.2357517Z db.example.com
```

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

秘密にしたい情報を使う方法は大切なのでやっていきたいと思います。

# 最後に

今回の ConfigMap の章は結構色々種類があって、色々な局面で使われる想定の概要を理解するのに良いと思いました。
自分はまだ細かい部分については次章以降で詳しく説明や思いを理解していきたいと思います。