GKE上にWordpress環境作ってみる【vol.2 ConfigMapに環境変数書いてみる！編】

こんにちは
株式会社クラスアクト インフラストラクチャ事業部の大塚です。
前回、シンプルなWorpress環境をGKE上に構築致しました。
PV/PVCやConfigMap,Secrets等を使用していない為、本番環境には絶対に向かない構成ではありますが、Kubernetes触りたての方が勉強の為に構築するにはいい塩梅の環境になっているかなと自負してたりします。

https://qiita.com/ohtsuka-shota/items/48545c2b34bb251aa0e7

今回は上記の構成であることに変わりはないのですが、yamlに環境変数を直接書いている状態をやめて、ConfigMapに転記していきたいと思います。

# 構築する環境

以下が前回の環境イメージです。
![名称未設定ファイル-ページ23 drawio](https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/65f274ae-7ec7-4a67-9788-47c2bf7fc144)

但し、ConfigMapを使い環境変数をpodにアタッチしています。
![名称未設定ファイル-ページ23のコピー drawio](https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/da143a8e-c0b2-43f6-af22-5e06ed58a7b5)

# 用意したファイル一覧

★前回から差分の無いファイルは記載しておりません。

#### wordpress-configmap.yaml
metadata.nameに書かれている名前がConfigMapとして作成されます。
この例で言うとwordpress-configmap.yamlをKubernetesに渡すとwp-cmというConfigMapが生成されます。
```wordpress-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: wp-cm
data:
  WORDPRESS_DB_HOST: mysql-clusterip
  WORDPRESS_DB_USER : devuser
  WORDPRESS_DB_PASSWORD : password
  WORDPRESS_DB_NAME : gke-wordpress-database
```

#### mysql-configmap.yaml
```mysql-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-cm
data:
  MYSQL_USER : devuser
  MYSQL_PASSWORD : password
  MYSQL_ROOT_PASSWORD : password
  MYSQL_DATABASE : gke-wordpress-database
```

#### wordpress-pod.yaml
spec.containers.envFrom.configMapRef.nameにある"wp-cm"はwordpress-configmap.yamlでデプロイされるConfigMapを指します。
```wordpress-pod.yaml
apiVersion: v1 
kind: Pod 
metadata: 
  name: wordpress-pod 
  labels: 
    app: wordpress  
spec: 
  containers: 
    - name:  wordpress-con 
      image: wordpress:php8.1-apache 
      ports: 
      - containerPort: 80 
      envFrom:
      - configMapRef:
          name: wp-cm
```

#### mysql-pod.yaml
```mysql-pod.yaml
apiVersion: v1 
kind: Pod 
metadata: 
  name: mysql-pod  
  labels: 
    app: mysql  
spec: 
  containers: 
    - name:  mysql-con  
      image: mysql:8.0-debian 
      ports:  
      - containerPort: 3306  
      envFrom:
      - configMapRef:
          name: mysql-cm
```

# 構築
ConfigMapからデプロイしていきます。
```
$ kubectl apply -f wordpress-configmap.yaml 
configmap/wp-cm created
$ kubectl apply -f mysql-configmap.yaml 
configmap/mysql-cm created
```

Kuberenets上にあるConfigMapはpod等と同様にkubectl getやdescribeで取得することが可能です。
```
$ kubectl get cm -o wide 
NAME               DATA   AGE
kube-root-ca.crt   1      11m
mysql-cm           4      46s
wp-cm              4      75s

$ kubectl describe cm wp-cm
Name:         wp-cm
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
WORDPRESS_DB_HOST:
----
mysql-clusterip
WORDPRESS_DB_NAME:
----
gke-wordpress-database
WORDPRESS_DB_PASSWORD:
----
password
WORDPRESS_DB_USER:
----
devuser

BinaryData
====

Events:  <none>

$ kubectl describe cm mysql-cm
Name:         mysql-cm
Namespace:    default
Labels:       <none>
Annotations:  <none>

Data
====
MYSQL_DATABASE:
----
gke-wordpress-database 
MYSQL_PASSWORD:
----
password
MYSQL_ROOT_PASSWORD:
----
password
MYSQL_USER:
----
devuser

BinaryData
====

Events:  <none>
```

