首页 文章

Kubernetes服务与活动/备用的集群POD

提问于
浏览
1

不保持这种简短的道歉,因为任何这样的尝试都会让我错过我的问题的一些重要细节 .

我有一个遗留Java应用程序,它在集群环境中以主动/备用模式工作,通过预定义端口公开某些RESTful Web服务 .

如果我的应用群集中有两个节点,则在任何时间点只有一个处于活动模式,另一个处于被动模式,并且请求始终由应用在活动模式下运行的节点提供 . “主动”和“被动”只是角色,因此应用程序将在两个节点上运行 . 主动和被动实例通过该相同的预定端口相互通信 .

假设我有一个双节点集群,每个节点上运行一个我的应用程序实例,那么其中一个实例最初是活动的而另一个是被动的 . 如果由于某种原因主动节点由于某种原因而进行折腾,则其他节点中的app实例使用一些心跳机制来识别它,接管控制并成为新的活动 . 当旧的活动恢复时,它会检测到另一个人拥有新的Active角色,因此它进入被动模式 .

应用程序设法在同一 endpoints 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服务将传入的请求以随机的方式路由到这些POD之一 . 由于我的REST WebService endpoints 仅在Active节点上工作,因此仅当请求通过Active角色的应用程序路由到POD时,服务请求才能通过K8S Service资源工作 . 如果在任何时间点K8S服务碰巧将传入请求路由到具有被动角色的应用程序的POD,则该服务将无法访问/未被提供 .

如何使K8S服务始终将请求路由到具有Active角色的应用程序的POD?这个在Kubernetes中是可行的还是我的目标太多了?

感谢您的时间!

2 回答

相关问题