首页 > 解决方案 > 在一组副本中选择一个 Kubernetes pod 来执行任务

问题描述

我有一个在 Kubernetes pod 中运行的 java 应用程序。

该应用程序执行多项任务(taskAtaskB等)。该应用程序支持在不同的 pod 中运行多个实例。所有 pod 都在执行相同的任务。

但是,有一项任务只能由其中一个 pod 完成(例如taskA,应该只在其中一个 pod 中运行)。如果执行特定任务的 pod 死亡,其他节点之一应该开始执行该任务(被动节点,关于taskA,接管)。

k8s 中是否对此功能有一些支持,或者我是否需要使用其他服务(例如 zookeeper)?

标签: kubernetesapache-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

推荐阅读