共享存储的Kuberenetes上的ActiveMQ

时间:2019-07-31 11:08:05

标签: kubernetes activemq kubernetes-pvc

我有使用Apache Camel和ActiveMQ构建的现有应用程序。作为向Kubernetes迁移的一部分,我们正在做的就是将使用Apache Camel开发的相同服务迁移到Kubernetes。我需要部署ActiveMQ,以防万一其中一个Pod死掉而不会丢失数据。

我现在正在运行一个RelicaSet值为2的部署。这将启动2个Pod,并且前面有一个Service,在至少1个Pod启动时,我可以满足任何请求。但是,如果一个Pod死了,我不想丢失数据。我想实现Pod之间的共享文件系统之类的功能。我的环境在AWS中,因此我可以使用EBS。你能建议如何实现吗?

下面是我的部署和服务YAML。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: smp-activemq
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: smp-activemq
    spec:
      containers:
        - name: smp-activemq
          image: dasdebde/activemq:5.15.9
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 61616
          resources:
            limits:
              memory: 512Mi

---
apiVersion: v1
kind: Service
metadata:
  name: smp-activemq
spec:
  type: NodePort
  selector:
    app: smp-activemq
  ports:
    - nodePort: 32191
      port: 61616
      targetPort: 61616

2 个答案:

答案 0 :(得分:2)

从高级的角度讲,您想要的是 StatefulSet ,而不是ActiveMQ的Deployment。您正确地想要“共享文件系统”-在kubernetes中,它表示为“ Persistent Volume ”,使用“ Volume Mount”可将其用于StatefulSet中的Pod。 ”。

这些是您需要查找的东西。

答案 1 :(得分:1)

StatefulSets对于需要稳定,持久存储的应用程序很有用。删除和/或缩小StatefulSet不会删除与StatefulSet关联的卷。这样做是为了确保数据安全。 yaml中的“ volumeClaimTemplates”部分将使用由PersistentVolume Provisioner提供的PersistentVolumes提供稳定的存储。

对于您来说,StatefulSet文件定义将类似于以下内容:

apiVersion: v1
kind: Service
metadata:
  name: smp-activemq
  labels:
    app: smp-activemq
spec:
  type: NodePort
  selector:
    app: smp-activemq
  ports:
  - nodePort: 32191
    port: 61616
    name: smp-activemq
    targetPort: 61616

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: smp-activemq
spec:
  selector:
    matchLabels:
      app: smp-activemq
  serviceName: smp-activemq
  replicas: 1
  template:
    metadata:
      labels:
        app: smp-activemq
    spec:
      containers:
      - name: smp-activemq
        image: dasdebde/activemq:5.15.9
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 61616
          name: smp-activemq
        volumeMounts:
        - name: www
          mountPath: <mount-path>
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "<storageclass-name>"
      resources:
        requests:
          storage: 1Gi

您需要定义的是您的StorageClass名称和mountPath。希望对您有帮助。