EKSでWordPress構築

## はじめに
kubernetesの概念を理解したく、実際に触ってみようということでEKSを使用してみました。あくまでも検証用です。

## 流れ
- VPCの作成（Terraform）
- EKS Clusterの作成（コンソール）
- ノードグループ作成（コンソール）
- RDS作成（Terraform）

クラスタやノードグループ作成については公式ドキュメントや記事を挙げられている方が多いため、WordPressのマニフェストにフォーカスします。

## 構成
![構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812406/a1f04ffb-673d-45fb-bf20-279f61da009c.png)


#### ディレクトリ
```
eks-wordpress/
├── manifests/                    
│    ├── namespace.yaml
│    ├── secrets/
│    │   └── mysql-secret.yaml
│    ├── wordpress/
│    │   ├── deployment.yaml
│    │   └── service.yaml
│
├── terraform/
│    ├── main.tf                 
│    ├── terraform.tfvars                            
│
├── modules/                    
│    ├── vpc/                    
│    │   ├── main.tf             
│    │   ├── variables.tf        
│    │   └── outputs.tf                
│    ├── rds/
│    │   ├── main.tf             
│    │   ├── variables.tf        
│    │   └── outputs.tf       

[Kubernetesクラスタ]
│
├── Namespace: wordpress
│   ├── Pod: wordpress
│   └── Secret: mysql-pass

```

## 前提リソース
https://github.com/ryt117/eks_wordpress

## ノードグループ
とりあえずPodが確実にRunningするノードにします。
- インスタンスタイプ：t3.medium
- ノード数2
![20250403_000018.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812406/1b9ded4c-36ef-4bba-b5ba-6358183164ff.jpeg)

![20250403_000019.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812406/6ceb0da6-382b-4cf7-b591-690a2610c843.jpeg)

## マニフェスト
#### ../manifests/wordpress/deployment.yaml
```
apiVersion: apps/v1
kind: Deployment
metadata: 
  name: wordpress
  namespace: wordpress
spec: 
  replicas: 2
  selector:
    matchLabels: 
      app: wordpress
  strategy: 
    type: Recreate
  template: 
    metadata: 
      labels: 
        app: wordpress
    spec:
      containers: 
      - image: wordpress:latest
        name: wordpress
        resources:
          requests:
            cpu: "100m"
            memory: "128Mi"
          limits:
            cpu: "200m"
            memory: "256Mi"
        env: 
        - name: WORDPRESS_DB_HOST
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: host
        - name: WORDPRESS_DB_NAME
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: name
        - name: WORDPRESS_DB_USER
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: user
        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 80
          name: wordpress
---
apiVersion: v1
kind: Service
metadata: 
  name: wordpress
  namespace: wordpress
spec: 
  type: LoadBalancer
  ports: 
  - port: 80
    targetPort: 80
  selector:
    app: wordpress

```

#### ../manifests/secrets/mysql-secret.yaml
```
apiVersion: v1
kind: Secret
metadata:
  name: mysql-pass
  namespace: wordpress
type: Opaque
stringData:
  host: <RDSのエンドポイント>:3306
  name: wordpress
  user: admin
  password: Password123
```

#### 適用
```
$ kubectl apply -R -f manifests/
```

##  確認 
##### WordPressのServiceがALB経由で外部公開
```
$ kubectl get svc -n wordpress 
NAME        TYPE           CLUSTER-IP      EXTERNAL-IP                                                                    PORT(S)        AGE
wordpress   LoadBalancer   ***.***.***.***   aaaaa.ap-northeast-1.elb.amazonaws.com   80:30287/TCP   5h42m
```
-------------------------------
##### WordPressのPodが2つ、異なるノード（AZ）に分散して正常稼働
```
$ kubectl get pods -n wordpress -o wide
NAME                         READY   STATUS    RESTARTS   AGE   IP           NODE                                            NOMINATED NODE   READINESS GATES
wordpress-7969dcd877-7c4mc   1/1     Running   0          36m   10.0.0.65    ip-10-0-0-198.ap-northeast-1.compute.internal   <none>           <none>
wordpress-7969dcd877-tfpfr   1/1     Running   0          27s   10.0.1.126   ip-10-0-1-78.ap-northeast-1.compute.internal    <none>           <none>
```

--------------------------

##### WordPress
![20250403_000015.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812406/47a0c119-e5a5-4d33-8e5c-542c89faecad.jpeg)

## 最後に
今回は使ってみることが目的であったためコンソールを使用しての作成であったが、次回は全リソースの構築とアプリのデプロイも自動化してみる。