概要
GKE 上で MySQL などデータを永続化する場合には Persistent Disk を使用します
今回は Persistent Disk を使って本当にコンテナのデータの永続化ができるか確認してみました
なお、作業は Cloud Shell 上で行っています
環境
- Google Cloud Kubernetes Engine (2018/08/30 時点)
リージョン設定
gcloud config set compute/zone us-central1-b
サンプルダウンロード
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
cd kubernetes-engine-samples/wordpress-persistent-disks
クラスタ作成
gcloud container clusters create persistent-disk-tutorial --num-nodes=3
永続ディスク (Google Cloud Persistent Disk) を作成
gcloud compute disks create --size 200GB mysql-disk
gcloud compute disks create --size 200GB wordpress-disk
MySQL 用のシークレットの作成
kubectl create secret generic mysql --from-literal=password=password12345
kubectl get secret
NAME TYPE DATA AGE
default-token-d9kzn kubernetes.io/service-account-token 3 7m
mysql Opaque 1 7s
MySQL のデプロイ
mysql.yaml を少し修正します
- vim mysql.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: mysql
labels:
app: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql:5.6
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql
key: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
gcePersistentDisk:
pdName: mysql-disk
fsType: ext4
kubectl create -f mysql.yaml
- kubectl get all
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
deploy/mysql 1 1 1 1 2m
NAME DESIRED CURRENT READY AGE
rs/mysql-7bfbdc45b7 1 1 1 2m
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
deploy/mysql 1 1 1 1 2m
NAME DESIRED CURRENT READY AGE
rs/mysql-7bfbdc45b7 1 1 1 2m
NAME READY STATUS RESTARTS AGE
po/mysql-7bfbdc45b7-fgwj8 1/1 Running 0 2m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
svc/kubernetes ClusterIP 10.39.240.1 <none> 443/TCP 25m
pod の STATUS が Running になるまで待ちます
Persistent Disk のアタッチ作業があるため多少時間がかかります
MySQL のサービス作成
kubectl create -f mysql-service.yaml
kubectl get svc mysql
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mysql ClusterIP 10.39.246.175 <none> 3306/TCP 34s
Wordpress のデプロイ
- vim wordpress.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: wordpress
labels:
app: wordpress
spec:
replicas: 1
selector:
matchLabels:
app: wordpress
template:
metadata:
labels:
app: wordpress
spec:
containers:
- image: wordpress
name: wordpress
env:
- name: WORDPRESS_DB_HOST
value: mysql:3306
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql
key: password
ports:
- containerPort: 80
name: wordpress
volumeMounts:
- name: wordpress-persistent-storage
mountPath: /var/www/html
volumes:
- name: wordpress-persistent-storage
gcePersistentDisk:
pdName: wordpress-disk
fsType: ext4
kubectl create -f wordpress.yaml
kubectl get pod -l app=wordpress
NAME READY STATUS RESTARTS AGE
wordpress-65d68b8b45-4ktbn 1/1 Running 0 2m
Running になれば OK です
Wordpress サービスの公開
kubectl create -f wordpress-service.yaml
kubectl get svc -l app=wordpress
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
wordpress LoadBalancer 10.39.243.80 35.194.38.154 80:32711/TCP 3m
ロードバランサ (Google Cloud Load Balancer) が同時に作成されるので少し待ちます
EXTERNAL-IP が付与されれば OK です
動作確認
Wordpress にアクセスする
先程の EXTERNAL-IP にアクセスすると Wordpress の初期化画面が表示されると思います
ブログのサイトやユーザ名/パスワードを適当に設定しましょう
永続性をテストしてみる
意図的に MySQL の pod を削除してみましょう
kubectl delete pod -l app=mysql
すると自動で MySQL の pod を生成しなおしてくれます
kubectl get pod
NAME READY STATUS RESTARTS AGE
mysql-7bfbdc45b7-fgwj8 0/1 Terminating 0 21m
mysql-7bfbdc45b7-zfkxh 0/1 ContainerCreating 0 4s
wordpress-65d68b8b45-4ktbn 1/1 Running 0 13m
新しい MySQL 用のコンテナが Running に慣れば OK です
NAME READY STATUS RESTARTS AGE
mysql-7bfbdc45b7-zfkxh 1/1 Running 0 1m
wordpress-65d68b8b45-4ktbn 1/1 Running 0 14m
これで再度 Wordpress にアクセスしてみると再度初期化を行うことなく Wordpress が使えると思います
先程初期化したときのユーザ名/パスワードでログインできるか確認してみてください (記事などをすでに作成している場合はそれがあるか確認しても良いと思います)
お掃除
kubectl delete service wordpress
gcloud compute forwarding-rules list
これが Listed 0 items.
になるのを待ちます
gcloud container clusters delete persistent-disk-tutorial
gcloud compute disks delete mysql-disk wordpress-disk
あとは GKE クラスタと Persistent Disk を削除すれば OK です
最後に
GKE + Persistent Disk を試してみました
サンプルを動かしただけですがかなり簡単に動作させることができます
実際は自分たちのサービス用の YAML ファイルを作成する必要はありますがそれ以外は流用できるかなと思います
0 件のコメント:
コメントを投稿