GKE上にWordpress環境作ってみる【vol.1 最小限？yamlに環境変数全部書いちゃう！編】 

こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚です。

今回はタイトルの通り、GKE上にwordpress環境を作っていきたいと思います。
私だけかもしれませんが、巷でk8s上にwordpress環境作っている人結構見かけますがConfigMapとかSecretとかを知っている体で環境構築しており、k8s勉強中の人からすると「うっ・・・」となってしまうような印象がありました。
そこで今回は、本当に最小限。POD,ClusterIP,Loadbalancerのみで構成を組んでみましたのでそのyamlとかを置いておきます。今後これをベースにConfigMapに移したり、Secretに移したりしていこうと思っております。

※PV/PVCすらデプロイしていないので、本番には完全に向きません。podが死んだとき、データも完全に死にます。
※動作確認はしてません。管理コンソール開けるな～というのとWordpressの一番最初のページ開けているな～くらいは見てます。

# 構築する環境

今回構築する環境イメージは以下です。
- wordpress podとmysql podの通信の間にClusterIPを介してもらいます。
「podのIPアドレスではダメなのか？」という声が聞こえてきそうですが、それでも良いです。ただ、wordpress pod用のyamlファイルをいちいち書き換えるのが面倒であり、ClusterIPなら名前解決も容易だったり、概念的にもそこまで難しくないものだと思うので使ってしまいます。
- dnsについては、特にこちらからいじる必要はありません。k8sクラスタにpodや各種serviceをデプロイするたびに勝手に登録してくれます。
- デバッグ用のubuntu podを用意していますが名前解決や疎通を確認する為のものになります。環境にマストで必要ではありませんがdockerのイメージは往々にしてコマンドが入っていないことが多く、デバッグするたびにpod内にコマンドをインストールするのも面倒なのでDockerfileベースで作ってしまっております。この記事にも作り方は記載しておきます。
- wordpressに関してはLoadBalancerを介してWebブラウザで接続します。

![名称未設定ファイル-ページ23 drawio](https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/8e0f5815-e777-4aad-a0a5-eb04ed987dc2)

# 用意したファイル一覧

#### Dockerfile
デバッグ用のubuntuイメージを作成する為のファイルになります。
最新版のubuntuイメージをベースにping,ip,vi,traceroute,nslookup,curlをインストールするように指定したものになります。

```Dockerfile
FROM ubuntu:latest

RUN apt-get update && apt-get upgrade -y 
RUN apt-get install -y iputils-ping net-tools iproute2 vim traceroute dnsutils curl
```


#### wordpress-pod.yaml
webサーバなので80ポートを開放するようにしています。
環境変数envのWORDPRESS_DB_HOSTはmysql用のClusterIPの名前を入力するようにしてください。ClusterIPであれば名前解決が可能です（正確にいうとPodでも可能みたいですがPodに割当たったIPアドレスに依存するようなので実際無いようなものです。）
もしClusterIPを使用しないのであれば、ここにmysql podのIPアドレスを入力すればOKだと思います。

https://hub.docker.com/_/wordpress

```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 
        value: mysql-clusterip 
      - name: WORDPRESS_DB_USER 
        value: devuser 
      - name: WORDPRESS_DB_PASSWORD 
        value: password 
      - name: WORDPRESS_DB_NAME 
        value: gke-wordpress-database
```

#### mysql-pod.yaml
mysqlは3306ポートを使用するのでそこを開放します。
環境変数envはwordpress-pod.yamlと併せるようにしてください。

https://hub.docker.com/_/mysql

```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 
        value: devuser 
      - name: MYSQL_PASSWORD  
        value: password  
      - name: MYSQL_ROOT_PASSWORD  
        value: password  
      - name: MYSQL_DATABASE 
        value: gke-wordpress-database
```

#### ubuntu-pod.yaml
環境構築が上手くいかなかったときにネットワーク周りを確認する為のpodです。
構築自体にマストなものではないのでスルーして頂いて問題ありません。
command,argsで"tail -f /dev/null"を実行するように指定しておりますが、これはPodが勝手に落ちないようにするためです。
```ubuntu-pod.yaml
apiVersion: v1 
kind: Pod 
metadata: 
  name: ubuntu-pod 
  labels: 
    app: ubuntu  
spec: 
  containers: 
    - name:  ubuntu-con 
      image: gcr.io/western-antonym-●●●●●●/my-ubuntu:1.0
      command: [ "tail" ]
      args: ["-f", "/dev/null" ]
```

