具有共享存储的 Kubernetes 上的 ActiveMQ
ActiveMQ on Kuberenetes with Shared storage
我有使用 Apache Camel 和 ActiveMQ 构建的现有应用程序。作为迁移到 Kubernetes 的一部分,我们正在做的是将使用 Apache Camel 开发的相同服务迁移到 Kubernetes。我需要部署 ActiveMQ,这样我就不会在其中一个 Pod 死机时丢失数据。
我现在正在做的是 运行 一个 RelicaSet 值为 2 的部署。这将启动 2 pods 并且前面有一个服务,我可以在至少有 1 个 Pod 的情况下服务任何请求向上。但是,如果一个 Pod 死亡,我不想丢失数据。我想在 Pods 之间实现类似共享文件系统的东西。我的环境在 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
在高级术语中,您想要的是 StatefulSet 而不是 ActiveMQ 的 Deployment。您想要 "shared file system" 是正确的——在 kubernetes 中,这表示为“Persistent Volume”,它可用于您的 StatefulSet 中的 pods 使用一个“卷安装”。
这些是您需要查找的内容。
StatefulSets are valuable for applications that require stable, persistent storage. Deleting and/or scaling a StatefulSet down will not delete the volumes associated with the StatefulSet. This is done to ensure data safety. The "volumeClaimTemplates" part in yaml will provide stable storage using PersistentVolumes 由 PersistentVolume Provisioner 提供。
在您的情况下,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。希望对你有帮助。
我有使用 Apache Camel 和 ActiveMQ 构建的现有应用程序。作为迁移到 Kubernetes 的一部分,我们正在做的是将使用 Apache Camel 开发的相同服务迁移到 Kubernetes。我需要部署 ActiveMQ,这样我就不会在其中一个 Pod 死机时丢失数据。
我现在正在做的是 运行 一个 RelicaSet 值为 2 的部署。这将启动 2 pods 并且前面有一个服务,我可以在至少有 1 个 Pod 的情况下服务任何请求向上。但是,如果一个 Pod 死亡,我不想丢失数据。我想在 Pods 之间实现类似共享文件系统的东西。我的环境在 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
在高级术语中,您想要的是 StatefulSet 而不是 ActiveMQ 的 Deployment。您想要 "shared file system" 是正确的——在 kubernetes 中,这表示为“Persistent Volume”,它可用于您的 StatefulSet 中的 pods 使用一个“卷安装”。
这些是您需要查找的内容。
StatefulSets are valuable for applications that require stable, persistent storage. Deleting and/or scaling a StatefulSet down will not delete the volumes associated with the StatefulSet. This is done to ensure data safety. The "volumeClaimTemplates" part in yaml will provide stable storage using PersistentVolumes 由 PersistentVolume Provisioner 提供。
在您的情况下,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。希望对你有帮助。