ghost ブログのデータベースを ghost image から SAN と Cloud SQL に設計し直す。

こんにちは yoshi です。

今まで動かしていたこのブログは ghost image を Docker Hub からダウンロードして使っていました。
ghost image は次のように構成されています。

ghost image
- MySQL (データを保存する) - Node js (ghost を動かす) - Disk Drive (写真を保存する)

このままでは一つ大きな問題があります。
「もしこのイメージが何かしらの理由で無くなったらデータはどうなるか」

現状ではデータは image に紐付いているため、例えばトラフィックが多くなった時に replicas を1から2にすると、データがある場合とデータがない場合が出てきてしまうのです。

そこで保存するブログの内容、画像をimageの外に持つ手段をとります。

それぞれのimageが外部のSAN(Storage Area Network)とCloud SQLにアクセスすることを許せば、imageがなくなってもデータは永久に存在します。これをpersistent volume(PV)といい、設定することができます。

設定方法

これらを設定するには PV, PVC, Service, RCを書く必要があります。
それぞれ見ていきましょう。

###pv.yaml

apiVersion: v1  
kind: PersistentVolume  
metadata:  
  name: pv-name
spec:  
  capacity:
    storage: 10Gi   #作ったSANの容量と同じ
  accessModes:
    - ReadWriteMany
  gcePersistentDisk:
    fsType: ext4
    pdName: disk-name   #作ったSANの名前
###pvc.yaml

apiVersion: v1  
kind: PersistentVolumeClaim  
metadata:  
  name: claim-pvc-name
  namespace: default
spec:  
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi   #作ったSANの容量と同じ
### svc.yaml

apiVersion: v1  
kind: Service  
metadata:  
  name: svc-name
  namespace: default
  labels:
    name: label-name
spec:  
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 2368   #ghostのport
      protocol: TCP
  selector:
    name: selector-name
### rc.yaml

apiVersion: v1  
kind: ReplicationController  
metadata:  
  name: rc-name
  namespace: default
  labels:
    name: label-name
spec:  
  replicas: 1
  template:
    metadata:
      name: name
      namespace: default
      labels:
          name: label-name
    spec:
      containers:
      - image: asia.gcr.io/PROJECT_NAME/IMAGE_NAME:v1
        name: container-name
        securityContext:
          privileged: false
        volumeMounts:
        - mountPath: /var/lib/ghost/images
          name: storage
      restartPolicy: Always
      volumes:
      - name: storage
        persistentVolumeClaim:
          claimName: claim-pvc-name

これらを pv > pvc > svc > rc の順番に kubernetes にあげます。

kubectl create -f FILE_PATH  

です。

Kubernetes 1.4.0 以上であれば ウェブからアップロードすることができます。

全てあげるとブログを見ることができます。