amazon-web-services - AWS EKS K8s 服务和 CronJob/Jon 同一个节点
问题描述
我有一个 k8s 部署,它包括一个 cron 作业(每小时运行一次)、服务(运行 http 服务)和一个存储类(pvc 来存储数据,使用 gp2)。
我看到的问题是 gp2 只能读写一次。
我注意到当 cron 作业创建一个作业并且它与它可以正常安装的服务降落在同一个节点上时。
我可以在服务、部署或 cron 作业 yaml 中做些什么来确保 cron 作业和服务始终位于同一个节点上?它可以是任何节点,但只要 cron 作业与服务进入同一节点即可。
这在我的较低环境中不是问题,因为我们的节点很少,但在我们有更多节点的生产环境中,这是一个问题。
简而言之,我想获得我的 cron 作业,它会创建一个作业然后 pod 以在我的服务 pod 所在的同一节点上运行该 pod。
我知道这不是最佳实践,但我们的网络服务从 pvc 读取数据并提供服务。cron 作业从其他来源提取新数据并将其留给网络服务器。
为其他想法/方式感到高兴。
谢谢
解决方案
只关注部分:
如何将工作负载 (
Pod
,Job
,Cronjob
) 安排在一组特定的Nodes
您可以通过以下方式生成Cronjob
/ Job
:
nodeSelector
nodeAffinity
nodeSelector
nodeSelector
是最简单的节点选择约束推荐形式。nodeSelector
是 PodSpec 的一个字段。它指定键值对的映射。为了使 pod 有资格在节点上运行,节点必须将每个指示的键值对作为标签(它也可以有额外的标签)。最常见的用法是一个键值对。
它的示例可能如下(假设您的节点具有在 中引用的特定标签.spec.jobTemplate.spec.template.spec.nodeSelector
):
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
nodeSelector: # <-- IMPORTANT
schedule: "here" # <-- IMPORTANT
containers:
- name: hello
image: busybox
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
在清单上方运行会将您的Pod
( Cronjob
) 安排在具有schedule=here
标签的节点上:
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
hello-1616323740-mqdmq 0/1 Completed 0 2m33s 10.4.2.67 node-ffb5 <none> <none>
hello-1616323800-wv98r 0/1 Completed 0 93s 10.4.2.68 node-ffb5 <none> <none>
hello-1616323860-66vfj 0/1 Completed 0 32s 10.4.2.69 node-ffb5 <none> <none>
nodeAffinity
节点亲和性在概念上类似于
nodeSelector
- 它允许您根据节点上的标签来限制您的 pod 有资格在哪些节点上进行调度。目前有两种类型的节点亲和性,称为
requiredDuringSchedulingIgnoredDuringExecution
和preferredDuringSchedulingIgnoredDuringExecution
。您可以将它们分别视为“硬”和“软”,因为前者指定了将 Pod 调度到节点上必须满足的规则(就像 nodeSelector,但使用更具表现力的语法),而后者指定调度程序将尝试强制执行但不保证的首选项。-- Kubernetes.io: Docs: Concepts: Scheduling eviction: Assign pod node: Node affinity
它的示例可能如下(假设您的节点具有在 中引用的特定标签.spec.jobTemplate.spec.template.spec.nodeSelector
):
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
# --- nodeAffinity part
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: schedule
operator: In
values:
- here
# --- nodeAffinity part
containers:
- name: hello
image: busybox
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
$ kubectl get pods
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
hello-1616325840-5zkbk 0/1 Completed 0 2m14s 10.4.2.102 node-ffb5 <none> <none>
hello-1616325900-lwndf 0/1 Completed 0 74s 10.4.2.103 node-ffb5 <none> <none>
hello-1616325960-j9kz9 0/1 Completed 0 14s 10.4.2.104 node-ffb5 <none> <none>
其他资源:
我想你也可以看看这个 StackOverflow 答案:
推荐阅读
- swift - SKView.presentScene(scene) 不起作用,但 SKView.presentScene(scene, transition) 起作用
- javascript - html5画布文本不是指定的大小
- c# - 这个 LINQ 查询在 C# 中做了什么?
- karate - 在单个场景中的请求之间重置路径是预期的行为吗?
- wordpress - WooCommerce 登录后重定向页面
- java - 禁用 IntelliJ IDEA 中的所有提示
- java - 无法为 R 安装 xlsx 包
- windows-10 - 在 IE11 中禁用 HTTP/2
- javascript - 当我在 Heroku 上部署时 sendGrid 不工作
- haskell - 如何正确缩进 OSC 配置