こんにちは、香田です。
今回は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で実行させる際、本記事が参考になれば幸いでございます。
最後までご覧いただきありがとうございます。