【问题标题】:ActiveMQ on Kuberenetes with Shared storageKubernetes 上的 ActiveMQ 与共享存储
【发布时间】:2019-07-31 11:08:05
【问题描述】:

我有使用 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

【问题讨论】:

  • 请正确格式化yaml文件:)
  • 我觉得还可以

标签: kubernetes activemq kubernetes-pvc


【解决方案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。希望对你有帮助。

【讨论】:

    【解决方案2】:

    在高级术语中,您需要的是 StatefulSet,而不是 ActiveMQ 的部署。您想要“共享文件系统”是正确的——在 kubernetes 中,这表示为“Persistent Volume”,它可以使用“Volume Mount”提供给 StatefulSet 中的 pod ”。

    这些是您需要查找的内容。

    【讨论】:

    • 请注意,您不一定必须在容器中运行所有内容——您从容器中获得的无状态组件比有状态组件要多得多。 AWS 将 ActiveMQ 作为托管服务提供,称为“Amazon MQ”
    • 我明白,但在我的情况下,环境将使用 DMZ 运行。所以我尽量避免使用 AWS 服务
    • 让我试试你的建议。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 2023-03-15
    • 2020-12-09
    • 2019-03-14
    • 1970-01-01
    相关资源
    最近更新 更多