2018年2月17日土曜日

Docker For Mac で Kubernetes を試してEC-CUBEを動かしてみる(その4)

SYSTEM_KDです。

その1、その2、その3 とやってきて、ようやくEC-CUBEをインストールするところにたどりつきました。


Kubernetes な環境に EC-CUBE3 をインストール


インストールに利用する EC-CUBEは 3.0.15 になります。


ここからは楽勝ですね。

いままで作ってきたものを全て起動させた状態にします。


WEBサーバー側で、マウントしているホストのディレクトリに、EC-CUBE3 のソースを配置します。

そして、ポート指定して localhostにアクセスすれば、ようこそページが表示されました。




流れにそって進んでいきます。


EC-CUBEをインストールするには、事前にDBを作成しておく必要があるので、GUI等にてアクセスを行って、事前に作成しておきます。


接続情報の設定



データベースの種類で、 MySQLを選択

データベースのホスト名に、mysql-server を設定

データベース名は、事前に作成したもの

ユーザ名は root

パスワードは 「その2」の先に作成したものです。


・・・ インストール中 ・・・





無事インストールできました!!


PODを増やして 複数台っぽくしてみる


EC-CUBE3のインストールに成功しましたので、Kubernetes っぽく PODの数を増やしてみたいと思います。


apiVersion: apps/v1
kind: Deployment
metadata:
  name: mycentos7
  labels:
    app: mycentos7
spec:
  replicas: 2
  selector:
    matchLabels:
      app: mycentos7
  template:
    metadata:
      labels:
        app: mycentos7
    spec:
      containers:
      - name: mycentos7
        image: localhost:5000/web/mycentos7:2
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /var/www
          name: docroot
      volumes:
      - name: docroot
        persistentVolumeClaim:
          claimName: centos7-volume-claims

replicas を 指定してあげることにより、PODを増やすことができます。

デプロイします。

kubectl apply -f centos7.yml

確認してみます。

NAME                            READY     STATUS    RESTARTS   AGE
mycentos7-884464574-m5952       1/1       Running   0          58s
mycentos7-884464574-qb99x       1/1       Running   0          14h
mysql-server-5b9788cc57-2wvmq   1/1       Running   0          18h


増えました。

どっちの POD も Volume が共通で、ホストのものをみているので、複数台状態でも一応動きました。

(※EC-CUBEは複数台構成で動くことが想定されていません)


速度てきな問題への対応


ここまで動かしてみると重大な問題があることがわかりました。


それは、動作が遅いということです。

Docker For Mac でホスト側をマウントして普通に動かした場合も同様に遅いので、ある程度は想定しておりましたが、やはり遅いみたいです。


ぱっと思いつく問題点は、Volume 周りかなと思いますので、確認していみたいと思います。


Docker Image にパックしてみる

ソースコード全体についてホスト側をマウントしているようにしていましたが、イメージ内にパックしてみます


完全に全体をイメージに入れてしまうと、ログとかキャッシュ用にファイルを作成する部分がエラーになるので、app の配下だけはホスト側のディレクトリをマウントするようにしました。

結果は、

ソースコード全体をマウントした場合
TOP画面 ・・・ 平均 5.15秒
商品一覧 ・・・ 平均 4.86秒

一部のみマウントした状態
TOP画面 ・・・ 平均 1.34秒
商品一覧 ・・・ 平均 1.04秒


早くなりました!


ファイルが分かれて個別に作成するのが面倒な問題に対応


設定ファイルを個別に作成してきましたが、個別に create するのが面倒になってきましたので、1ファイルにまとめたいと思います。

と言ってもまとめるのは簡単です。

それぞれの設定ファイルを一箇所に集めて、「---」で区切るだけです。

(ついでに全体、ソースをはる)


# Volume
apiVersion: v1
kind: PersistentVolume
metadata:
  name: centos7-volume
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: centos7-storage
  hostPath:
    path: /ホスト側フルパス

---
# Volume Caims
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: centos7-volume-claims
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: centos7-storage

---
# deploy
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mycentos7
  labels:
    app: mycentos7
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mycentos7
  template:
    metadata:
      labels:
        app: mycentos7
    spec:
      containers:
      - name: mycentos7
        image: localhost:5000/web/mycentos7:3
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /var/www/app
          name: docroot
      volumes:
      - name: docroot
        persistentVolumeClaim:
          claimName: centos7-volume-claims

---
# Service
apiVersion: v1
kind: Service
metadata:
  name: mycentos7
  labels:
    app: mycentos7
spec:
  ports:
    - port: 80
      nodePort: 31000
  selector:
    app: mycentos7
  type: NodePort


毎回アクセスするポートが変わるのも面倒だったので、こっそり固定にしてます。
ついでに、MySQLの方もはっておきます

# Secret
apiVersion: v1
kind: Secret
metadata:
  name: mysql-pass
type: Opaque
data:
  password: XXXXX # echo -n "pass" | base64  # base64した値を設定

---
# Volume
apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-volume
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: mysql-storage
  hostPath:
    path: /ホスト側のフルパス

---
# Volume Claims
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-volume-claims
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  storageClassName: mysql-storage

---
# Deploy
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-server
  labels:
    app: mysql-server
spec:
  selector:
    matchLabels:
      app: mysql-server
  template:
    metadata:
      labels:
        app: mysql-server
    spec:
      containers:
      - name: mysql-server
        image: mysql:5.6
        ports:
        - containerPort: 3306
        volumeMounts:
        - mountPath: /var/lib/mysql
          name: mysql-storage
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
      volumes:
      - name: mysql-storage
        persistentVolumeClaim:
          claimName: mysql-volume-claims

---
# Service 外部用
apiVersion: v1
kind: Service
metadata:
  name: mysql-server-open
  labels:
    app: mysql-server
spec:
  ports:
    - port: 3306
      nodePort: 31001
  selector:
    app: mysql-server 
  type: NodePort

---
#Service 内部用
apiVersion: v1
kind: Service
metadata:
  name: mysql-server
  labels:
    app: mysql-server
spec:
  ports:
    - port: 3306
  selector:
    app: mysql-server
  clusterIP: None


Secret 部分のパスワードは、パスワードをbase64した値を設定します。

ということで、 Docker For Mac で Kubernetesを試しながらEC-CUBEをインストールするところまでできました。


よくわからないまま進んできましたが、Kubernetes の情報がのっているページ(GKEのドキュメントとか)の内容がなんとなく理解できるようになったのは収穫だったかなとおもっています。


その4は切りが悪いので、その5を書こうかなと思いつつ、以上、Docker For Mac で Kubernetes を試してEC-CUBEを動かしてみる(その4)でした。


0 件のコメント:

コメントを投稿