Helmを使ってEKS上にWordPressをデプロイする

## TL;DR

``` console
$ eksctl create cluster --name wordpress --region ap-northeast-1
$ kubectl apply -f https://git.io/Jembo
$ helm init --service-account tiller --upgrade
$ helm install stable/wordpress --namespace wordpress-namespace
```

## 説明

### EKSクラスタの用意

WordPressをデプロイするためのクラスタを作成します。[Amazon EKS の使用開始](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/getting-started.html)を読んで手作業で作っていってもいいのですが、やること多くてめんどくさいです。[eksctl](https://eksctl.io/)を使うと１コマンドで作ることができます。

```
$ eksctl create cluster --name wordpress --region ap-northeast-1
```
(クラスタ作成は20分くらいかかりました)

### RBAC設定

Helmはクライアント側とサーバー側(Tiller)から構成されていて、サーバー側で動くTillerはKubernetesAPIにアクセスする必要があるのですが、EKSのデフォルトの[RBAC]((https://kubernetes.io/docs/reference/access-authn-authz/rbac/))設定ではこれが許可されていません。そのため、適切なアクセス権をTillerに付与してあげる必要があります。


#### サービスアカウントの作成

"kube-system"というnamespace内に"tiller"というサービスアカウントを作ります。

```
$ kubectl create serviceaccount tiller --namespace kube-system
```

#### 今作ったサービスアカウントと"cluster-admin"Roleをバインド

下記のような`tiller-clusterrolebinding.yaml`を作って、

``` yml
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: tiller-clusterrolebinding
subjects:
- kind: ServiceAccount
  name: tiller
  namespace: kube-system
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: ""
```

"ClusterRoleBinding"をデプロイ

```
$ kubectl create -f tiller-clusterrolebinding.yaml
```

#### Tillerデプロイメントをアップデート

```
$ helm init --service-acount tiller --upgrade
```

#### 新しい RBAC Rules をテスト

```
$ helm ls
```

エラーがでなければ成功。


### Helmを使ってWordPressをデプロイ

これだけ。

```
$ helm install stable/wordpress --namespace wordpress-namespace
```

`wordpress-namespace`というnamespaceを作成して、その中にデプロイしています。


#### 外部DBを使う

上記のコマンドだと、EKS内にデータベースまで作ってくれますが、データベースだけは外部のものを使いたいこともあると思います。
[wordpressチャート](https://github.com/helm/charts/tree/master/stable/wordpress)はそういった使い方にも対応しています。

今回は、RDSでMariaDBをたてて繋いでみました。

(設定値の例)

- DBインスタンス識別子: wordpress-db
- マスターユーザの名前: admin
- マスターパスワード: hogehogefugafuga
- セキュリティグループ: eksctl-wordpress-cluster-ClusterSharedNodeSecurityGroup-...
- データベースの名前: mydb
- ポート: 3306


データベースインスタンスが完成したら、`RDS>データベース>wordpress-sample>接続とセキュリティ`からエンドポイントを確認してからデプロイ。

```
$ helm install stable/wordpress --set mariadb.enabled=false,externalDatabase.host=エンドポイント,externalDatabase.user=admin,externalDatabase.database=mydb,externalDatabase.password=hogehogefugafuga --namespace wordpress-namespace
```


## お片付け

今回作成したリソースを全て削除する手順

```console
// リリースを確認
$ helm ls
NAME            REVISION        UPDATED                         STATUS          CHART           APP VERSION     NAMESPACE          
nuanced-boxer   1               Mon Apr 15 13:29:48 2019        DEPLOYED        wordpress-5.7.1 5.1.1           wordpress-namespace

// helmでリリースしたものを削除
$ helm delete --purge nuanced-boxer
release "nuanced-boxer" deleted

(注:削除処理が全て終了するまで1分程度待つ)

// eksctlで作成したクラスタ名を確認
$ eksctl get cluster
NAME            REGION
wordpress       ap-northeast-1

// eksctlで作成されたリソースを削除
$ eksctl delete cluster wordpress
[ℹ]  using region ap-northeast-1
[ℹ]  deleting EKS cluster "wordpress"
[✔]  kubeconfig has been updated
[ℹ]  2 sequential tasks: { delete nodegroup "ng-8114f557", delete cluster control plane "wordpress" [async] }
[ℹ]  will delete stack "eksctl-wordpress-nodegroup-ng-8114f557"
[ℹ]  waiting for stack "eksctl-wordpress-nodegroup-ng-8114f557" to get deleted
[ℹ]  will delete stack "eksctl-wordpress-cluster"
[✔]  all cluster resources were deleted
// データベースを削除
$ aws rds delete-db-instance --db-instance-identifier wordpress-db --skip-final-snapshot --delete-automated-backups
```



## 参考


- [Configure RBAC in your Kubernetes Cluster](https://docs.bitnami.com/kubernetes/how-to/configure-rbac-in-your-kubernetes-cluster/)
- [Using RBAC Authorization - Kubernetes](https://kubernetes.io/docs/reference/access-authn-authz/rbac/)
- [GitHub - helm/charts: Curated applications for Kubernetes](https://github.com/helm/charts)