Skip to content

Instantly share code, notes, and snippets.

@pmint93
Last active March 23, 2019 03:14

Revisions

  1. pmint93 revised this gist Mar 23, 2019. No changes.
  2. pmint93 revised this gist Jan 10, 2018. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion rabbitmq-autocluster_k8s_persistent.bash
    Original file line number Diff line number Diff line change
    @@ -112,7 +112,7 @@ spec:
    app: rabbitmq
    EOF

    # LoadBalancer service for real world facing
    # LoadBalancer service for public access

    cat <<EOF | kubectl apply -f -
    kind: Service
  3. pmint93 renamed this gist Jan 10, 2018. 1 changed file with 0 additions and 0 deletions.
  4. pmint93 created this gist Jan 10, 2018.
    155 changes: 155 additions & 0 deletions rabbitmq_cluster_k8s_persistent.bash
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,155 @@
    #!/bin/bash

    set -eo pipefail

    export KUBE_NAMESPACE=test
    export REPLICA_COUNT=3

    cat <<EOF | kubectl apply -f -
    apiVersion: apps/v1beta1
    kind: StatefulSet
    metadata:
    name: rabbitmq
    namespace: $KUBE_NAMESPACE
    spec:
    serviceName: rabbitmq
    replicas: $REPLICA_COUNT
    template:
    metadata:
    labels:
    app: rabbitmq
    spec:
    terminationGracePeriodSeconds: 10
    containers:
    - name: rabbitmq-autocluster
    image: pivotalrabbitmq/rabbitmq-autocluster
    ports:
    - name: http
    protocol: TCP
    containerPort: 15672
    - name: amqp
    protocol: TCP
    containerPort: 5672
    livenessProbe:
    exec:
    command: ["rabbitmqctl", "status"]
    initialDelaySeconds: 30
    timeoutSeconds: 5
    readinessProbe:
    exec:
    command: ["rabbitmqctl", "status"]
    initialDelaySeconds: 10
    timeoutSeconds: 5
    imagePullPolicy: Always
    env:
    - name: MY_POD_IP
    valueFrom:
    fieldRef:
    fieldPath: status.podIP
    - name: NAMESPACE
    valueFrom:
    fieldRef:
    fieldPath: metadata.namespace
    - name: HOSTNAME
    valueFrom:
    fieldRef:
    fieldPath: metadata.name
    - name: RABBITMQ_USE_LONGNAME
    value: "true"
    - name: RABBITMQ_NODENAME
    value: "rabbit@\$(HOSTNAME).rabbitmq.\$(NAMESPACE).svc.cluster.local"
    - name: AUTOCLUSTER_TYPE
    value: "k8s"
    - name: AUTOCLUSTER_DELAY
    value: "10"
    - name: K8S_ADDRESS_TYPE
    value: "hostname"
    - name: K8S_SERVICE_NAME
    value: rabbitmq
    - name: K8S_HOSTNAME_SUFFIX
    value: ".rabbitmq.\$(NAMESPACE).svc.cluster.local"
    - name: AUTOCLUSTER_CLEANUP
    value: "false"
    - name: CLEANUP_WARN_ONLY
    value: "true"
    volumeMounts:
    - name: rabbitmq-data
    mountPath: /var/lib/rabbitmq/mnesia
    volumeClaimTemplates:
    - metadata:
    name: rabbitmq-data
    annotations:
    volume.beta.kubernetes.io/storage-class: gp2
    spec:
    accessModes: [ "ReadWriteOnce" ]
    resources:
    requests:
    storage: 4Gi
    EOF

    # Headless service for Pod DNS

    cat <<EOF | kubectl apply -f -
    kind: Service
    apiVersion: v1
    metadata:
    namespace: $KUBE_NAMESPACE
    name: rabbitmq
    labels:
    app: rabbitmq
    spec:
    clusterIP: None
    ports:
    - name: http
    protocol: TCP
    port: 15672
    targetPort: 15672
    - name: amqp
    protocol: TCP
    port: 5672
    targetPort: 5672
    selector:
    app: rabbitmq
    EOF

    # LoadBalancer service for real world facing

    cat <<EOF | kubectl apply -f -
    kind: Service
    apiVersion: v1
    metadata:
    namespace: $KUBE_NAMESPACE
    name: rabbitmq-lb
    labels:
    app: rabbitmq
    type: LoadBalancer
    spec:
    type: LoadBalancer
    ports:
    - name: http
    protocol: TCP
    port: 15672
    targetPort: 15672
    - name: amqp
    protocol: TCP
    port: 5672
    targetPort: 5672
    selector:
    app: rabbitmq
    EOF

    echo "Waiting for StatefulSet to complete rolled out"
    # kubectl rollout status statefulset/rabbitmq -n $KUBE_NAMESPACE # Not supported in k8s v1.6 and prior
    for i in $(seq 1 120); do
    if kubectl exec rabbitmq-$(($REPLICA_COUNT - 1)) -n $KUBE_NAMESPACE -- rabbitmqctl status &> /dev/null; then
    break
    fi
    sleep 1s
    done
    if [[ "$i" == 120 ]]; then
    echo "StatefulSet taking too long to complete, you need to manual install..."
    exit 1
    fi

    echo "Setting up HA policy"
    kubectl exec rabbitmq-0 -n $KUBE_NAMESPACE -- rabbitmqctl set_policy ha-all "" '{"ha-mode":"all","ha-sync-mode":"automatic"}'