我有使用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
答案 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。希望对您有帮助。