前回はTerraformでKubernetesのclusterとnodeを作りましたが、今回は実際にKubernetesでWordPressを構築チャレンジしてみました。現在は ADACHIN SERVER WIKI
(以下画像)備忘録用のブログが動作しています。設定等気になると思いますのでブログします。
■構成
1 2 3 4 5 6 7 8 9 10 11 |
Some config data (k8s ConfigMaps and Secrets) MySQL Container (k8s replicaset) MySQL Service (k8s service) | | WordPress Container (k8s deployment) [ apache and php-fpm ] | | DO Loadbalancer (k8s service) |
MySQLコンテナとApache,php-fpmコンテナの二台で動いており、その上にLBをかましてるだけというシンプルな構成となっております。
- Manifestsファイル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ tree . ├── README.md └── wordpress ├── configs │ └── apache.conf ├── manifests │ ├── DO-loadbalancer.yaml │ ├── mysql-replicaset.yaml │ ├── mysql-service.yaml │ ├── mysql-volume-claim.yaml │ ├── wordpress-datavolume-claim.yaml │ └── wordpress-deployment.yaml └── secrets └── secrets.yaml |
secretsファイルから順番に説明していきましょう。
■wordpress
- secrets/secrets.yaml
1 2 3 4 5 6 7 8 9 10 11 12 |
--- apiVersion: v1 kind: Secret metadata: name: wp-db-secrets namespace: default type: Opaque # sample pass data: # echo -n "x97-XinfGkMg" | base64 MYSQL_ROOT_PASSWORD: eDk3LVhpbmZHa01n |
ここではパスワードやSSHの秘密鍵などの機密情報を扱うためのリソースで、MySQLのrootパスをBase64でエンコード指定してます。(上記は仮パス)
- manifests/mysql-volume-claim.yaml
1 2 3 4 5 6 7 8 9 10 11 12 |
--- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-volume spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: do-block-storage |
MySQLコンテナ内でそのままDB作ると再起動時にお亡くなりになるので、Volumeを作成しています。(永続化)
- manifests/mysql-replicaset.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
--- apiVersion: extensions/v1beta1 kind: ReplicaSet metadata: name: mysql labels: app: mysql spec: replicas: 1 selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - name: database image: mysql:5.7 resources: requests: memory: 512Mi args: - "--ignore-db-dir=lost+found" envFrom: - secretRef: name: wp-db-secrets livenessProbe: tcpSocket: port: 3306 ports: - containerPort: 3306 volumeMounts: - name: mysql-data mountPath: /var/lib/mysql volumes: - name: mysql-data persistentVolumeClaim: claimName: mysql-volume |
ReplicaSetsは実行中のPodの数が指定した数を維持して、Podが予期せずに終了した場合でも自動的に再生成され、nodeに配置されるようになります。そのための設定ですが、今回はレプリカ1のMySQL5.7で、先程のsecretsを指定してます。
- manifests/mysql-service.yaml
1 2 3 4 5 6 7 8 9 10 11 |
--- apiVersion: v1 kind: Service metadata: name: mysql spec: ports: - port: 3306 protocol: TCP selector: app: mysql |
Pod、Nodeの存在を抽象化し、Podとの通信に単一のエンドポイントを提供するようにServiceを作っています。なのでIPが急に変わって突然Podと通信できなくなるとかはなりません。
- manifests/wordpress-datavolume-claim.yaml
1 2 3 4 5 6 7 8 9 10 11 12 |
--- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: wordpress-volume spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: do-block-storage |
wordpressコンテナも同様にVolumeを作ります。
- manifests/wordpress-deployment.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
--- apiVersion: apps/v1 kind: Deployment metadata: name: wordpress spec: replicas: 1 selector: matchLabels: app: wordpress template: metadata: labels: app: wordpress spec: containers: - name: wordpress image: wordpress:5-php7.1-apache ports: - containerPort: 80 - containerPort: 443 name: wordpress env: - name: WORDPRESS_DB_HOST value: mysql.default.svc.cluster.local - name: WORDPRESS_DB_PASSWORD valueFrom: secretKeyRef: name: wp-db-secrets key: MYSQL_ROOT_PASSWORD - name: WORDPRESS_DB_USER value: root - name: WORDPRESS_DB_NAME value: wordpress volumeMounts: - name: wordpress-data mountPath: /var/www/html volumes: - name: wordpress-data persistentVolumeClaim: claimName: wordpress-volume |
WordPressコンテナも同様にReplicaSetsを作って管理しましょう。
- manifests/DO-loadbalancer.yaml
https://www.digitalocean.com/docs/kubernetes/how-to/configure-load-balancers/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
--- kind: Service apiVersion: v1 metadata: name: wordpress-lb annotations: service.beta.kubernetes.io/do-loadbalancer-protocol: "http" service.beta.kubernetes.io/do-loadbalancer-algorithm: "round_robin" service.beta.kubernetes.io/do-loadbalancer-tls-ports: "443" service.beta.kubernetes.io/do-loadbalancer-certificate-id: "xxxxxxxxxxxxxx" spec: type: LoadBalancer selector: app: wordpress ports: - name: http protocol: TCP port: 80 targetPort: 80 - name: https protocol: TCP port: 443 targetPort: 80 |
LBはDOの公式を参考にして作ればOK!では実際に動かしてみますか!!以下でテンプレートをリポジトリ化しているので参考に。
■RVIRUS0817/kubernetes-wordpress
https://github.com/RVIRUS0817/kubernetes-wordpress
まず準備!
- install command
1 |
$ brew install kubernetes-cli doctl |
- download config.yaml
1 2 |
$ cp -r ~/Desktop/adachin-wordpress-cluster-kubeconfig.yaml ~/.kube $ kubectl get services |
MySQL Setup
- add root pass
1 2 3 4 |
$ echo -n "testpw" | base64 xxxxxxxxxxxxxxx #メモる $ vim wordpress/secrets/secrets.yaml MYSQL_ROOT_PASSWORD: 入れる |
- deploy
1 2 3 4 5 |
$ cd wordprees $ kubectl apply -f secrets/secrets.yaml $ kubectl apply -f manifests/mysql-volume-claim.yaml $ kubectl apply -f manifests/mysql-replicaset.yaml $ kubectl apply -f manifests/mysql-service.yaml |
- make db
1 2 3 4 5 |
$ kubectl get pods $ kubectl exec -it mysql-abcde -- bash $ mysql -u root -p > CREATE DATABASE wordpress; |
- check out k8s
1 2 3 4 5 6 |
$ kubectl get pv $ kubectl get secrets $ kubectl get replicasets $ kubectl get pods $ kubectl describe pod $YOURPOD $ kubectl logs $YOURPOD |
WordPress Setup
1 2 3 4 5 6 |
$ kubectl apply -f manifests/wordpress-datavolume-claim.yaml $ kubectl apply -f manifests/wordpress-deployment.yaml $ kubectl get pods NAME READY STATUS RESTARTS AGE mysql-zdtqp 1/1 Running 0 114m wordpress 1/1 Running 0 14m |
Load Balancer Setup
- certificate check(letsencypt)
1 |
$ curl -X GET -H "Content-Type: application/json" -H "Authorization: Bearer api-key" "https://api.digitalocean.com/v2/certificates" |
- add certificate-ids
1 2 |
$ vim wordpress/manifests/DO-loadbalancer.yaml service.beta.kubernetes.io/do-loadbalancer-certificate-id: "上記のcertificate-idを指定" |
- deploy
1 |
$ kubectl apply -f manifests/DO-loadbalancer.yaml |
- LBのIPからアクセスする!
1 2 3 4 5 |
$ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.245.xxx.xxx <none> 443/TCP 64m mysql ClusterIP 10.245.xxx.xxx <none> 3306/TCP 50m wordpress-lb LoadBalancer xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx 80:31254/TCP,443:31929/TCP 7m3s |
■まとめ
https://t.co/GYTZdAe4nV
とりあえずk8sで動かした。
LBでhttpsがうまく動かないので今週中には直したいところ。ここで備忘録しまくるよ👀— adachin👾SRE (@adachin0817) August 12, 2019
httpsがうまくいかなくて 503
になってしまう!!LBの設定が危うい。
というのを今週直します!
↓
直した!
https://t.co/zRxq72AqFy
httpsでの504が解消された!
そもそもSSLターミネーションしてるのでバックエンドはHTTP80じゃないとあかんかった。そりゃそうよ。– name: https
protocol: TCP
port: 443
targetPort: 80 #443ではなく80— adachin👾SRE (@adachin0817) August 14, 2019
0件のコメント