2018年9月1日土曜日

GKE で Persistent Disk を使ってみた

概要

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

gke_persistent_disk1.png

永続ディスク (Google Cloud Persistent Disk) を作成

  • gcloud compute disks create --size 200GB mysql-disk
  • gcloud compute disks create --size 200GB wordpress-disk

gke_persistent_disk2.png

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 です

gke_persistent_disk3.png

動作確認

Wordpress にアクセスする

先程の EXTERNAL-IP にアクセスすると Wordpress の初期化画面が表示されると思います
ブログのサイトやユーザ名/パスワードを適当に設定しましょう
gke_persistent_disk4.png

永続性をテストしてみる

意図的に 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 件のコメント:

コメントを投稿