[k8s]ConfigMap について確認したときのメモ

以下あたりを見つつ、確認したときのメモ。

[ConfigMaps](https://kubernetes.io/docs/concepts/configuration/configmap/)

[GKE ConfigMap](https://cloud.google.com/kubernetes-engine/docs/concepts/configmap?hl=ja)

# ConfigMap って何?

[GKE ConfigMap](https://cloud.google.com/kubernetes-engine/docs/concepts/configmap?hl=ja)

>ConfigMap は、構成ファイル、コマンドライン引数、環境変数、ポート番号、構成に関するその他のアーティファクトを、実行時に Pod のコンテナやシステム コンポーネントにバインドします。ConfigMap を使用すると、Pod やコンポーネントから構成を分離できるため、ワークロードの移植性が維持されます。これにより、構成の変更や管理が容易になり、構成データが Pod 仕様に制約されなくなります。
>ConfigMap は、機密性が低く、暗号化されていない構成情報を保存して共有するのに便利です。クラスタで機密情報を使用するには、Secret を使用する必要があります

# ConfigMap の作り方

3つほど考えられる

+ `kubectl` でファイルから値を参照して作る(--from-file)
+ `kubectl` で直接値を渡す(--from-literal)
+ マニュフェストファイルから作る

ファイルから作る場合以下のようにする

```bash
# 設定ファイルサンプル
$wget https://kubernetes.io/examples/configmap/game.properties

$cat game.properties
enemies=aliens
lives=3
enemies.cheat=true
enemies.cheat.level=noGoodRotten
secret.code.passphrase=UUDDLRLRBABAS
secret.code.allowed=true
secret.code.lives=30%

# 作成
$kubectl create configmap game-config-2 --from-file=game.properties

#　確認
$ k get configmaps
NAME            DATA   AGE
game-config-2   1      9s

# データの確認
$ k get configmaps -o yaml
apiVersion: v1
items:
- apiVersion: v1
  data:
    game.properties: |-
      enemies=aliens
      lives=3
      enemies.cheat=true
      enemies.cheat.level=noGoodRotten
      secret.code.passphrase=UUDDLRLRBABAS
      secret.code.allowed=true
      secret.code.lives=30
  kind: ConfigMap
  metadata:
    creationTimestamp: "2020-06-02T07:28:28Z"
    name: game-config-2
    namespace: default
    resourceVersion: "2319007"
    selfLink: /api/v1/namespaces/default/configmaps/game-config-2
    uid: a757690a-a4a2-11ea-80d8-0aafc37fdac4
kind: List
metadata:
  resourceVersion: ""
  selfLink: ""

```

`--from-literal` オプションを使う場合、以下

```bash
$kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm

$ k get configmaps
NAME             DATA   AGE
game-config-2    1      110s
special-config   2      5s


$k get configmaps special-config -o yaml
apiVersion: v1
data:
  special.how: very
  special.type: charm
kind: ConfigMap
metadata:
  creationTimestamp: "2020-06-02T07:30:13Z"
  name: special-config
  namespace: default
  resourceVersion: "2319180"
  selfLink: /api/v1/namespaces/default/configmaps/special-config
  uid: e5ebf59f-a4a2-11ea-80d8-0aafc37fdac4
```

マニュフェストから作る場合。

```bash
# テンプレート作成
$k create configmap test --dry-run -o yaml > config-map.yaml

# data を追加
$vi config-map.yaml
$cat config-map.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  creationTimestamp: null
  name: test
data:
  special.how: very
  special.type: charm

$k apply -f config-map.yaml
configmap/test created

# 確認
$k get configmaps test -o yaml
apiVersion: v1
data:
  special.how: very
  special.type: charm
kind: ConfigMap
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","data":{"special.how":"very","special.type":"charm"},"kind":"ConfigMap","metadata":{"annotations":{},"creationTimestamp":null,"name":"test","namespace":"default"}}
  creationTimestamp: "2020-06-02T07:36:09Z"
  name: test
  namespace: default
  resourceVersion: "2319762"
  selfLink: /api/v1/namespaces/default/configmaps/test
  uid: ba377737-a4a3-11ea-80d8-0aafc37fdac4

```

# Pod での参照方法

[Define container environment variables using ConfigMap data](https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/#define-container-environment-variables-using-configmap-data)

`valueFrom.configMapKeyRef` で 環境変数としてコンテナでは参照できる。

```pod-single-configmap-env-variable.yaml
apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      command: [ "/bin/sh", "-c", "env" ]
      env:
        # Define the environment variable
        - name: SPECIAL_LEVEL_KEY
          valueFrom:
            configMapKeyRef:
              # The ConfigMap containing the value you want to assign to SPECIAL_LEVEL_KEY
              name: special-config
              # Specify the key associated with the value
              key: special.how
  restartPolicy: Never
```


```bash
$k apply -f pod-single-configmap-env-variable.yaml
pod/dapi-test-pod created

$k get pods
NAME            READY   STATUS      RESTARTS   AGE
dapi-test-pod   0/1     Completed   0          3s

$ k logs dapi-test-pod |grep SPECIAL
SPECIAL_LEVEL_KEY=very
```