K8s-1.17とGluster-7.2でWordpressの環境を構築してみた

CNCF Kubernetesドキュメントにあるチュートリアル [Example: Deploying WordPress and MySQL with Persistent Volumes](https://kubernetes.io/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume/) を パソコン上で構築した記録である。

システム構成は、次の図のようになる。永続ボリュームをK8sクラスタの外部に置き、K8sクラスタの運用とGlusterfsクラスタの運用を隔離している点が特徴である。

![wordpress-config.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42829/a940a905-c5a5-72a3-311f-557f1b69405b.png)


実行構築は、筆者が公開しているVagrantでパソコン上で構築する環境を用いる。読者自身で再現するには、パソコンのメモリに32GB程度必要となる。パソコン環境については、次のGitHubのREADME.md を参照して欲しい。

* https://github.com/takara9/vagrant-glusterfs
* https://github.com/takara9/vagrant-kubernetes 


## サンドボックスのディレクトリ作成

git clone先など、関連するファイル一式を置くサンドボックスのディレクトリを作成して、その中で作業する。

~~~
mkdir sandbox
cd sandbox
~~~



## GlusterFsの構築と起動

Glusterfsのソフトウェア定義のストレージシステムを構築する。以下の３行をターミナルにコピぺして実行すると良い。
起動完了までに10分程度の時間が必要となる。

~~~
git clone https://github.com/takara9/vagrant-glusterfs gfs-7
cd gfs-7
vagrant up
~~~


### 結果確認

この実行例の一番したの行が表示されたら、構築完了である。もし、途中でエラーが発生した場合は、途中でエラーメッセージが表示され中断する。
その場合は、メッセージを良く読んで原因を取り除き、`vagrant destroy` で環境を消して、`vagrant up`から再実行する。

~~~
<前略>
TASK [create gluster cluster] **************************************************
changed: [heketi]

TASK [add node] ****************************************************************
changed: [heketi] => (item=172.20.1.21)
changed: [heketi] => (item=172.20.1.22)
changed: [heketi] => (item=172.20.1.23)

TASK [add device 1] ************************************************************
changed: [heketi]

TASK [add device 2] ************************************************************
changed: [heketi]

TASK [add device 3] ************************************************************
changed: [heketi]

PLAY RECAP *********************************************************************
heketi        : ok=6    changed=5    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
~~~~



## Kubernetesクラスタ 1.17の構築と起動

執筆時点の最新バージョンを使って構築する。実行方法は同じく４行をコピーして、ターミナルにペーストする。

~~~
cd ..
git clone -b 1.17 https://github.com/takara9/vagrant-kubernetes k8s-1.17
cd k8s-1.17
vagrant up
~~~


### 結果確認

以下まで到達したら成功と見做して良い。

~~~
<前略>
TASK [daemon-reload and restart kubelet] ***************************************
changed: [node1]
changed: [node2]

PLAY RECAP *********************************************************************
node1        : ok=7    changed=3    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0   
node2        : ok=7    changed=3    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0  
~~~


## kubectlコマンド実行環境設定

パソコンに、kubectlコマンドがインストールされている必要がある。以下２行をコピペして結果を確認する。

~~~
export KUBECONFIG=`pwd`/kubeconfig/config
kubectl get no
~~~


### 結果確認

クラスタが正常に構築できていれば、以下のように表示される。

~~~
maho:k8s-1.17 maho$ export KUBECONFIG=`pwd`/kubeconfig/config
maho:k8s-1.17 maho$ kubectl get no
NAME     STATUS   ROLES    AGE    VERSION
master   Ready    master   2m2s   v1.17.1
node1    Ready    <none>   86s    v1.17.1
node2    Ready    <none>   86s    v1.17.1
~~~


## k8sとGlusterの連携

GlusterfsクラスタとKubernetesクラスタを、ストレージクラスによって接続する。これによって、永続ストレージの動的プロビジョニングが実施可能となる。

~~~
kubectl apply -f https://raw.githubusercontent.com/takara9/vagrant-glusterfs/master/k8s-yaml/storageclass.yml
kubectl patch storageclass gluster-heketi -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
kubectl get sc
~~~

動作確認として、ストレージクラスが作成され、`(default)` が表示されていれば、目的の状態となっている。

~~~
maho:k8s-1.17 maho$ kubectl get sc
NAME                       PROVISIONER               RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
gluster-heketi (default)   kubernetes.io/glusterfs   Delete          Immediate           false                  7s
~~~

以上で環境構築は完了した。


## チュートリアルの実行

チュートリアルをステップ・バイ・ステップで、実行していくのが面倒なので、以下の行をまとめてコピーして、ターミナルへペーストすることで、構築が完了するようにした。

~~~
cd ..
kubectl create ns wordpress
kubectl config set-context wp --namespace=wordpress --cluster=kubernetes --user=kubernetes-admin
kubectl config use-context wp
mkdir wordpress
cd wordpress
curl -LO https://k8s.io/examples/application/wordpress/mysql-deployment.yaml
curl -LO https://k8s.io/examples/application/wordpress/wordpress-deployment.yaml
cat <<EOF >./kustomization.yaml
secretGenerator:
- name: mysql-pass
  literals:
  - password=YOUR_PASSWORD
resources:
- mysql-deployment.yaml
- wordpress-deployment.yaml
EOF
kubectl apply -k ./
~~~


## 動作確認

以下のコマンドを実行することで、チュートリアルが目的とする構成が構築できていることが確認できる。

~~~
kubectl get deploy
kubectl get po
kubectl get svc
kubectl get pvc
~~~

以下に実行結果を提示する。`kubectl get po`の結果で、二つのポッドが、Runningになれば、起動完了である。もし、５分程度経過しても、Runningにならなければ、コマンドの実行結果やログから問題判別して対応する。

~~~
maho:wordpress maho$ kubectl get deploy
NAME              READY   UP-TO-DATE   AVAILABLE   AGE
wordpress         1/1     1            1           76s
wordpress-mysql   1/1     1            1           76s
maho:wordpress maho$ kubectl get po
NAME                               READY   STATUS    RESTARTS   AGE
wordpress-675699f695-6qnz4         1/1     Running   0          76s
wordpress-mysql-69dcc4fc49-t8zs4   1/1     Running   0          76s
maho:wordpress maho$ kubectl get svc
NAME                                                     TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
glusterfs-dynamic-078d34b6-d498-4b17-bc29-3fff20efa6cd   ClusterIP      10.32.0.56    <none>        1/TCP          76s
glusterfs-dynamic-50cc8e14-a402-4627-ab45-c3e3a2b919c2   ClusterIP      10.32.0.130   <none>        1/TCP          76s
wordpress                                                LoadBalancer   10.32.0.215   <pending>     80:31228/TCP   76s
wordpress-mysql                                          ClusterIP      None          <none>        3306/TCP       76s
maho:wordpress maho$ kubectl get pvc
NAME             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS     AGE
mysql-pv-claim   Bound    pvc-50cc8e14-a402-4627-ab45-c3e3a2b919c2   20Gi       RWO            gluster-heketi   77s
wp-pv-claim      Bound    pvc-078d34b6-d498-4b17-bc29-3fff20efa6cd   20Gi       RWO            gluster-heketi   77s
~~~


## ブラウザからのアクセス確認

以下のコマンおで、vagrantで起動した仮想サーバーのIPアドレスを拾って、前述のサービスのポート番号を拾って、アクセス先のURLを組み立てる。

~~~
maho:wordpress maho$ kubectl get no -o wide
NAME     STATUS   ROLES    AGE     VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
master   Ready    master   9m18s   v1.17.1   172.16.20.11   <none>        Ubuntu 16.04.6 LTS   4.4.0-165-generic   containerd://1.2.4
node1    Ready    <none>   8m42s   v1.17.1   172.16.20.12   <none>        Ubuntu 16.04.6 LTS   4.4.0-165-generic   containerd://1.2.4
node2    Ready    <none>   8m42s   v1.17.1   172.16.20.13   <none>        Ubuntu 16.04.6 LTS   4.4.0-165-generic   containerd://1.2.4
~~~

ワーカーノード node1 と NodePortで開かれたポート番号から、以下のURLアドレスが読み取れる。

`http://172.16.20.12:31228`

これをブラウザでアクセスして、次の画面が表示されれば成功である。この画面は、おなじみのWordpressの初期設定画面である。

![wordpress.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42829/8d99b0b3-560d-c260-eb19-b3c866b992e5.png)


## クリーンナップ

使用した名前空間(wordpress)を削除することで、一式が削除される。その後、コンテキストも消しておくと良い。

~~~
kubectl delete ns wordpress
kubectl config use-context kubernetes-admin@kubernetes
kubectl config delete-context wp
cd 
~~~

仮想サーバーから全て消すには、それぞれのvagrantのファイルが入ったディレクトリで、`vagrant destroy`を実行すれば良い。

~~~
cd k8s-1.17
vagrant destroy -f
cd ../gfs7
vagrant destroy -f
~~~


## まとめ

この記事ではポイントしか書いていないので、おいおい、追記したいと思う。