[英]how to run a job in each node of kubernetes instead of daemonset
有一个具有 100 个节点的 kubernetes 集群,我必须手动清理特定图像,我知道 kubelet 垃圾收集可能会有所帮助,但它不适用于我的案例。 浏览互联网后,我在docker中找到了一个解决方案——docker,解决了我的问题。
我只想删除每个节点中的图像一次,有没有办法在每个节点中运行一次作业?
我检查了 kubernetes 标签和 podaffinity,但仍然没有任何想法,任何人都可以帮忙吗?
另外,我尝试使用 daemonset 来解决问题,但事实证明它只能删除部分节点而不是所有节点的图像,我不知道可能是什么问题......
这是守护程序集示例:
kind: DaemonSet
apiVersion: apps/v1
metadata:
name: test-ds
labels:
k8s-app: test
spec:
selector:
matchLabels:
k8s-app: test
template:
metadata:
labels:
k8s-app: test
spec:
containers:
- name: test
env:
- name: DELETE_IMAGE_NAME
value: "nginx"
image: busybox
command: ['sh', '-c', 'curl --unix-socket /var/run/docker.sock -X DELETE http://localhost/v1.39/images/$(DELETE_IMAGE_NAME)']
securityContext:
privileged: true
volumeMounts:
- mountPath: /var/run/docker.sock
name: docker-sock-volume
ports:
- containerPort: 80
volumes:
- name: docker-sock-volume
hostPath:
# location on host
path: /var/run/docker.sock
如果您想在单个特定节点上运行您的作业,您可以使用POD规范中的节点选择器
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: test
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: test
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
nodeSelector:
name: node3
理想情况下,daemon set 应该可以解决您的问题,因为它会在集群中的每个可用节点上创建 POD。
您可以在此处阅读有关亲和力的更多信息: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/
nodeSelector提供了一种非常简单的方法来将 pod 约束到具有特定标签的节点。 亲和/反亲和功能,极大地扩展了您可以表达的约束类型。 主要增强功能是
亲和/反亲和语言更具表现力。 除了使用逻辑 AND 操作创建的精确匹配之外,该语言还提供更多匹配规则;
您可以在作业 YAML 中使用亲和力,例如
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/e2e-az-name
operator: In
values:
- e2e-az1
- e2e-az2
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: another-node-label-key
operator: In
values:
- another-node-label-value
containers:
- name: with-node-affinity
image: k8s.gcr.io/pause:2.0
更新
现在,如果您对与 Job 的 Deamon 亲和性有问题,那也是无用的,因为 Job 将创建 Single POD,它将根据亲和性将计划安排到单个节点。 要么创建 100 个具有不同关联规则的作业,要么使用Deployment + Affinity 在不同节点上调度副本。
我们将创建一个具有POD 亲和性的部署,并确保单个部署的多个POD 不会被安排在一个节点上。
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deployment
labels:
app: test
spec:
replicas: 100
selector:
matchLabels:
app: test
template:
metadata:
labels:
app: test
spec:
containers:
- name: test
image: <Image>
ports:
- containerPort: 80
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: "app"
operator: In
values:
- test
topologyKey: "kubernetes.io/hostname"
尝试使用此部署模板并在此处替换您的图像。 您可以先将副本减少到10 个而不是100 个,以检查它是否正在传播 POD。
额外:
您还可以编写和使用您的自定义 CRD: https://github.com/darkowlzz/daemonset-job ,它将充当守护程序集和作业
另外,我尝试使用 daemonset 来解决问题,但事实证明它只能删除部分节点而不是所有节点的图像
您需要在什么时间点清理图像? DaemonSet pod 是在节点创建时创建的。 是否有可能在您创建 DaemonSet 时,它会清理已经运行的节点中的图像。 但是在新节点中,创建 DaemonSet pod 时镜像不存在?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.