Kubernetes 具有共享存储的Kuberenetes上的ActiveMQ
我有使用ApacheCamel和ActiveMQ构建的现有应用程序。作为迁移到Kubernetes的一部分,我们正在将使用ApacheCamel开发的相同服务迁移到Kubernetes。我需要部署ActiveMQ,以便在其中一个Pod死亡时不会丢失数据 我现在要做的是运行RelicaSet值为2的部署。这将启动2个吊舱,在前面有一个服务,我可以在至少1个吊舱启动时提供任何请求。但是,如果一个吊舱死亡,我不想丢失数据。我想在pod之间实现一些类似于共享文件系统的东西。我的环境在AWS中,因此我可以使用EBS。你能建议一下,如何做到这一点 下面是我的部署和服务YAMLKubernetes 具有共享存储的Kuberenetes上的ActiveMQ,kubernetes,activemq,kubernetes-pvc,Kubernetes,Activemq,Kubernetes Pvc,我有使用ApacheCamel和ActiveMQ构建的现有应用程序。作为迁移到Kubernetes的一部分,我们正在将使用ApacheCamel开发的相同服务迁移到Kubernetes。我需要部署ActiveMQ,以便在其中一个Pod死亡时不会丢失数据 我现在要做的是运行RelicaSet值为2的部署。这将启动2个吊舱,在前面有一个服务,我可以在至少1个吊舱启动时提供任何请求。但是,如果一个吊舱死亡,我不想丢失数据。我想在pod之间实现一些类似于共享文件系统的东西。我的环境在AWS中,因此我可以
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
在高级术语中,您需要的是一个StatefulSet,而不是ActiveMQ的部署。您想要的是“共享文件系统”——在kubernetes中,这表示为“持久卷”,它可以通过“卷装载”提供给状态集中的POD 这些是您需要查找的内容。对于需要稳定、持久存储的应用程序非常有用。删除和/或向下缩放StatefulSet不会删除与该StatefulSet关联的卷。这样做是为了确保数据安全。yaml中的“volumeClaimTemplates”部分将使用PersistentVolume Provisionier提供的资源提供稳定的存储 在您的情况下,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
apiVersion:v1
种类:服务
元数据:
名称:smp activemq
标签:
应用程序:smp activemq
规格:
类型:节点端口
选择器:
应用程序:smp activemq
端口:
-节点端口:32191
端口:61616
名称:smp activemq
目标港:61616
---
apiVersion:apps/v1
种类:StatefulSet
元数据:
名称:smp activemq
规格:
选择器:
火柴标签:
应用程序:smp activemq
服务名称:smp activemq
副本:1份
模板:
元数据:
标签:
应用程序:smp activemq
规格:
容器:
-名称:smp activemq
图片:dasdebde/activemq:5.15.9
imagePullPolicy:如果不存在
端口:
-集装箱港口:61616
名称:smp activemq
体积数量:
-姓名:www
安装路径:
VolumeClaim模板:
-元数据:
姓名:www
规格:
accessModes:[“ReadWriteOnce”]
storageClassName:“
资源:
请求:
存储:1Gi
您需要定义的是StorageClass名称和装载路径。我希望它能对您有所帮助。请正确格式化yaml文件:)请注意,您不必在容器中运行所有内容,因为无状态组件的容器比有状态组件的容器受益更多。AWS提供ActiveMQ作为托管服务,称为“Amazon MQ”。我知道,但在我的情况下,环境将使用DMZ运行。所以我尽量避免使用AWS服务,让我试试你的建议。谢谢