不保持这种简短的道歉,因为任何这样的尝试都会让我错过我的问题的一些重要细节。
我有一个遗留Java应用程序,它在集群环境中以主动/备用模式工作,以通过预定义端口公开某些RESTful Web服务。
如果我的应用群集中有两个节点,则任何时间点只有一个处于活动模式,另一个处于被动模式,并且请求始终由应用在活动模式下运行的节点提供。 “主动”和“被动”只是角色,因此应用程序将在两个节点上运行。主动和被动实例通过同一预定端口相互通信。
假设我有一个双节点集群,每个节点上运行一个我的应用程序实例,那么其中一个实例最初将处于活动状态,另一个实例将处于被动状态。如果由于某种原因主动节点由于某种原因而进行折腾,则其他节点中的app实例使用一些心跳机制来识别它,接管控制并成为新的活动节点。当旧的活动恢复时它会检测到另一个人拥有新的Active角色,因此它进入被动模式。
应用程序设法在同一端点IP上提供RESTful Web服务,无论哪个节点通过使用群集IP在“活动”模式下运行应用程序,群集IP都在活动实例上,因此群集IP切换到无论哪个节点在活动模式下运行应用程序。
我正在试图将这个应用程序容器化并在Kubernetes集群中运行,以实现扩展和易于部署。我能够容纳并能够在Kubernetes集群中将其部署为POD。
为了在此处引入主动/被动角色,我正在运行此POD的两个实例,每个实例使用节点关联性固定到单独的K8S节点(每个节点标记为主动或被动,并且POD定义为引脚这些标签),并使用我的应用程序的群集机制将它们聚类,而只有一个是活动的而另一个是被动的。
我通过使用NodePort使用K8S服务语义在外部公开REST服务,并通过主节点上的NodePort公开REST WebService。
这是我的yaml文件内容:
apiVersion: v1
kind: Service
metadata:
name: myapp-service
labels:
app: myapp-service
spec:
type: NodePort
ports:
- port: 8443
nodePort: 30403
selector:
app: myapp
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: active
spec:
replicas: 1
template:
metadata:
labels:
app: myapp
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: nodetype
operator: In
values:
- active
volumes:
- name: task-pv-storage
persistentVolumeClaim:
claimName: active-pv-claim
containers:
- name: active
image: myapp:latest
imagePullPolicy: Never
securityContext:
privileged: true
ports:
- containerPort: 8443
volumeMounts:
- mountPath: "/myapptmp"
name: task-pv-storage
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: passive
spec:
replicas: 1
template:
metadata:
labels:
app: myapp
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: nodetype
operator: In
values:
- passive
volumes:
- name: task-pv-storage
persistentVolumeClaim:
claimName: active-pv-claim
containers:
- name: passive
image: myapp:latest
imagePullPolicy: Never
securityContext:
privileged: true
ports:
- containerPort: 8443
volumeMounts:
- mountPath: "/myapptmp"
name: task-pv-storage
一切似乎都运行正常,但由于两个POD都是通过同一端口公开Web服务,因此K8S服务将传入的请求以随机方式路由到其中一个PODS。由于我的REST WebService端点仅在Active节点上工作,因此仅当请求通过Active角色的应用程序路由到POD时,服务请求才能通过K8S Service资源工作。如果在任何时间点,K8S服务碰巧将传入的请求路由到POD,而应用程序处于被动角色,则该服务无法访问/无法提供服务。
如何使K8S服务始终将请求路由到具有Active角色的应用程序的POD?这个在Kubernetes中是可行的还是我的目标太多了?
感谢您的时间!
答案 0 :(得分:1)
您可以将准备情况探测与选举容器结合使用。选举将始终从选举池中选出一名主人,如果你确定只有那个舱被标记为准备好......只有那个舱将收到交通。
答案 1 :(得分:0)
实现此目的的一种方法是将pod中的标签标记添加为活动和待机。然后选择服务中的活动窗格。这会将流量发送到标记为活动的广告连播。
您可以在此文档中找到另一个示例。
https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/