#### mysql-clusterip.yaml
mysql pod用のClusterIPになります。特にありません。
```mysql-clusterip.yaml
apiVersion: v1  
kind: Service  
metadata:  
  name: mysql-clusterip 
spec:  
  selector:  
    app: mysql  
  type: ClusterIP  
  ports:  
  - name: mysql  
    port: 3306  
    protocol: TCP  
    targetPort: 3306
```

#### wordpress-loadbalancer.yaml
wordpress podに外部からWebブラウザでアクセスする為のLoadBalancerになります。
このLoadBalancerに振られたEXTERNAL-IP:60000でwordpress podに接続出来るようになります。
``` wordpress-loadbalancer.yaml
apiVersion: v1 
kind: Service 
metadata: 
  name: wordpress-loadbalancer 
spec: 
  type: LoadBalancer 
  selector: 
    app: wordpress
  ports: 
  - protocol: TCP 
    port: 60000 
    targetPort: 80
```

# 構築
Dockerfileをベースに自作ubuntuイメージを作成しGCRにpushしています。
```
docker build -t gcr.io/western-antonym-386513/my-ubuntu:1.0 .
docker push gcr.io/western-antonym-386513/my-ubuntu:1.0
```

ubuntu-pod.yamlをベースにpodをデプロイします。
```
$ kubectl apply -f ubuntu-pod.yaml  
Warning: Autopilot set default resource requests for Pod default/ubuntu-pod, as resource requests were not specified. See http://g.co/gke/autopilot-defaults 
pod/ubuntu-pod created
```

wordpress-pod.yamlをベースにpodをデプロイします。
```
$ 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
```

mysql-pod.yamlをベースにpodをデプロイします。
```
$ 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
```

mysql-clusterip.yamlをベースにClusterIPをデプロイします。
```
$ kubectl apply -f mysql-clusterip.yaml  
service/mysql-clusterip created
```

wordpress-loadbalancer.yamlをベースにLBをデプロイします。
```
$ kubectl apply -f wordpress-loadbalancer.yaml  
service/wordpress-loadbalancer created
```

デプロイ状態を確認します。特に問題無いように見えます。
```
$ kubectl get all -o wide 
NAME                READY   STATUS    RESTARTS   AGE     IP               NODE                                      NOMINATED NODE   READINESS GATES 
pod/mysql-pod       1/1     Running   0          9m30s   10.109.128.194   gk3-my-k8s-cluster-pool-1-24736b70-2nzz   <none>           <none> 
pod/ubuntu-pod      1/1     Running   0          11m     10.109.128.130   gk3-my-k8s-cluster-pool-1-890e12ec-vpt4   <none>           <none> 
pod/wordpress-pod   1/1     Running   0          73s     10.109.128.135   gk3-my-k8s-cluster-pool-1-890e12ec-vpt4   <none>           <none> 
NAME                             TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)           AGE     SELECTOR 
service/kubernetes               ClusterIP      10.110.0.1     <none>          443/TCP           25m     <none> 
service/mysql-clusterip          ClusterIP      10.110.2.114   <none>          3306/TCP          8m56s   app=mysql 
service/wordpress-loadbalancer   LoadBalancer   10.110.3.150   35.222.124.11   60000:30234/TCP   8m21s   app=wordpress
```

ubuntu podにexecしてnslookupを使ってClusterIPを名前解決出来るか確認します。
返答が返ってきているので問題なさそうです。
```
$ kubectl exec -it ubuntu-pod -- /bin/bash 
root@ubuntu-pod:/# nslookup mysql-clusterip 
Server:         10.110.0.10 
Address:        10.110.0.10#53 

Name:   mysql-clusterip.default.svc.cluster.local 
Address: 10.110.2.114
```

Webブラウザを使ってアクセスしてみます。
wordpressの初期設定画面が見えたり、topページも見えているので問題なさそうに見えます。
<img width="1124" alt="2023051401" src="https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/bea5468d-d197-4099-a2df-0ac7a3e65d0d">
<img width="1126" alt="2023051402" src="https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/01799368-e97a-48f6-91c1-80d9d3f64867">
<img width="1127" alt="2023051403" src="https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/ee582737-bc8e-47d9-a686-371605009d45">
<img width="1126" alt="2023051404" src="https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/35cb88c2-d5b0-4864-badf-a903b49ff9ef">
<img width="1121" alt="2023051405" src="https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/bcfd5453-e227-46a3-97ba-ad08cf7d6d00">