KubernetesへMauticをデプロイする

こんにちは、香田です。

今回はKubernetesへMauticをデプロイする方法について紹介していきます。

ローカル環境で検証できるようにKubernetesはMinikubeを使用していきます。

また、Mauticを複数台で構成した際、ファイルが共有できるようにVagrantでNFSサーバーを用意していきます。

Kubernetesの作成

はじめにMinikubeを起動し、Kubernetesを作成します。

minikube start --driver=virtualbox

NFSサーバーとの疎通確認用にMinikubeのIPを確認します。

minikube ip

NFSサーバーの作成

NFSサーバー用のVagrantfileを作成します。ipの箇所は必要に応じて適宜修正してください。

# -*- mode: ruby -*-
# vi: set ft=ruby :
$script = <<-SCRIPT
yum install nfs-utils -y
systemctl enable rpcbind
systemctl enable nfs-server
systemctl enable nfs-lock
systemctl enable nfs-idmap
systemctl start rpcbind
systemctl start nfs-server
systemctl start nfs-lock
systemctl start nfs-idmap
mkdir -p /var/share/nfs
echo "/var/share/nfs 192.168.0.0/16(rw,async,no_root_squash)" >>/etc/exports
systemctl restart nfs-server
SCRIPT

Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  config.vbguest.auto_update = false
  config.vm.define :nfs_server do |local|
    local.vm.network :private_network, ip: "192.168.99.100"
    local.vm.hostname = "nfs-server"
    local.vm.provision "shell", inline: $script
  end
end

Vagrantを起動し、NFSサーバを作成します。

vagrant up

MinikubeのIPを指定し、NFSサーバからMinikubeへ疎通できているか確認します。

vagrant ssh -c "ping -c 3 <Minikube IP>;"

Mautic コンテナ イメージの作成

mautic:v3の公式イメージを元にDockerfileを作成します。

Mauticのcron設定は、CronJob等で別途実行させたほうがよいので元のイメージから削除しています。

また、セッション情報の保存先にRedisを使用できるようにphpredisを追加します。

FROM mautic/mautic:v3

RUN rm -f /etc/cron.d/mautic
RUN git clone https://github.com/phpredis/phpredis.git /usr/src/php/ext/redis
RUN docker-php-ext-install redis

作成したDockerfileを元にコンテナイメージをビルドしGCRへ保存します。

gcloud builds submit --tag gcr.io/$(gcloud config get-value project)/mautic-v3:latest

GCRアクセス用のSecret作成

GCRからイメージ取得できるように、ユーザーアカウントを利用しSecretを作成します。

docker-emailの箇所は適宜修正してください。

kubectl create secret docker-registry gcr-secret \
--docker-server=gcr.io \
--docker-username=oauth2accesstoken \
--docker-password="$(gcloud auth print-access-token)" \
--docker-email=<youremail@example.com>

MySQL デプロイ

Mauticで利用するDBとしてMySQLをデプロイしていきます。下記のマニフェストをコピーし作成します。

  • mysql-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-data
  labels:
    app: mysql-data
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
  • mysql-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
  labels:
    app: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: mysql:5.7
          args:
            - --character-set-server=utf8mb4
            - --collation-server=utf8mb4_general_ci
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: mysecret
          volumeMounts:
            - mountPath: /var/lib/mysql
              name: mysql-data
      volumes:
        - name: mysql-data
          persistentVolumeClaim:
            claimName: mysql-data
  • mysql-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: mysql
  labels:
    app: mysql
spec:
  ports:
    - port: 3306
  selector:
    app: mysql

作成したMySQLのマニフェストをデプロイします。

kubectl apply -f mysql-pvc.yaml
kubectl apply -f mysql-deployment.yaml
kubectl apply -f mysql-service.yaml

Redis デプロイ

Mauticを複数台構成にした場合も、セッション情報を共有できるようRedisをデプロイしていきます。下記のマニフェストをコピーし作成します。

  • redis-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
        - name: redis
          image: redis
          ports:
            - containerPort: 6379
  • redis-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: redis
  labels:
    app: redis
spec:
  ports:
    - port: 6379
      targetPort: 6379
  selector:
    app: redis

作成したRedisのマニフェストをデプロイします。

kubectl apply -f redis-deployment.yaml
kubectl apply -f redis-service.yaml

Mautic デプロイ

Mautic本体をデプロイしていきます。下記のマニフェストをコピーし作成します。

下記マニフェストのmautic-pv.yamlで指定していNFSサーバーのIPは適宜修正してください。

また、mautic-deployment.yamlで指定しているimage:<GCP プロジェクトID>も同様に修正してください。

  • mautic-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-server
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: /var/share/nfs
    server: 192.168.99.100
  • mautic-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mautic-data
  labels:
    app: mautic-data
spec:
  storageClassName: ""
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi
  • mautic-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: php-config-map
data:
  redis.ini: |
    session.save_handler = redis
    session.save_path = "tcp://redis:6379"
  • mautic-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mautic
  labels:
    app: mautic
spec:
  replicas: 2
  selector:
    matchLabels:
      app: mautic
  template:
    metadata:
      labels:
        app: mautic
    spec:
      containers:
        - name: mautic
          image: gcr.io/<GCP プロジェクトID>/mautic-v3:latest
          env:
            - name: MAUTIC_DB_HOST
              value: mysql
            - name: MAUTIC_DB_NAME
              value: mautic
            - name: MAUTIC_DB_PASSWORD
              value: mysecret
            - name: MAUTIC_DB_USER
              value: root
            - name: MYSQL_PORT_3306_TCP
              value: "3306"
          ports:
            - containerPort: 80
          volumeMounts:
            - mountPath: /usr/local/etc/php/conf.d/redis.ini
              name: php-config
              subPath: redis.ini
            - mountPath: /var/www/html
              name: mautic-data
      imagePullSecrets:
        - name: gcr-secret
      volumes:
        - name: php-config
          configMap:
            name: php-config-map
        - name: mautic-data
          persistentVolumeClaim:
            claimName: mautic-data
  • mautic-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: mautic
  labels:
    app: mautic
spec:
  ports:
    - port: 8080
      targetPort: 80
  selector:
    app: mautic
  type: LoadBalancer

作成したMauticのマニフェストをデプロイします。

kubectl apply -f mautic-pv.yaml
kubectl apply -f mautic-pvc.yaml
kubectl apply -f mautic-configmap.yaml
kubectl apply -f mautic-deployment.yaml
kubectl apply -f mautic-service.yaml

接続確認

下記でPodが実行中であることを確認します。

kubectl get pods

問題なければminikube serviceコマンドを利用し、Mauticへアクセスします。

minikube service mautic

ブラウザが起動し対象URLへアクセス後、しばらくすると下記のようにインストール画面が表示されれば成功です。

さいごに

KubernetesへMauticをデプロイする方法いかがでしたしょうか?

Minikubeのローカル環境で確認できたので、GKEやEKSなどのマネージドKubernetes環境でMauticを運用してみるのもよいのではないでしょうか。

MauticをKubernetesで実行させる際、本記事が参考になれば幸いでございます。

最後までご覧いただきありがとうございます。

SNSでもご購読できます。