kubernetes - 在一组副本中选择一个 Kubernetes pod 来执行任务
问题描述
我有一个在 Kubernetes pod 中运行的 java 应用程序。
该应用程序执行多项任务(taskA
、taskB
等)。该应用程序支持在不同的 pod 中运行多个实例。所有 pod 都在执行相同的任务。
但是,有一项任务只能由其中一个 pod 完成(例如taskA
,应该只在其中一个 pod 中运行)。如果执行特定任务的 pod 死亡,其他节点之一应该开始执行该任务(被动节点,关于taskA
,接管)。
k8s 中是否对此功能有一些支持,或者我是否需要使用其他服务(例如 zookeeper)?
解决方案
据我了解,我认为您应该使用ReplicaSet。
您应该创建两个 ReplicaSet,第一个用于任务 A,第二个用于任务B。
ReplicaSet 由字段定义,包括指定如何识别可以获取的 Pod 的选择器、指示它应该维护多少个 Pod 的副本数量以及指定它应该创建以满足数量的新 Pod 的数据的 Pod 模板副本标准。然后,ReplicaSet 通过根据需要创建和删除 Pod 以达到所需数量来实现其目的。当一个 ReplicaSet 需要创建新的 Pod 时,它使用它的 Pod 模板。
ReplicaSet 与其 Pod 的链接是通过 Pod 的 metadata.ownerReferences 字段,该字段指定当前对象所拥有的资源。ReplicaSet 获取的所有 Pod 在其 ownerReferences 字段中都有其拥有的 ReplicaSet 的标识信息。正是通过这个链接,ReplicaSet 才知道它正在维护的 Pod 的状态并做出相应的计划。
ReplicaSet 使用其选择器标识要获取的新 Pod。如果有一个 Pod 没有 OwnerReference 或者 OwnerReference 不是一个 Controller 并且它匹配到一个 ReplicaSet 的选择器,它会立即被该 ReplicaSet 获取。
ReplicaSet 负责在任何给定时间运行指定数量的 pod 副本。
这是 ReplicaSet 的简单 yaml 配置文件:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: example
labels:
app: guestbook
tier: eg
spec:
replicas: 1 #provided appreciated amount of replicas
selector:
matchLabels:
tier: eg
template:
metadata:
labels:
tier: eg
spec:
containers:
- name: php
image: gcr.io/google_samples/gb-frontend:v3
推荐阅读
- powershell - Powershell函数参数正确使用
- r - 使用 tidyverse 重塑 data.frame 及其列名
- javascript - 从频道获取一系列消息
- php - Laravel 图片上传验证失败
- c# - 检索隐藏的文本块并替换其中两个之间的所有内容
- python - 不使用范围的 Python 中的高效迭代
- reactjs - 由 nginx 后面的 express 提供的 React Okta 身份验证
- python-3.x - GZIP python3 AttributeError:“模块”对象没有属性“压缩”
- r - checkboxGroupInput 在 observeEvent 之前更新
- windows - 如何将句柄重定向到不同的文件