podやservice等をデプロイしていきます
```
$ kubectl apply -f wordpress-pod.yaml 
Warning: Autopilot set default resource requests for Pod default/wordpress-pod, as resource requests were not specified. See http://g.co/gke/autopilot-defaults
pod/wordpress-pod created
$ kubectl apply -f mysql-pod.yaml 
Warning: Autopilot set default resource requests for Pod default/mysql-pod, as resource requests were not specified. See http://g.co/gke/autopilot-defaults
pod/mysql-pod created
$ kubectl apply -f mysql-clusterip.yaml 
service/mysql-clusterip created
$ kubectl apply -f wordpress-loadbalancer.yaml 
service/wordpress-loadbalancer created

NAME                READY   STATUS    RESTARTS   AGE     IP             NODE                          NOMINATED NODE   READINESS GATES
pod/mysql-pod       1/1     Running   0          2m37s   10.112.0.130   gk3-my-pool-1-51c2fff1-cf9x   <none>           <none>
pod/wordpress-pod   1/1     Running   0          3m4s    10.112.0.131   gk3-my-pool-1-51c2fff1-cf9x   <none>           <none>

NAME                             TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)           AGE     SELECTOR
service/kubernetes               ClusterIP      10.112.128.1     <none>          443/TCP           16m     <none>
service/mysql-clusterip          ClusterIP      10.112.128.189   <none>          3306/TCP          2m15s   app=mysql
service/wordpress-loadbalancer   LoadBalancer   10.112.129.17    34.72.240.175   60000:31724/TCP   2m1s    app=wordpress
```

Webブラウザでもアクセス・操作出来ることも確認出来ました。

<img width="1128" alt="202305140101" src="https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/94a299b8-0009-47aa-99cb-8803131730af">
<img width="1128" alt="202305140102" src="https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/a442b82d-a6e4-4fa7-8cf4-7d194d4c0599">
<img width="1128" alt="202305140103" src="https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/b428a8c5-2283-40a1-ba7e-fd476e513a72">

# ConfigMapの別の取り込み方法
wordpress-pod.yaml及びmysql-pod.yamlについて、上記の記載方法だけではなく以下の様な記載の仕方でもOKです。
上記の方法はConfigMapを丸っと取り込む方法。以下はConfigMapの各環境変数を1つずつ取り込んでいるイメージです。必要でない環境変数がConfigMapにあったり、複数のConfigMapから環境変数を入れこむ場合はこちらを使用することになると思います。
```wordpress-pod.yaml
apiVersion: v1 
kind: Pod 
metadata: 
  name: wordpress-pod 
  labels: 
    app: wordpress  
spec: 
  containers: 
    - name:  wordpress-con 
      image: wordpress:php8.1-apache 
      ports: 
      - containerPort: 80 
      env:
        - name: WORDPRESS_DB_HOST
          valueFrom:
            configMapKeyRef:
              name: wp-cm
              key: WORDPRESS_DB_HOST
        - name: WORDPRESS_DB_USER
          valueFrom:
            configMapKeyRef:
              name: wp-cm
              key: WORDPRESS_DB_USER
        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
            configMapKeyRef:
              name: wp-cm
              key: WORDPRESS_DB_PASSWORD
        - name: WORDPRESS_DB_NAME
          valueFrom:
            configMapKeyRef:
              name: wp-cm
              key: WORDPRESS_DB_NAME
```

```mysql-pod.yaml
apiVersion: v1 
kind: Pod 
metadata: 
  name: mysql-pod  
  labels: 
    app: mysql  
spec: 
  containers: 
    - name:  mysql-con  
      image: mysql:8.0-debian 
      ports:  
      - containerPort: 3306  
      env:
        - name: MYSQL_USER
          valueFrom:
            configMapKeyRef:
              name: mysql-cm
              key: MYSQL_USER
        - name: MYSQL_PASSWORD
          valueFrom:
            configMapKeyRef:
              name: mysql-cm
              key: MYSQL_PASSWORD
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            configMapKeyRef:
              name: mysql-cm
              key: MYSQL_ROOT_PASSWORD
        - name: MYSQL_DATABASE
          valueFrom:
            configMapKeyRef:
              name: mysql-cm
              key: MYSQL_DATABASE
```