2020/06/05

RabbitMQをGKE上に導入する

gkek8srabbitmq

概要

Titleの通りですが、メッセージングミドルウェアの一つであるRabbitMQをGKEを使って導入しました。
RabbitMQはBackground task管理に利用しています。(BackendにCeleryを導入しているのですが、それのBroker用にRabbitMQを使っています。)

実施事項

以下の通り設定ファイルを作って、deployしました。

k8sのデプロイ内容詳細

事前準備

  • RabbitMQデータの永続化のためのCompute Diskを作成しました。

以下のようなコマンドで作成しました。(daily-snapshotという一日に一回スナップショットをとるポリシー付きです)

gcloud beta compute disks create "rabbitmq" \
  --project="your-google-project-id" \
  --zone="your-google-project-zone" \
  --type=pd-ssd \
  --size=20GB \
  --resource-policies=projects/your-google-project-id/regions/your-google-project-region/resourcePolicies/daily-snapshot

k8sへのデプロイ設定ファイル及び順序

namespace

apiVersion: v1
kind: Namespace
metadata:
  name: rabbitmq

config map

apiVersion: v1
kind: ConfigMap
metadata:
  name: rabbitmq
  namespace: rabbitmq
data:
  user: your_rabbitmq_username
  vhost: your_rabbitmq_default_vhost_name

secret

apiVersion: v1
kind: Secret
metadata:
  name: rabbitmq
  namespace: rabbitmq
type: Opaque
data:
  password: <your-rabbitmq-password base64 encoded string here>

pv & pvc

apiVersion: v1
kind: PersistentVolume
metadata:
  name: rabbitmq
spec:
  storageClassName: rabbitmq
  capacity:
    storage: 20Gi # <- 事前準備で作成したDisk Size
  accessModes:
    - ReadWriteOnce
  gcePersistentDisk:
    pdName: rabbitmq # <- 事前準備で作成したDisk Name
    fsType: ext4
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: rabbitmq
  namespace: rabbitmq
spec:
  storageClassName: rabbitmq
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi

deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: rabbitmq
  namespace: rabbitmq
spec:
  replicas: 1
  selector:
    matchLabels:
      app: rabbitmq
  template:
    metadata:
      name: rabbitmq
      labels:
        app: rabbitmq
    spec:
      containers:
        - name: rabbitmq
          image: rabbitmq:3.8.3-management-alpine
          ports:
            - name: rabbitmq
              containerPort: 5672
            - name: management
              containerPort: 15672
          env:
            - name: RABBITMQ_DEFAULT_USER
              valueFrom:
                configMapKeyRef:
                  name: rabbitmq
                  key: user
            - name: RABBITMQ_DEFAULT_PASS
              valueFrom:
                secretKeyRef:
                  name: rabbitmq
                  key: password
            - name: RABBITMQ_DEFAULT_VHOST
              valueFrom:
                configMapKeyRef:
                  name: rabbitmq
                  key: vhost
          volumeMounts:
            - mountPath: /var/lib/rabbitmq
              name: rabbitmq
      volumes:
        - name: rabbitmq
          persistentVolumeClaim:
            claimName: rabbitmq

service

apiVersion: v1
kind: Service
metadata:
  name: rabbitmq
  namespace: rabbitmq
spec:
  ports:
    - name: rabbitmq
      port: 5672
      targetPort: rabbitmq
  selector:
    app: rabbitmq

その他

management consoleへのログイン

以下を実行して、podの15672portをlocalhostにフォワーディングします。

kubectl port-forward $(kubectl get pods --no-headers -o custom-columns=":metadata.name" -n rabbitmq | grep rabbitmq) -n rabbitmq 15672:15672

その後 http://localhost:15672 にアクセスして、configmapやsecretで定義したuser/passwordでログインできます。

rabbitmqのpodへのログイン
kubectl exec -it $(kubectl get pods --no-headers -o custom-columns=":metadata.name" -n rabbitmq | grep rabbitmq) -n rabbitmq -- bash