具有主备集群 POD 的 Kubernetes 服务

2024-02-26

很抱歉没有保持简短,因为任何此类尝试都会让我错过问题的一些重要细节。

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

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

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

该应用程序设法在同一端点 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 端点仅在活动节点上工作,因此仅当请求路由到应用程序处于活动角色的 POD 时,服务请求才通过 K8S 服务资源工作。如果在任何时间点,K8S 服务碰巧将传入请求路由到应用程序处于被动角色的 POD,则该服务将无法访问/无法提供服务。

如何让 K8S 服务始终将请求路由到应用程序处于活动角色的 POD?这在 Kubernetes 中可行还是我的目标太多了?

感谢您的时间!


您可以将就绪探针与选举容器结合使用。选举总是会从选举池中选出一个主节点,并且如果您确保只有该 pod 被标记为就绪……只有该 pod 才会收到流量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有主备集群 POD 的 Kubernetes 服务 的相关文章

随机推荐

  • ROracle SELECT 语句中的绑定参数

    使用时ROracle in R 我想将一些参数绑定到数据 所以我这样做 gt dbh lt dbConnect Oracle user email protected cdn cgi l email protection port sid
  • SomeType' 是什么意思? [复制]' aria-label='Scala - ' => SomeType' 是什么意思? [复制]'> Scala - ' => SomeType' 是什么意思? [复制]

    这个问题在这里已经有答案了 今天我想问一下什么是 gt SomeType意思是 我发现它用在本文 http www codecommit com blog scala the magic behind parser combinators
  • 使用自签名证书进行代码签名软件

    目前 我们公司使用 Verisign Symantec 的数字证书对我们的软件进行代码签名 我们公司有人试图说服我们使用自签名证书 而不是从 Verisign Symantec 购买的证书 部分是作为 降低成本 的过程 尽管它们对于 2 3
  • 在运行时突出显示 WebDriver 中的元素

    有人可以帮忙吗 在 WebDriver 中执行测试期间 如何突出显示以下类中的所有 Web 元素 使用 Selenium RC 时 一切都非常简单 但使用 WebDriver 时我却遇到了困难 如果有人能为我提供一些我可以尝试的代码 以及该
  • .NET 集合类的渐近复杂度

    是否有任何关于 NET 集合类方法的渐近复杂性 big O 和其他 的资源 Dictionary
  • 为什么 Asp.Net Core 身份验证方案是强制性的

    我对 Asp Net Core 中似乎强制使用身份验证方案这一事实感到非常沮丧 我的目标是构建一个 API 我不想了解有关客户端的任何信息 我已经构建了自定义身份验证和授权 效果很好 我没有使用身份或cookie 但是 如果没有有效的身份验
  • 如何使用 Angular 过滤器对数据进行分组?

    我有一份球员名单 每个球员都属于一个组 如何使用过滤器列出每个组的用户 name Gene team team alpha name George team team beta name Steve team team gamma name
  • jdk1.6内存布局

    我使用的是jdk1 6 我配置了 Xmx 2G Xms 2G 新尺寸 最大新尺寸 660m 我启用了详细GC 我看到了这一点 但我不明白 PSYoungGen total 608256K used 32440K eden space 540
  • 我应该有多少个 DBContext

    使用实体 我目前拥有 dbcontext 其中包含每个表 我想知道是否每个人都这样做 或者例如每个模块都有一个上下文 对我来说 dbcontext 是一种将模型映射到数据库的连接 并且由于只有一个数据库 所以我只需要一个 在我深入讨论之前
  • 防止登录请求泛滥的简单方法?

    如果我的网站使用 POST 表单进行登录 有什么快速 简单的方法可以防止恶意客户端向我的 Web 服务器发送大量 POST 请求 试图暴力破解我的用户帐户 PHP MySQL Apache 防止暴力破解比乍看起来要棘手 解决方案是组合控制
  • 对象、类、函数

    我想知道 JavaScript 对象 类和函数之间有什么区别 我认为类和函数是对象类型是正确的吗 类和函数的区别是什么 或者它们真的是同一件事 只是它们的术语根据它们的使用方式而变化 function func alert foo a fu
  • vscode 选择不寻常的自动完成选项

    在使用最新版本的 Visual Studio Code 时 我正在编辑 JavaScript 文件 并且经常希望将输出记录到控制台 我创建了一个用户片段 以便更容易自动完成 但我发现自动完成中获得的默认选项是下面红色突出显示的选项 而不是绿
  • 重载不明确(int -> int64_t 与 int -> double)

    为什么是隐式转换int to int64 t vs int to double模糊的 我本以为积分重载会优先于浮点积分 include
  • 无法将 X 用作 Y,因为该名称已在使用中,即使尚未使用

    我使用的是 PHP 5 4 并且具有类似于以下内容的 PSR 0 类结构 A Library Session php namespace A Library class Session 我的 应用程序 Session php namespa
  • Kendo UI 指令要求 jQuery 在 AngularJS 之前可用。请在文档中的 Angular 之前包含 jquery

    我有一个带有角度应用程序的 Mvc 有两个布局文件 登录布局 默认布局 主布局 单击 影片 按钮时 调用 影片控制器 和 影片动作 public ActionResult Movie return View 它使用 mainlayout 文
  • 如何编写具有默认值和选项的 tcl 程序?

    我正在尝试编写一个 tcl 程序 它执行以下操作 proc myProc arg1 def1 arg2 def2 tcl gt myProc arg1 val1 arg2 val2 arg1 variable has val1 arg2 v
  • Maven Buildnumber 插件 - Git

    Maven Buildnumber 插件似乎还不能与 GIT 一起使用 暂时有解决办法吗 我最近从 SVN 切换到 GIT 发现这是一个简单的过渡 但这是我目前唯一没有做的事情 Walter 我使用这个 Maven 插件 https git
  • 茉莉花角度单元测试'无法读取未定义的'属性'

    我刚刚开始学习角度单元测试 但是 对具有 http 调用的函数的此测试失败 我已经指出了问题 但我无法解决它 我知道这是一个简单的问题 控制器 Get data from URL vm getJson function var url ht
  • Process.Start,WorkingDirectory,从一个exe启动另一个

    我希望你能明白我的问题 不知道我是否能用英语正确描述它 但我会尝试 情况 文件夹结构 MainFolder Sub1 Sub2 2个exe文件 MainFolder MainProg exe和 Sub2 SecondProg exe Mai
  • 具有主备集群 POD 的 Kubernetes 服务

    很抱歉没有保持简短 因为任何此类尝试都会让我错过问题的一些重要细节 我有一个旧版 Java 应用程序 它在集群环境中以主动 备用模式工作 通过预定义端口公开某些 RESTful Web 服务 如果我的应用程序集群中有两个节点 则在任何时间点